diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 7a69d4c781f..313ca6111a3 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -14,7 +14,7 @@ use crate::dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods; use crate::dom::bindings::codegen::Bindings::FunctionBinding::Function; use crate::dom::bindings::codegen::Bindings::HTMLTemplateElementBinding::HTMLTemplateElementMethods; -use crate::dom::bindings::codegen::Bindings::NodeBinding::{GetRootNodeOptions, NodeMethods}; +use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::Bindings::ShadowRootBinding::ShadowRootBinding::ShadowRootMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, ScrollToOptions}; @@ -2826,7 +2826,6 @@ impl VirtualMethods for Element { let shadow_root = self.shadow_root.get().unwrap(); doc.unregister_shadow_root(&shadow_root); let shadow_root = shadow_root.upcast::(); - let shadow_root = shadow_root.upcast::(); shadow_root.set_flag(NodeFlags::IS_CONNECTED, false); for node in shadow_root.children() { node.set_flag(NodeFlags::IS_CONNECTED, false); @@ -3333,11 +3332,7 @@ impl Element { /// pub fn is_connected(&self) -> bool { - let node = self.upcast::(); - let mut options = GetRootNodeOptions::empty(); - options.composed = true; // shadow included. - let root = node.GetRootNode(&options); - root.is::() + self.upcast::().is_connected() } // https://html.spec.whatwg.org/multipage/#cannot-navigate diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index f45394d19de..79d838c5292 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -292,6 +292,7 @@ impl Node { let parent_in_doc = self.is_in_doc(); let parent_in_shadow_tree = self.is_in_shadow_tree(); let parent_is_connected = self.is_connected(); + for node in new_child.traverse_preorder(/* shadow including */ false) { if parent_in_shadow_tree { if let Some(shadow_root) = self.downcast::() { @@ -300,18 +301,12 @@ impl Node { node.set_owner_shadow_root(&*shadow_root); } } - let mut is_connected = parent_is_connected; - if !is_connected { - if let Some(element) = node.downcast::() { - is_connected = element.is_connected(); - } - } node.set_flag(NodeFlags::IS_IN_DOC, parent_in_doc); node.set_flag(NodeFlags::IS_IN_SHADOW_TREE, parent_in_shadow_tree); - node.set_flag(NodeFlags::IS_CONNECTED, is_connected); + node.set_flag(NodeFlags::IS_CONNECTED, parent_is_connected); // Out-of-document elements never have the descendants flag set. debug_assert!(!node.get_flag(NodeFlags::HAS_DIRTY_DESCENDANTS)); - vtable_for(&&*node).bind_to_tree(is_connected); + vtable_for(&&*node).bind_to_tree(parent_is_connected); } } @@ -1614,7 +1609,10 @@ impl Node { #[allow(unrooted_must_root)] pub fn new_document_node() -> Node { - Node::new_(NodeFlags::new() | NodeFlags::IS_IN_DOC, None) + Node::new_( + NodeFlags::new() | NodeFlags::IS_IN_DOC | NodeFlags::IS_CONNECTED, + None, + ) } #[allow(unrooted_must_root)] diff --git a/components/script/dom/shadowroot.rs b/components/script/dom/shadowroot.rs index 7f8d0de22f2..b562172dd05 100644 --- a/components/script/dom/shadowroot.rs +++ b/components/script/dom/shadowroot.rs @@ -46,6 +46,10 @@ impl ShadowRoot { document_fragment .upcast::() .set_flag(NodeFlags::IS_IN_SHADOW_TREE, true); + document_fragment.upcast::().set_flag( + NodeFlags::IS_CONNECTED, + host.upcast::().is_connected(), + ); ShadowRoot { document_fragment, document_or_shadow_root: DocumentOrShadowRoot::new(document.window()),