diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-02-01 16:46:29 +0100 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-04-26 10:17:46 +0200 |
commit | d2e1a3ab33e59bf3debc59d35619f11ff395fa7e (patch) | |
tree | 4313599ad5ecde9814c50c885bb1ef25ca8a7528 | |
parent | 7c9e8aa4cc3131c42a9412e1fa3e4f99b4324763 (diff) | |
download | servo-d2e1a3ab33e59bf3debc59d35619f11ff395fa7e.tar.gz servo-d2e1a3ab33e59bf3debc59d35619f11ff395fa7e.zip |
Adapt traversals for shadow dom
-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)) } |