aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/node.rs
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-01-29 11:00:14 +0100
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-04-26 10:17:46 +0200
commitc48ad0ff7ee8a7573ce5c5e5b015b7f133dbb3a0 (patch)
treed4b915c093bf179cc418a0ab0199ce4fb207f429 /components/script/dom/node.rs
parent1b036355ced7cd6b8195970fef07383ba3561c4d (diff)
downloadservo-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.rs13
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(),