diff options
author | George Roman <george.roman.99@gmail.com> | 2019-06-17 17:03:09 +0300 |
---|---|---|
committer | George Roman <george.roman.99@gmail.com> | 2019-07-21 15:56:24 +0300 |
commit | 616a81fb279a95019b321233d1d65ddd467f927d (patch) | |
tree | 81d95febc01545a751746c9344e49a8bdd3b25a5 | |
parent | dec73e4cea93d34736c925d4bd62e57b7d664f6b (diff) | |
download | servo-616a81fb279a95019b321233d1d65ddd467f927d.tar.gz servo-616a81fb279a95019b321233d1d65ddd467f927d.zip |
Implement tag name selector for FindElementFromElement WebDriver command
-rw-r--r-- | components/script/script_thread.rs | 9 | ||||
-rw-r--r-- | components/script/webdriver_handlers.rs | 20 | ||||
-rw-r--r-- | components/script_traits/webdriver_msg.rs | 1 | ||||
-rw-r--r-- | components/webdriver_server/lib.rs | 37 | ||||
-rw-r--r-- | tests/wpt/metadata/webdriver/tests/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<Result<Option<String>, ()>>, +) { + let node_id = find_node_by_unique_id(documents, pipeline, element_id) + .ok_or(()) + .and_then(|node| match node.downcast::<Element>() { + Some(elem) => Ok(elem + .GetElementsByTagName(DOMString::from(selector)) + .elements_iter() + .next()), + None => Err(()), + }) + .map(|node| node.map(|x| x.upcast::<Node>().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<Result<Vec<String>, ()>>), FindElementsTagName(String, IpcSender<Result<Vec<String>, ()>>), FindElementElementCSS(String, String, IpcSender<Result<Option<String>, ()>>), + FindElementElementTagName(String, String, IpcSender<Result<Option<String>, ()>>), FindElementElementsCSS(String, String, IpcSender<Result<Option<String>, ()>>), FocusElement(String, IpcSender<Result<(), ()>>), GetActiveElement(IpcSender<Option<String>>), 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<WebDriverResponse> { - 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[<a href=#>partial link text</a>-k t\]] expected: FAIL - [test_find_element[tag name-a\]] - expected: FAIL - [test_xhtml_namespace[partial link text-link text\]] expected: FAIL |