diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-01-29 11:00:14 +0100 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-04-26 10:17:46 +0200 |
commit | c48ad0ff7ee8a7573ce5c5e5b015b7f133dbb3a0 (patch) | |
tree | d4b915c093bf179cc418a0ab0199ce4fb207f429 /components/script/dom/node.rs | |
parent | 1b036355ced7cd6b8195970fef07383ba3561c4d (diff) | |
download | servo-c48ad0ff7ee8a7573ce5c5e5b015b7f133dbb3a0.tar.gz servo-c48ad0ff7ee8a7573ce5c5e5b015b7f133dbb3a0.zip |
Introduce concept of composed parent node
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r-- | components/script/dom/node.rs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 1585f81693e..e05bd2b9aa4 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -108,6 +108,9 @@ pub struct Node { /// The parent of this node. parent_node: MutNullableDom<Node>, + /// The parent of this node, ignoring shadow roots. + composed_parent_node: MutNullableDom<Node>, + /// The first child of this node. first_child: MutNullableDom<Node>, @@ -240,6 +243,7 @@ impl Node { /// Fails unless `new_child` is disconnected from the tree. fn add_child(&self, new_child: &Node, before: Option<&Node>) { assert!(new_child.parent_node.get().is_none()); + assert!(new_child.composed_parent_node.get().is_none()); assert!(new_child.prev_sibling.get().is_none()); assert!(new_child.next_sibling.get().is_none()); match before { @@ -275,6 +279,11 @@ impl Node { } new_child.parent_node.set(Some(self)); + if let Some(shadow_root) = self.downcast::<ShadowRoot>() { + new_child.composed_parent_node.set(Some(shadow_root.Host().upcast::<Node>())); + } else { + new_child.composed_parent_node.set(Some(self)); + } self.children_count.set(self.children_count.get() + 1); let parent_in_doc = self.is_in_doc(); @@ -341,6 +350,7 @@ impl Node { child.prev_sibling.set(None); child.next_sibling.set(None); child.parent_node.set(None); + child.composed_parent_node.set(None); self.children_count.set(self.children_count.get() - 1); for node in child.traverse_preorder() { @@ -599,7 +609,7 @@ impl Node { match self.type_id() { NodeTypeId::CharacterData(CharacterDataTypeId::Text(TextTypeId::Text)) => self - .parent_node + .composed_parent_node .get() .unwrap() .downcast::<Element>() @@ -1581,6 +1591,7 @@ impl Node { eventtarget: EventTarget::new_inherited(), parent_node: Default::default(), + composed_parent_node: Default::default(), first_child: Default::default(), last_child: Default::default(), next_sibling: Default::default(), |