diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index 10584da564f..ddb899b9db5 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -102,12 +102,24 @@ pub trait LayoutNode<'ln> : Sized + Copy + Clone { fn dump(self); - fn traverse_preorder(self) -> LayoutTreeIterator<'ln, Self>; + fn traverse_preorder(self) -> LayoutTreeIterator<'ln, Self> { + LayoutTreeIterator::new(self) + } /// Returns an iterator over this node's children. - fn children(self) -> LayoutNodeChildrenIterator<'ln, Self>; + fn children(self) -> LayoutNodeChildrenIterator<'ln, Self> { + LayoutNodeChildrenIterator { + current: self.first_child(), + phantom: PhantomData, + } + } - fn rev_children(self) -> LayoutNodeReverseChildrenIterator<'ln, Self>; + fn rev_children(self) -> LayoutNodeReverseChildrenIterator<'ln, Self> { + LayoutNodeReverseChildrenIterator { + current: self.last_child(), + phantom: PhantomData, + } + } /// Converts self into an `OpaqueNode`. fn opaque(&self) -> OpaqueNode; @@ -323,24 +335,6 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> { self.dump_indent(0); } - fn traverse_preorder(self) -> LayoutTreeIterator<'ln, Self> { - LayoutTreeIterator::new(self) - } - - fn children(self) -> LayoutNodeChildrenIterator<'ln, Self> { - LayoutNodeChildrenIterator { - current: self.first_child(), - phantom: PhantomData, - } - } - - fn rev_children(self) -> LayoutNodeReverseChildrenIterator<'ln, Self> { - LayoutNodeReverseChildrenIterator { - current: self.last_child(), - phantom: PhantomData, - } - } - fn opaque(&self) -> OpaqueNode { OpaqueNodeMethods::from_jsmanaged(unsafe { self.get_jsmanaged() }) } @@ -844,6 +838,10 @@ pub trait ThreadSafeLayoutNode<'ln> : Clone + Copy + Sized { type ConcreteThreadSafeLayoutElement: ThreadSafeLayoutElement<'ln, ConcreteThreadSafeLayoutNode = Self>; type ChildrenIterator: Iterator + Sized; + /// Creates a new `ThreadSafeLayoutNode` for the same `LayoutNode` + /// with a different pseudo-element type. + fn with_pseudo(&self, pseudo: PseudoElementType) -> Self; + /// Converts self into an `OpaqueNode`. fn opaque(&self) -> OpaqueNode; @@ -866,10 +864,22 @@ pub trait ThreadSafeLayoutNode<'ln> : Clone + Copy + Sized { fn get_pseudo_element_type(&self) -> PseudoElementType; #[inline] - fn get_before_pseudo(&self) -> Option; + fn get_before_pseudo(&self) -> Option { + let layout_data_ref = self.borrow_layout_data(); + let node_layout_data_wrapper = layout_data_ref.as_ref().unwrap(); + node_layout_data_wrapper.data.before_style.as_ref().map(|style| { + self.with_pseudo(PseudoElementType::Before(style.get_box().display)) + }) + } #[inline] - fn get_after_pseudo(&self) -> Option; + fn get_after_pseudo(&self) -> Option { + let layout_data_ref = self.borrow_layout_data(); + let node_layout_data_wrapper = layout_data_ref.as_ref().unwrap(); + node_layout_data_wrapper.data.after_style.as_ref().map(|style| { + self.with_pseudo(PseudoElementType::After(style.get_box().display)) + }) + } /// Borrows the layout data immutably. Fails on a conflicting borrow. /// @@ -1034,15 +1044,6 @@ impl<'ln> ServoThreadSafeLayoutNode<'ln> { } } - /// Creates a new `ServoThreadSafeLayoutNode` for the same `LayoutNode` - /// with a different pseudo-element type. - fn with_pseudo(&self, pseudo: PseudoElementType) -> ServoThreadSafeLayoutNode<'ln> { - ServoThreadSafeLayoutNode { - node: self.node.clone(), - pseudo: pseudo, - } - } - /// Returns the interior of this node as a `LayoutJS`. This is highly unsafe for layout to /// call and as such is marked `unsafe`. unsafe fn get_jsmanaged(&self) -> &LayoutJS { @@ -1062,6 +1063,13 @@ impl<'ln> ThreadSafeLayoutNode<'ln> for ServoThreadSafeLayoutNode<'ln> { type ConcreteThreadSafeLayoutElement = ServoThreadSafeLayoutElement<'ln>; type ChildrenIterator = ThreadSafeLayoutNodeChildrenIterator<'ln, Self>; + fn with_pseudo(&self, pseudo: PseudoElementType) -> ServoThreadSafeLayoutNode<'ln> { + ServoThreadSafeLayoutNode { + node: self.node.clone(), + pseudo: pseudo, + } + } + fn opaque(&self) -> OpaqueNode { OpaqueNodeMethods::from_jsmanaged(unsafe { self.get_jsmanaged() }) } @@ -1104,22 +1112,6 @@ impl<'ln> ThreadSafeLayoutNode<'ln> for ServoThreadSafeLayoutNode<'ln> { self.pseudo } - fn get_before_pseudo(&self) -> Option> { - let layout_data_ref = self.borrow_layout_data(); - let node_layout_data_wrapper = layout_data_ref.as_ref().unwrap(); - node_layout_data_wrapper.data.before_style.as_ref().map(|style| { - self.with_pseudo(PseudoElementType::Before(style.get_box().display)) - }) - } - - fn get_after_pseudo(&self) -> Option> { - let layout_data_ref = self.borrow_layout_data(); - let node_layout_data_wrapper = layout_data_ref.as_ref().unwrap(); - node_layout_data_wrapper.data.after_style.as_ref().map(|style| { - self.with_pseudo(PseudoElementType::After(style.get_box().display)) - }) - } - fn borrow_layout_data(&self) -> Ref> { self.node.borrow_layout_data() } @@ -1254,7 +1246,7 @@ pub struct ThreadSafeLayoutNodeChildrenIterator<'ln, ConcreteNode: ThreadSafeLay impl<'ln, ConcreteNode> ThreadSafeLayoutNodeChildrenIterator<'ln, ConcreteNode> where ConcreteNode: DangerousThreadSafeLayoutNode<'ln> { - fn new(parent: ConcreteNode) -> Self { + pub fn new(parent: ConcreteNode) -> Self { let first_child: Option = match parent.get_pseudo_element_type() { PseudoElementType::Normal => { parent.get_before_pseudo().or_else(|| {