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/script | |
parent | ef7b58f0cd02652d2d5c7d626d4a3f9790c080af (diff) | |
download | servo-e34a15c5ef268149daef79376a981108545fa34d.tar.gz servo-e34a15c5ef268149daef79376a981108545fa34d.zip |
Implement GetElementProperty WebDriver command
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/script_thread.rs | 9 | ||||
-rw-r--r-- | components/script/webdriver_handlers.rs | 41 |
2 files changed, 49 insertions, 1 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, |