aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-02-01 16:46:29 +0100
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-04-26 10:17:46 +0200
commitd2e1a3ab33e59bf3debc59d35619f11ff395fa7e (patch)
tree4313599ad5ecde9814c50c885bb1ef25ca8a7528
parent7c9e8aa4cc3131c42a9412e1fa3e4f99b4324763 (diff)
downloadservo-d2e1a3ab33e59bf3debc59d35619f11ff395fa7e.tar.gz
servo-d2e1a3ab33e59bf3debc59d35619f11ff395fa7e.zip
Adapt traversals for shadow dom
-rw-r--r--components/layout_thread/dom_wrapper.rs19
1 files changed, 17 insertions, 2 deletions
diff --git a/components/layout_thread/dom_wrapper.rs b/components/layout_thread/dom_wrapper.rs
index 6227df9f04c..580965b91d0 100644
--- a/components/layout_thread/dom_wrapper.rs
+++ b/components/layout_thread/dom_wrapper.rs
@@ -263,7 +263,11 @@ impl<'ln> TNode for ServoLayoutNode<'ln> {
}
fn traversal_parent(&self) -> Option<ServoLayoutElement<'ln>> {
- self.parent_element()
+ let parent = self.parent_node()?;
+ if let Some(shadow) = parent.as_shadow_root() {
+ return Some(shadow.host());
+ };
+ parent.as_element()
}
fn opaque(&self) -> OpaqueNode {
@@ -442,7 +446,11 @@ impl<'le> TElement for ServoLayoutElement<'le> {
}
fn traversal_children(&self) -> LayoutIterator<Self::TraversalChildrenIterator> {
- LayoutIterator(self.as_node().dom_children())
+ LayoutIterator(if let Some(shadow) = self.shadow_root() {
+ shadow.as_node().dom_children()
+ } else {
+ self.as_node().dom_children()
+ })
}
fn is_html_element(&self) -> bool {
@@ -1033,6 +1041,13 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> {
}
fn children(&self) -> LayoutIterator<Self::ChildrenIterator> {
+ if let Some(element) = self.node.as_element() {
+ if let Some(shadow) = element.shadow_root() {
+ return LayoutIterator(ThreadSafeLayoutNodeChildrenIterator::new(
+ shadow.as_node().to_threadsafe(),
+ ));
+ }
+ }
LayoutIterator(ThreadSafeLayoutNodeChildrenIterator::new(*self))
}