mirror of
https://github.com/servo/servo.git
synced 2025-09-30 00:29:14 +01:00
script: Support decomposing ShadowRoot from mozjs HandleValue
(#38984)
- Add `ShadowRoot` to `JSValue` to avoid `WebDriverJSError::UnknownType`, and `JavaScriptEvaluationError::SerializationError` when execute JS from embedder. - Add unit test. - Move [is_detached](https://w3c.github.io/webdriver/#dfn-is-detached) to `fn is_detached` to be reused. - Other random simplification. Testing: WebDriver conformance tests. --------- Signed-off-by: Euclid Ye <euclid.ye@huawei.com>
This commit is contained in:
parent
5308228436
commit
3ac226e841
12 changed files with 43 additions and 39 deletions
|
@ -617,7 +617,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
|
|||
// Note: the element can pass this check without yet being a custom
|
||||
// element, as long as there is a registered definition
|
||||
// that could upgrade it to one later.
|
||||
let registry = self.owner_document().window().CustomElements();
|
||||
let registry = self.owner_window().CustomElements();
|
||||
let definition = registry.lookup_definition(self.as_element().local_name(), None);
|
||||
|
||||
// Step 3: If definition is null, then throw an "NotSupportedError" DOMException
|
||||
|
|
|
@ -1282,7 +1282,7 @@ impl Node {
|
|||
pub(crate) fn summarize(&self, can_gc: CanGc) -> NodeInfo {
|
||||
let USVString(base_uri) = self.BaseURI();
|
||||
let node_type = self.NodeType();
|
||||
let pipeline = self.owner_document().window().pipeline_id();
|
||||
let pipeline = self.owner_window().pipeline_id();
|
||||
|
||||
let maybe_shadow_root = self.downcast::<ShadowRoot>();
|
||||
let shadow_root_mode = maybe_shadow_root
|
||||
|
|
|
@ -95,6 +95,13 @@ fn is_stale(element: &Element) -> bool {
|
|||
!element.owner_document().is_active() || !element.is_connected()
|
||||
}
|
||||
|
||||
/// <https://w3c.github.io/webdriver/#dfn-is-detached>
|
||||
fn is_detached(shadow_root: &ShadowRoot) -> bool {
|
||||
// A shadow root is detached if its node document is not the active document
|
||||
// or if the element node referred to as its host is stale.
|
||||
!shadow_root.owner_document().is_active() || is_stale(&shadow_root.Host())
|
||||
}
|
||||
|
||||
/// <https://w3c.github.io/webdriver/#dfn-disabled>
|
||||
fn is_disabled(element: &Element) -> bool {
|
||||
// Step 1. If element is an option element or element is an optgroup element
|
||||
|
@ -173,12 +180,7 @@ fn get_known_shadow_root(
|
|||
// A shadow root is detached if its node document is not the active document
|
||||
// or if the element node referred to as its host is stale.
|
||||
let shadow_root = DomRoot::downcast::<ShadowRoot>(node).unwrap();
|
||||
if !shadow_root.owner_document().is_active() {
|
||||
return Err(ErrorStatus::DetachedShadowRoot);
|
||||
}
|
||||
|
||||
let host = shadow_root.Host();
|
||||
if is_stale(&host) {
|
||||
if is_detached(&shadow_root) {
|
||||
return Err(ErrorStatus::DetachedShadowRoot);
|
||||
}
|
||||
// Step 5. Return success with data node.
|
||||
|
@ -396,15 +398,27 @@ unsafe fn jsval_to_webdriver_inner(
|
|||
});
|
||||
let _ac = JSAutoRealm::new(cx, *object);
|
||||
|
||||
// TODO: special handling for ShadowRoot
|
||||
if let Ok(element) = root_from_object::<Element>(*object, cx) {
|
||||
// If the element is stale, return error with error code stale element reference.
|
||||
if is_stale(&element) {
|
||||
Err(WebDriverJSError::StaleElementReference)
|
||||
} else {
|
||||
Ok(JSValue::Element(element.upcast::<Node>().unique_id(
|
||||
element.owner_document().window().pipeline_id(),
|
||||
)))
|
||||
Ok(JSValue::Element(
|
||||
element
|
||||
.upcast::<Node>()
|
||||
.unique_id(element.owner_window().pipeline_id()),
|
||||
))
|
||||
}
|
||||
} else if let Ok(shadow_root) = root_from_object::<ShadowRoot>(*object, cx) {
|
||||
// If the shadow root is detached, return error with error code detached shadow root.
|
||||
if is_detached(&shadow_root) {
|
||||
Err(WebDriverJSError::DetachedShadowRoot)
|
||||
} else {
|
||||
Ok(JSValue::ShadowRoot(
|
||||
shadow_root
|
||||
.upcast::<Node>()
|
||||
.unique_id(shadow_root.owner_window().pipeline_id()),
|
||||
))
|
||||
}
|
||||
} else if let Ok(window) = root_from_object::<Window>(*object, cx) {
|
||||
let window_proxy = window.window_proxy();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue