diff options
author | George Roman <george.roman.99@gmail.com> | 2019-06-18 22:02:27 +0300 |
---|---|---|
committer | George Roman <george.roman.99@gmail.com> | 2019-07-23 23:19:08 +0300 |
commit | e34a15c5ef268149daef79376a981108545fa34d (patch) | |
tree | c42840e82c17592f598dac82bd7658a11d103576 /components | |
parent | ef7b58f0cd02652d2d5c7d626d4a3f9790c080af (diff) | |
download | servo-e34a15c5ef268149daef79376a981108545fa34d.tar.gz servo-e34a15c5ef268149daef79376a981108545fa34d.zip |
Implement GetElementProperty WebDriver command
Diffstat (limited to 'components')
-rw-r--r-- | components/script/script_thread.rs | 9 | ||||
-rw-r--r-- | components/script/webdriver_handlers.rs | 41 | ||||
-rw-r--r-- | components/script_traits/webdriver_msg.rs | 3 | ||||
-rw-r--r-- | components/webdriver_server/lib.rs | 26 |
4 files changed, 77 insertions, 2 deletions
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index e6d91a1bc2e..482fb0fc7de 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -2013,6 +2013,15 @@ impl ScriptThread { reply, ) }, + WebDriverScriptCommand::GetElementProperty(node_id, name, reply) => { + webdriver_handlers::handle_get_property( + &*documents, + pipeline_id, + node_id, + name, + reply, + ) + }, WebDriverScriptCommand::GetElementCSS(node_id, name, reply) => { webdriver_handlers::handle_get_css(&*documents, pipeline_id, node_id, name, reply) }, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 5574451bd5b..e62706ac387 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -12,9 +12,11 @@ use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use crate::dom::bindings::codegen::Bindings::XMLSerializerBinding::XMLSerializerMethods; use crate::dom::bindings::conversions::{ - ConversionResult, FromJSValConvertible, StringificationBehavior, + get_property_jsval, ConversionResult, FromJSValConvertible, StringificationBehavior, }; +use crate::dom::bindings::error::throw_dom_exception; use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::element::Element; @@ -529,6 +531,43 @@ pub fn handle_get_attribute( .unwrap(); } +#[allow(unsafe_code)] +pub fn handle_get_property( + documents: &Documents, + pipeline: PipelineId, + node_id: String, + name: String, + reply: IpcSender<Result<WebDriverJSValue, ()>>, +) { + reply + .send(match find_node_by_unique_id(documents, pipeline, node_id) { + Some(node) => { + let cx = documents.find_document(pipeline).unwrap().window().get_cx(); + + rooted!(in(cx) let mut property = UndefinedValue()); + match unsafe { + get_property_jsval( + cx, + node.reflector().get_jsobject(), + &name, + property.handle_mut(), + ) + } { + Ok(_) => match unsafe { jsval_to_webdriver(cx, property.handle()) } { + Ok(property) => Ok(property), + Err(_) => Ok(WebDriverJSValue::Undefined), + }, + Err(error) => { + unsafe { throw_dom_exception(cx, &node.reflector().global(), error) }; + Ok(WebDriverJSValue::Undefined) + }, + } + }, + None => Err(()), + }) + .unwrap(); +} + pub fn handle_get_css( documents: &Documents, pipeline: PipelineId, diff --git a/components/script_traits/webdriver_msg.rs b/components/script_traits/webdriver_msg.rs index 02a2190f0cd..8cf586a4fde 100644 --- a/components/script_traits/webdriver_msg.rs +++ b/components/script_traits/webdriver_msg.rs @@ -33,6 +33,7 @@ pub enum WebDriverScriptCommand { GetCookie(String, IpcSender<Vec<Serde<Cookie<'static>>>>), GetCookies(IpcSender<Vec<Serde<Cookie<'static>>>>), GetElementAttribute(String, String, IpcSender<Result<Option<String>, ()>>), + GetElementProperty(String, String, IpcSender<Result<WebDriverJSValue, ()>>), GetElementCSS(String, String, IpcSender<Result<String, ()>>), GetElementRect(String, IpcSender<Result<Rect<f64>, ()>>), GetElementTagName(String, IpcSender<Result<String, ()>>), @@ -51,7 +52,7 @@ pub enum WebDriverCookieError { UnableToSetCookie, } -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, Deserialize, Serialize)] pub enum WebDriverJSValue { Undefined, Null, diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index de9e285037f..0c5ce76c189 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -211,6 +211,7 @@ impl WebDriverExtensionCommand for ServoExtensionCommand { } } +#[derive(Clone)] struct SendableWebDriverJSValue(pub WebDriverJSValue); impl Serialize for SendableWebDriverJSValue { @@ -1087,6 +1088,28 @@ impl Handler { } } + fn handle_element_property( + &self, + element: &WebElement, + name: &str, + ) -> WebDriverResult<WebDriverResponse> { + let (sender, receiver) = ipc::channel().unwrap(); + + let cmd = + WebDriverScriptCommand::GetElementProperty(element.id.clone(), name.to_owned(), sender); + self.browsing_context_script_command(cmd)?; + + match receiver.recv().unwrap() { + Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( + serde_json::to_value(SendableWebDriverJSValue(value))?, + ))), + Err(_) => Err(WebDriverError::new( + ErrorStatus::StaleElementReference, + "Unable to find element in document", + )), + } + } + fn handle_element_css( &self, element: &WebElement, @@ -1510,6 +1533,9 @@ impl WebDriverHandler<ServoExtensionRoute> for Handler { WebDriverCommand::GetElementAttribute(ref element, ref name) => { self.handle_element_attribute(element, name) }, + WebDriverCommand::GetElementProperty(ref element, ref name) => { + self.handle_element_property(element, name) + }, WebDriverCommand::GetCSSValue(ref element, ref name) => { self.handle_element_css(element, name) }, |