mirror of
https://github.com/servo/servo.git
synced 2025-08-02 12:10:29 +01:00
Auto merge of #23745 - georgeroman:implement_get_element_property_wd_command, r=jdm
Implement GetElementProperty wd command <!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors <!-- Either: --> - [X] There are tests for these changes <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/23745) <!-- Reviewable:end -->
This commit is contained in:
commit
7ffe65e672
8 changed files with 119 additions and 23 deletions
|
@ -60,7 +60,7 @@ use js::jsapi::{
|
|||
};
|
||||
use js::jsapi::{JS_NewStringCopyN, JS_StringHasLatin1Chars};
|
||||
use js::jsval::{ObjectValue, StringValue, UndefinedValue};
|
||||
use js::rust::wrappers::{JS_GetProperty, JS_IsArrayObject};
|
||||
use js::rust::wrappers::{JS_GetProperty, JS_HasProperty, JS_IsArrayObject};
|
||||
use js::rust::{get_object_class, is_dom_class, is_dom_object, maybe_wrap_value, ToString};
|
||||
use js::rust::{HandleId, HandleObject, HandleValue, MutableHandleValue};
|
||||
use num_traits::Float;
|
||||
|
@ -596,11 +596,18 @@ pub unsafe fn get_property_jsval(
|
|||
Ok(cname) => cname,
|
||||
Err(_) => return Ok(()),
|
||||
};
|
||||
JS_GetProperty(cx, object, cname.as_ptr(), rval);
|
||||
if JS_IsExceptionPending(cx) {
|
||||
return Err(Error::JSFailed);
|
||||
let mut found = false;
|
||||
if JS_HasProperty(cx, object, cname.as_ptr(), &mut found) && found {
|
||||
JS_GetProperty(cx, object, cname.as_ptr(), rval);
|
||||
if JS_IsExceptionPending(cx) {
|
||||
return Err(Error::JSFailed);
|
||||
}
|
||||
Ok(())
|
||||
} else if JS_IsExceptionPending(cx) {
|
||||
Err(Error::JSFailed)
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Get a property from a JS object, and convert it to a Rust value.
|
||||
|
|
|
@ -2157,6 +2157,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)
|
||||
},
|
||||
|
|
|
@ -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;
|
||||
|
@ -710,6 +712,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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue