From f7258e4fccf9b7f8efc4b3a33203cacfe47d647a Mon Sep 17 00:00:00 2001 From: James Graham Date: Fri, 23 Oct 2015 00:48:55 +0100 Subject: [PATCH] Add support for getting an element's computed style through WebDriver. --- components/msg/webdriver_msg.rs | 1 + components/script/script_task.rs | 2 ++ components/script/webdriver_handlers.rs | 17 +++++++++++++++++ components/webdriver_server/lib.rs | 16 ++++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/components/msg/webdriver_msg.rs b/components/msg/webdriver_msg.rs index 6a537ac70f667..658df1e79e1f2 100644 --- a/components/msg/webdriver_msg.rs +++ b/components/msg/webdriver_msg.rs @@ -16,6 +16,7 @@ pub enum WebDriverScriptCommand { FocusElement(String, IpcSender>), GetActiveElement(IpcSender>), GetElementAttribute(String, String, IpcSender, ()>>), + GetElementCSS(String, String, IpcSender>), GetElementTagName(String, IpcSender>), GetElementText(String, IpcSender>), GetFrameId(WebDriverFrameId, IpcSender, ()>>), diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 043c0574be131..86e1493409c5a 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -1108,6 +1108,8 @@ impl ScriptTask { webdriver_handlers::handle_get_name(&page, pipeline_id, node_id, reply), WebDriverScriptCommand::GetElementAttribute(node_id, name, reply) => webdriver_handlers::handle_get_attribute(&page, pipeline_id, node_id, name, reply), + WebDriverScriptCommand::GetElementCSS(node_id, name, reply) => + webdriver_handlers::handle_get_css(&page, pipeline_id, node_id, name, reply), WebDriverScriptCommand::GetElementText(node_id, reply) => webdriver_handlers::handle_get_text(&page, pipeline_id, node_id, reply), WebDriverScriptCommand::GetFrameId(frame_id, reply) => diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 0bf2ede1aeb66..818ad20abf9e5 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -2,12 +2,14 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::CSSStyleDeclarationMethods; use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; use dom::bindings::codegen::Bindings::HTMLElementBinding::HTMLElementMethods; use dom::bindings::codegen::Bindings::HTMLIFrameElementBinding::HTMLIFrameElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; +use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::conversions::{FromJSValConvertible, StringificationBehavior}; use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; @@ -217,6 +219,21 @@ pub fn handle_get_attribute(page: &Rc, }).unwrap(); } +pub fn handle_get_css(page: &Rc, + pipeline: PipelineId, + node_id: String, + name: String, + reply: IpcSender>) { + reply.send(match find_node_by_unique_id(&*page, pipeline, node_id) { + Some(node) => { + let window = page.window(); + let elem = node.downcast::().unwrap(); + Ok(String::from( + window.GetComputedStyle(&elem, None).GetPropertyValue(DOMString::from(name)))) + }, + None => Err(()) + }).unwrap(); +} pub fn handle_get_url(page: &Rc, _pipeline: PipelineId, diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 2abdb56211487..9bad724d164ad 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -539,6 +539,20 @@ impl Handler { } } + fn handle_element_css(&self, element: &WebElement, name: &String) -> WebDriverResult { + let pipeline_id = try!(self.frame_pipeline()); + + let (sender, receiver) = ipc::channel().unwrap(); + let cmd = WebDriverScriptCommand::GetElementCSS(element.id.clone(), name.clone(), sender); + let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, cmd); + self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + match receiver.recv().unwrap() { + Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse::new(value.to_json()))), + Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference, + "Unable to find element in document")) + } + } + fn handle_set_timeouts(&mut self, parameters: &TimeoutsParameters) -> WebDriverResult { //TODO: this conversion is crazy, spec should limit these to u32 and check upstream let value = parameters.ms as u32; @@ -731,6 +745,8 @@ impl WebDriverHandler for Handler { WebDriverCommand::GetElementTagName(ref element) => self.handle_element_tag_name(element), WebDriverCommand::GetElementAttribute(ref element, ref name) => self.handle_element_attribute(element, name), + WebDriverCommand::GetCSSValue(ref element, ref name) => + self.handle_element_css(element, name), WebDriverCommand::ExecuteScript(ref x) => self.handle_execute_script(x), WebDriverCommand::ExecuteAsyncScript(ref x) => self.handle_execute_async_script(x), WebDriverCommand::ElementSendKeys(ref element, ref keys) =>