From 7d5b324bdac227d173d595116219cb8b9cbf1282 Mon Sep 17 00:00:00 2001 From: George Roman Date: Mon, 17 Jun 2019 16:10:38 +0300 Subject: [PATCH 1/4] Implement tag name selector for FindElement WebDriver command --- components/script/script_thread.rs | 8 ++++++ components/script/webdriver_handlers.rs | 19 ++++++++++++++ components/script_traits/webdriver_msg.rs | 1 + components/webdriver_server/lib.rs | 26 ++++++++++++------- .../webdriver/tests/find_element/find.py.ini | 6 ----- 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index ba1741ba321..6263628ea3a 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -2019,6 +2019,14 @@ impl ScriptThread { reply, ) }, + WebDriverScriptCommand::FindElementTagName(selector, reply) => { + webdriver_handlers::handle_find_element_tag_name( + &*documents, + pipeline_id, + selector, + reply, + ) + }, WebDriverScriptCommand::FindElementsCSS(selector, reply) => { webdriver_handlers::handle_find_elements_css( &*documents, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 5574451bd5b..05f02cebe93 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -182,6 +182,25 @@ pub fn handle_find_element_css( reply.send(node_id).unwrap(); } +pub fn handle_find_element_tag_name( + documents: &Documents, + pipeline: PipelineId, + selector: String, + reply: IpcSender, ()>>, +) { + let node_id = documents + .find_document(pipeline) + .ok_or(()) + .and_then(|doc| { + Ok(doc + .GetElementsByTagName(DOMString::from(selector)) + .elements_iter() + .next()) + }) + .map(|node| node.map(|x| x.upcast::().unique_id())); + reply.send(node_id).unwrap(); +} + pub fn handle_find_elements_css( documents: &Documents, pipeline: PipelineId, diff --git a/components/script_traits/webdriver_msg.rs b/components/script_traits/webdriver_msg.rs index 02a2190f0cd..98e99afd14c 100644 --- a/components/script_traits/webdriver_msg.rs +++ b/components/script_traits/webdriver_msg.rs @@ -25,6 +25,7 @@ pub enum WebDriverScriptCommand { ExecuteScript(String, IpcSender), ExecuteAsyncScript(String, IpcSender), FindElementCSS(String, IpcSender, ()>>), + FindElementTagName(String, IpcSender, ()>>), FindElementsCSS(String, IpcSender, ()>>), FindElementElementCSS(String, String, IpcSender, ()>>), FindElementElementsCSS(String, String, IpcSender, ()>>), diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 4df9e0d56b6..b714520c8be 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -804,17 +804,25 @@ impl Handler { &self, parameters: &LocatorParameters, ) -> WebDriverResult { - if parameters.using != LocatorStrategy::CSSSelector { - return Err(WebDriverError::new( - ErrorStatus::UnsupportedOperation, - "Unsupported locator strategy", - )); - } - let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::FindElementCSS(parameters.value.clone(), sender); - self.browsing_context_script_command(cmd)?; + match parameters.using { + LocatorStrategy::CSSSelector => { + let cmd = WebDriverScriptCommand::FindElementCSS(parameters.value.clone(), sender); + self.browsing_context_script_command(cmd)?; + }, + LocatorStrategy::TagName => { + let cmd = + WebDriverScriptCommand::FindElementTagName(parameters.value.clone(), sender); + self.browsing_context_script_command(cmd)?; + }, + _ => { + return Err(WebDriverError::new( + ErrorStatus::UnsupportedOperation, + "Unsupported locator strategy", + )); + }, + } match receiver.recv().unwrap() { Ok(value) => { diff --git a/tests/wpt/metadata/webdriver/tests/find_element/find.py.ini b/tests/wpt/metadata/webdriver/tests/find_element/find.py.ini index e6839484fca..7bdd2a78362 100644 --- a/tests/wpt/metadata/webdriver/tests/find_element/find.py.ini +++ b/tests/wpt/metadata/webdriver/tests/find_element/find.py.ini @@ -11,9 +11,6 @@ [test_find_element_partial_link_text[ partial link text -link\]] expected: FAIL - [test_htmldocument[tag name-html\]] - expected: FAIL - [test_find_element_link_text[link
text
-link\ntext\]] expected: FAIL @@ -62,9 +59,6 @@ [test_find_element_partial_link_text[partial link text-k t\]] expected: FAIL - [test_find_element[tag name-a\]] - expected: FAIL - [test_xhtml_namespace[partial link text-link text\]] expected: FAIL From dec73e4cea93d34736c925d4bd62e57b7d664f6b Mon Sep 17 00:00:00 2001 From: George Roman Date: Mon, 17 Jun 2019 16:35:34 +0300 Subject: [PATCH 2/4] Implement tag name selector for FindElements WebDriver command --- components/script/script_thread.rs | 8 ++++++ components/script/webdriver_handlers.rs | 19 +++++++++++++ components/script_traits/webdriver_msg.rs | 1 + components/webdriver_server/lib.rs | 27 +++++++++++++------ .../webdriver/tests/find_elements/find.py.ini | 6 ----- 5 files changed, 47 insertions(+), 14 deletions(-) diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 6263628ea3a..7b0aa00564c 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -2035,6 +2035,14 @@ impl ScriptThread { reply, ) }, + WebDriverScriptCommand::FindElementsTagName(selector, reply) => { + webdriver_handlers::handle_find_elements_tag_name( + &*documents, + pipeline_id, + selector, + reply, + ) + }, WebDriverScriptCommand::FindElementElementCSS(selector, element_id, reply) => { webdriver_handlers::handle_find_element_element_css( &*documents, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 05f02cebe93..2a5c6179da9 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -223,6 +223,25 @@ pub fn handle_find_elements_css( reply.send(node_ids).unwrap(); } +pub fn handle_find_elements_tag_name( + documents: &Documents, + pipeline: PipelineId, + selector: String, + reply: IpcSender, ()>>, +) { + let node_ids = documents + .find_document(pipeline) + .ok_or(()) + .and_then(|doc| Ok(doc.GetElementsByTagName(DOMString::from(selector)))) + .map(|nodes| { + nodes + .elements_iter() + .map(|x| x.upcast::().unique_id()) + .collect::>() + }); + reply.send(node_ids).unwrap(); +} + pub fn handle_find_element_element_css( documents: &Documents, pipeline: PipelineId, diff --git a/components/script_traits/webdriver_msg.rs b/components/script_traits/webdriver_msg.rs index 98e99afd14c..39d382862bd 100644 --- a/components/script_traits/webdriver_msg.rs +++ b/components/script_traits/webdriver_msg.rs @@ -27,6 +27,7 @@ pub enum WebDriverScriptCommand { FindElementCSS(String, IpcSender, ()>>), FindElementTagName(String, IpcSender, ()>>), FindElementsCSS(String, IpcSender, ()>>), + FindElementsTagName(String, IpcSender, ()>>), FindElementElementCSS(String, String, IpcSender, ()>>), FindElementElementsCSS(String, String, IpcSender, ()>>), FocusElement(String, IpcSender>), diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index b714520c8be..6b91f2d473c 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -902,20 +902,31 @@ impl Handler { Ok(WebDriverResponse::Void) } + // https://w3c.github.io/webdriver/#find-elements fn handle_find_elements( &self, parameters: &LocatorParameters, ) -> WebDriverResult { - if parameters.using != LocatorStrategy::CSSSelector { - return Err(WebDriverError::new( - ErrorStatus::UnsupportedOperation, - "Unsupported locator strategy", - )); + let (sender, receiver) = ipc::channel().unwrap(); + + match parameters.using { + LocatorStrategy::CSSSelector => { + let cmd = WebDriverScriptCommand::FindElementsCSS(parameters.value.clone(), sender); + self.browsing_context_script_command(cmd)?; + }, + LocatorStrategy::TagName => { + let cmd = + WebDriverScriptCommand::FindElementsTagName(parameters.value.clone(), sender); + self.browsing_context_script_command(cmd)?; + }, + _ => { + return Err(WebDriverError::new( + ErrorStatus::UnsupportedOperation, + "Unsupported locator strategy", + )); + }, } - let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::FindElementsCSS(parameters.value.clone(), sender); - self.browsing_context_script_command(cmd)?; match receiver.recv().unwrap() { Ok(value) => { let resp_value: Vec = value diff --git a/tests/wpt/metadata/webdriver/tests/find_elements/find.py.ini b/tests/wpt/metadata/webdriver/tests/find_elements/find.py.ini index a0a124a2b28..27b11b2d6ad 100644 --- a/tests/wpt/metadata/webdriver/tests/find_elements/find.py.ini +++ b/tests/wpt/metadata/webdriver/tests/find_elements/find.py.ini @@ -5,9 +5,6 @@ [test_find_elements_link_text[LINK TEXT-LINK TEXT\]] expected: FAIL - [test_htmldocument[tag name-html\]] - expected: FAIL - [test_find_elements_link_text[link text-link text\]] expected: FAIL @@ -50,9 +47,6 @@ [test_find_elements[xpath-//a\]] expected: FAIL - [test_find_elements[tag name-a\]] - expected: FAIL - [test_find_elements_partial_link_text[partial link text-LINK\]] expected: FAIL From 616a81fb279a95019b321233d1d65ddd467f927d Mon Sep 17 00:00:00 2001 From: George Roman Date: Mon, 17 Jun 2019 17:03:09 +0300 Subject: [PATCH 3/4] Implement tag name selector for FindElementFromElement WebDriver command --- components/script/script_thread.rs | 9 +++++ components/script/webdriver_handlers.rs | 20 ++++++++++ components/script_traits/webdriver_msg.rs | 1 + components/webdriver_server/lib.rs | 37 ++++++++++++------- .../find_element_from_element/find.py.ini | 3 -- 5 files changed, 54 insertions(+), 16 deletions(-) diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 7b0aa00564c..63fadc07b4c 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -2052,6 +2052,15 @@ impl ScriptThread { reply, ) }, + WebDriverScriptCommand::FindElementElementTagName(selector, element_id, reply) => { + webdriver_handlers::handle_find_element_element_tag_name( + &*documents, + pipeline_id, + element_id, + selector, + reply, + ) + }, WebDriverScriptCommand::FindElementElementsCSS(selector, element_id, reply) => { webdriver_handlers::handle_find_element_elements_css( &*documents, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 2a5c6179da9..86771ba8718 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -259,6 +259,26 @@ pub fn handle_find_element_element_css( reply.send(node_id).unwrap(); } +pub fn handle_find_element_element_tag_name( + documents: &Documents, + pipeline: PipelineId, + element_id: String, + selector: String, + reply: IpcSender, ()>>, +) { + let node_id = find_node_by_unique_id(documents, pipeline, element_id) + .ok_or(()) + .and_then(|node| match node.downcast::() { + Some(elem) => Ok(elem + .GetElementsByTagName(DOMString::from(selector)) + .elements_iter() + .next()), + None => Err(()), + }) + .map(|node| node.map(|x| x.upcast::().unique_id())); + reply.send(node_id).unwrap(); +} + pub fn handle_find_element_elements_css( documents: &Documents, pipeline: PipelineId, diff --git a/components/script_traits/webdriver_msg.rs b/components/script_traits/webdriver_msg.rs index 39d382862bd..151c1f98ff5 100644 --- a/components/script_traits/webdriver_msg.rs +++ b/components/script_traits/webdriver_msg.rs @@ -29,6 +29,7 @@ pub enum WebDriverScriptCommand { FindElementsCSS(String, IpcSender, ()>>), FindElementsTagName(String, IpcSender, ()>>), FindElementElementCSS(String, String, IpcSender, ()>>), + FindElementElementTagName(String, String, IpcSender, ()>>), FindElementElementsCSS(String, String, IpcSender, ()>>), FocusElement(String, IpcSender>), GetActiveElement(IpcSender>), diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 6b91f2d473c..86055c715b8 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -950,21 +950,32 @@ impl Handler { element: &WebElement, parameters: &LocatorParameters, ) -> WebDriverResult { - if parameters.using != LocatorStrategy::CSSSelector { - return Err(WebDriverError::new( - ErrorStatus::UnsupportedOperation, - "Unsupported locator strategy", - )); - } - let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::FindElementElementCSS( - parameters.value.clone(), - element.id.clone(), - sender, - ); - self.browsing_context_script_command(cmd)?; + match parameters.using { + LocatorStrategy::CSSSelector => { + let cmd = WebDriverScriptCommand::FindElementElementCSS( + parameters.value.clone(), + element.id.clone(), + sender, + ); + self.browsing_context_script_command(cmd)?; + }, + LocatorStrategy::TagName => { + let cmd = WebDriverScriptCommand::FindElementElementTagName( + parameters.value.clone(), + element.id.clone(), + sender, + ); + self.browsing_context_script_command(cmd)?; + }, + _ => { + return Err(WebDriverError::new( + ErrorStatus::UnsupportedOperation, + "Unsupported locator strategy", + )); + }, + } match receiver.recv().unwrap() { Ok(value) => { diff --git a/tests/wpt/metadata/webdriver/tests/find_element_from_element/find.py.ini b/tests/wpt/metadata/webdriver/tests/find_element_from_element/find.py.ini index 98bed60f561..ab4ed4ee7c9 100644 --- a/tests/wpt/metadata/webdriver/tests/find_element_from_element/find.py.ini +++ b/tests/wpt/metadata/webdriver/tests/find_element_from_element/find.py.ini @@ -62,9 +62,6 @@ [test_find_element_partial_link_text[partial link text-k t\]] expected: FAIL - [test_find_element[tag name-a\]] - expected: FAIL - [test_xhtml_namespace[partial link text-link text\]] expected: FAIL From bf6ea64e8c2b12b57fbb755a81c2de3f3a3c3c83 Mon Sep 17 00:00:00 2001 From: George Roman Date: Mon, 17 Jun 2019 17:43:40 +0300 Subject: [PATCH 4/4] Implement tag name selector for FindElementsFromElement WebDriver command --- components/script/script_thread.rs | 9 ++++ components/script/webdriver_handlers.rs | 26 +++++++++- components/script_traits/webdriver_msg.rs | 3 +- components/webdriver_server/lib.rs | 48 ++++++++++++------- .../find_elements_from_element/find.py.ini | 6 --- 5 files changed, 65 insertions(+), 27 deletions(-) diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 63fadc07b4c..ae18f075b0e 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -2070,6 +2070,15 @@ impl ScriptThread { reply, ) }, + WebDriverScriptCommand::FindElementElementsTagName(selector, element_id, reply) => { + webdriver_handlers::handle_find_element_elements_tag_name( + &*documents, + pipeline_id, + element_id, + selector, + reply, + ) + }, WebDriverScriptCommand::FocusElement(element_id, reply) => { webdriver_handlers::handle_focus_element( &*documents, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 86771ba8718..c960878f60d 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -284,7 +284,7 @@ pub fn handle_find_element_elements_css( pipeline: PipelineId, element_id: String, selector: String, - reply: IpcSender, ()>>, + reply: IpcSender, ()>>, ) { let node_ids = find_node_by_unique_id(documents, pipeline, element_id) .ok_or(()) @@ -295,12 +295,34 @@ pub fn handle_find_element_elements_css( .map(|nodes| { nodes .iter() - .map(|x| Some(x.upcast::().unique_id())) + .map(|x| x.upcast::().unique_id()) .collect() }); reply.send(node_ids).unwrap(); } +pub fn handle_find_element_elements_tag_name( + documents: &Documents, + pipeline: PipelineId, + element_id: String, + selector: String, + reply: IpcSender, ()>>, +) { + let node_ids = find_node_by_unique_id(documents, pipeline, element_id) + .ok_or(()) + .and_then(|node| match node.downcast::() { + Some(elem) => Ok(elem.GetElementsByTagName(DOMString::from(selector))), + None => Err(()), + }) + .map(|nodes| { + nodes + .elements_iter() + .map(|x| x.upcast::().unique_id()) + .collect::>() + }); + reply.send(node_ids).unwrap(); +} + pub fn handle_focus_element( documents: &Documents, pipeline: PipelineId, diff --git a/components/script_traits/webdriver_msg.rs b/components/script_traits/webdriver_msg.rs index 151c1f98ff5..d0b0357309f 100644 --- a/components/script_traits/webdriver_msg.rs +++ b/components/script_traits/webdriver_msg.rs @@ -30,7 +30,8 @@ pub enum WebDriverScriptCommand { FindElementsTagName(String, IpcSender, ()>>), FindElementElementCSS(String, String, IpcSender, ()>>), FindElementElementTagName(String, String, IpcSender, ()>>), - FindElementElementsCSS(String, String, IpcSender, ()>>), + FindElementElementsCSS(String, String, IpcSender, ()>>), + FindElementElementsTagName(String, String, IpcSender, ()>>), FocusElement(String, IpcSender>), GetActiveElement(IpcSender>), GetCookie(String, IpcSender>>>), diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 86055c715b8..d938a5153fb 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -997,34 +997,46 @@ impl Handler { element: &WebElement, parameters: &LocatorParameters, ) -> WebDriverResult { - if parameters.using != LocatorStrategy::CSSSelector { - return Err(WebDriverError::new( - ErrorStatus::UnsupportedOperation, - "Unsupported locator strategy", - )); - } - let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::FindElementElementsCSS( - parameters.value.clone(), - element.id.clone(), - sender, - ); - self.browsing_context_script_command(cmd)?; + match parameters.using { + LocatorStrategy::CSSSelector => { + let cmd = WebDriverScriptCommand::FindElementElementsCSS( + parameters.value.clone(), + element.id.clone(), + sender, + ); + self.browsing_context_script_command(cmd)?; + }, + LocatorStrategy::TagName => { + let cmd = WebDriverScriptCommand::FindElementElementsTagName( + parameters.value.clone(), + element.id.clone(), + sender, + ); + self.browsing_context_script_command(cmd)?; + }, + _ => { + return Err(WebDriverError::new( + ErrorStatus::UnsupportedOperation, + "Unsupported locator strategy", + )); + }, + } match receiver.recv().unwrap() { Ok(value) => { - let value_resp = value + let resp_value: Vec = value .into_iter() .map(|x| serde_json::to_value(WebElement::new(x)).unwrap()) - .collect::>(); - let value_resp = serde_json::Value::Array(value_resp); - Ok(WebDriverResponse::Generic(ValueResponse(value_resp))) + .collect(); + Ok(WebDriverResponse::Generic(ValueResponse( + serde_json::to_value(resp_value)?, + ))) }, Err(_) => Err(WebDriverError::new( ErrorStatus::InvalidSelector, - "Invalid Selector", + "Invalid selector", )), } } diff --git a/tests/wpt/metadata/webdriver/tests/find_elements_from_element/find.py.ini b/tests/wpt/metadata/webdriver/tests/find_elements_from_element/find.py.ini index c3100b33708..52f2c179c81 100644 --- a/tests/wpt/metadata/webdriver/tests/find_elements_from_element/find.py.ini +++ b/tests/wpt/metadata/webdriver/tests/find_elements_from_element/find.py.ini @@ -44,18 +44,12 @@ [test_parent_of_document_node_errors] expected: FAIL - [test_no_element[css selector-#wontExist\]] - expected: FAIL - [test_find_elements_partial_link_text[partial link&text-k&t\]] expected: FAIL [test_find_elements[xpath-//a\]] expected: FAIL - [test_find_elements[tag name-a\]] - expected: FAIL - [test_find_elements_partial_link_text[partial link text-LINK\]] expected: FAIL