diff options
-rw-r--r-- | components/layout_thread/dom_wrapper.rs | 19 |
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)) } |