aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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))
}