diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-05-11 09:57:02 -0500 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-05-11 09:57:02 -0500 |
commit | 8df824998f108d8ef0472bcf6c006b3270e2800e (patch) | |
tree | 74259ecb5513d45c5c0573a289cf763ffc70a304 /components/script/webdriver_handlers.rs | |
parent | 844ac2915eab6573c43e7648cfa94cc2d97fa901 (diff) | |
parent | 9e44206760864da99ff30bd52e70f7da6aad6250 (diff) | |
download | servo-8df824998f108d8ef0472bcf6c006b3270e2800e.tar.gz servo-8df824998f108d8ef0472bcf6c006b3270e2800e.zip |
Auto merge of #5969 - jgraham:webdriver_select_css, r=jdm
Also adds example support for getting the name and text properties of the elements.
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/5969)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/webdriver_handlers.rs')
-rw-r--r-- | components/script/webdriver_handlers.rs | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index f9ff918c60e..da783880989 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -5,8 +5,13 @@ use webdriver_traits::{EvaluateJSReply}; use dom::bindings::conversions::FromJSValConvertible; use dom::bindings::conversions::StringificationBehavior; +use dom::bindings::codegen::InheritTypes::{NodeCast, ElementCast}; use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; -use dom::bindings::js::{OptionalRootable, Rootable}; +use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; +use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; +use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; +use dom::bindings::js::{OptionalRootable, Rootable, Temporary}; +use dom::node::{Node, NodeHelpers}; use dom::window::ScriptHelpers; use dom::document::DocumentHelpers; use page::Page; @@ -16,6 +21,20 @@ use script_task::get_page; use std::rc::Rc; use std::sync::mpsc::Sender; +fn find_node_by_unique_id(page: &Rc<Page>, pipeline: PipelineId, node_id: String) -> Option<Temporary<Node>> { + let page = get_page(&*page, pipeline); + let document = page.document().root(); + let node = NodeCast::from_ref(document.r()); + + for candidate in node.traverse_preorder() { + if candidate.root().r().get_unique_id() == node_id { + return Some(candidate); + } + } + + None +} + pub fn handle_evaluate_js(page: &Rc<Page>, pipeline: PipelineId, eval: String, reply: Sender<Result<EvaluateJSReply, ()>>) { let page = get_page(&*page, pipeline); let window = page.window().root(); @@ -38,6 +57,54 @@ pub fn handle_evaluate_js(page: &Rc<Page>, pipeline: PipelineId, eval: String, r }).unwrap(); } +pub fn handle_find_element_css(page: &Rc<Page>, _pipeline: PipelineId, selector: String, reply: Sender<Result<Option<String>, ()>>) { + reply.send(match page.document().root().r().QuerySelector(selector.clone()) { + Ok(node) => { + let result = node.map(|x| NodeCast::from_ref(x.root().r()).get_unique_id()); + Ok(result) + } + Err(_) => Err(()) + }).unwrap(); +} + +pub fn handle_find_elements_css(page: &Rc<Page>, _pipeline: PipelineId, selector: String, reply: Sender<Result<Vec<String>, ()>>) { + reply.send(match page.document().root().r().QuerySelectorAll(selector.clone()) { + Ok(ref node_list) => { + let nodes = node_list.root(); + let mut result = Vec::with_capacity(nodes.r().Length() as usize); + for i in 0..nodes.r().Length() { + if let Some(ref node) = nodes.r().Item(i) { + result.push(node.root().r().get_unique_id()); + } + } + Ok(result) + }, + Err(_) => { + Err(()) + } + }).unwrap(); +} + pub fn handle_get_title(page: &Rc<Page>, _pipeline: PipelineId, reply: Sender<String>) { reply.send(page.document().root().r().Title()).unwrap(); } + +pub fn handle_get_text(page: &Rc<Page>, pipeline: PipelineId, node_id: String, reply: Sender<Result<String, ()>>) { + reply.send(match find_node_by_unique_id(&*page, pipeline, node_id) { + Some(ref node) => { + Ok(node.root().r().GetTextContent().unwrap_or("".to_owned())) + }, + None => Err(()) + }).unwrap(); +} + +pub fn handle_get_name(page: &Rc<Page>, pipeline: PipelineId, node_id: String, reply: Sender<Result<String, ()>>) { + reply.send(match find_node_by_unique_id(&*page, pipeline, node_id) { + Some(tmp_node) => { + let node = tmp_node.root(); + let element = ElementCast::to_ref(node.r()).unwrap(); + Ok(element.TagName()) + }, + None => Err(()) + }).unwrap(); +} |