aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorGeorge Roman <george.roman.99@gmail.com>2019-06-18 22:02:27 +0300
committerGeorge Roman <george.roman.99@gmail.com>2019-07-23 23:19:08 +0300
commite34a15c5ef268149daef79376a981108545fa34d (patch)
treec42840e82c17592f598dac82bd7658a11d103576 /components
parentef7b58f0cd02652d2d5c7d626d4a3f9790c080af (diff)
downloadservo-e34a15c5ef268149daef79376a981108545fa34d.tar.gz
servo-e34a15c5ef268149daef79376a981108545fa34d.zip
Implement GetElementProperty WebDriver command
Diffstat (limited to 'components')
-rw-r--r--components/script/script_thread.rs9
-rw-r--r--components/script/webdriver_handlers.rs41
-rw-r--r--components/script_traits/webdriver_msg.rs3
-rw-r--r--components/webdriver_server/lib.rs26
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)
},