aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/node.rs
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-01-25 13:00:26 +0100
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-04-26 10:17:45 +0200
commit640fc04743e38491e582a6ba30ded5bebb0a3ebb (patch)
tree7afea3eec1f1638d44968de3cf63e26cc58d8727 /components/script/dom/node.rs
parent48975840dd3a4becfc5ee6adccabd303e06fc554 (diff)
downloadservo-640fc04743e38491e582a6ba30ded5bebb0a3ebb.tar.gz
servo-640fc04743e38491e582a6ba30ded5bebb0a3ebb.zip
Implement shadow-including root, set node as in doc when connected. Makes JS work in shadow trees
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r--components/script/dom/node.rs30
1 files changed, 24 insertions, 6 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 4aa6f390b16..d27b6fad873 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -10,9 +10,12 @@ use crate::dom::bindings::codegen::Bindings::CharacterDataBinding::CharacterData
use crate::dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
use crate::dom::bindings::codegen::Bindings::ElementBinding::ElementMethods;
use crate::dom::bindings::codegen::Bindings::HTMLCollectionBinding::HTMLCollectionMethods;
-use crate::dom::bindings::codegen::Bindings::NodeBinding::{NodeConstants, NodeMethods};
+use crate::dom::bindings::codegen::Bindings::NodeBinding::{
+ GetRootNodeOptions, NodeConstants, NodeMethods,
+};
use crate::dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods;
use crate::dom::bindings::codegen::Bindings::ProcessingInstructionBinding::ProcessingInstructionMethods;
+use crate::dom::bindings::codegen::Bindings::ShadowRootBinding::ShadowRootBinding::ShadowRootMethods;
use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use crate::dom::bindings::codegen::InheritTypes::DocumentFragmentTypeId;
use crate::dom::bindings::codegen::UnionTypes::NodeOrString;
@@ -274,14 +277,23 @@ impl Node {
let parent_in_doc = self.is_in_doc();
let parent_in_shadow_tree = self.is_in_shadow_tree();
for node in new_child.traverse_preorder() {
- node.set_flag(NodeFlags::IS_IN_DOC, parent_in_doc);
- node.set_flag(NodeFlags::IS_IN_SHADOW_TREE, parent_in_shadow_tree);
if parent_in_shadow_tree {
- node.set_owner_shadow_root(&*self.owner_shadow_root());
+ if let Some(shadow_root) = self.downcast::<ShadowRoot>() {
+ node.set_owner_shadow_root(&*shadow_root);
+ } else {
+ node.set_owner_shadow_root(&*self.owner_shadow_root());
+ }
}
+ let is_connected = if let Some(element) = node.downcast::<Element>() {
+ element.is_connected()
+ } else {
+ false
+ };
+ node.set_flag(NodeFlags::IS_IN_DOC, parent_in_doc || is_connected);
+ node.set_flag(NodeFlags::IS_IN_SHADOW_TREE, parent_in_shadow_tree);
// 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(parent_in_doc);
+ vtable_for(&&*node).bind_to_tree(is_connected);
}
}
@@ -2163,7 +2175,13 @@ impl NodeMethods for Node {
}
// https://dom.spec.whatwg.org/#dom-node-getrootnode
- fn GetRootNode(&self) -> DomRoot<Node> {
+ fn GetRootNode(&self, options: &GetRootNodeOptions) -> DomRoot<Node> {
+ if options.composed {
+ if let Some(shadow_root) = self.owner_shadow_root.get() {
+ // shadow-including root.
+ return shadow_root.Host().upcast::<Node>().GetRootNode(options);
+ }
+ }
self.inclusive_ancestors().last().unwrap()
}