diff --git a/components/script_layout_interface/wrapper_traits.rs b/components/script_layout_interface/wrapper_traits.rs index bc64480b424..3c603e83396 100644 --- a/components/script_layout_interface/wrapper_traits.rs +++ b/components/script_layout_interface/wrapper_traits.rs @@ -80,8 +80,61 @@ pub trait LayoutNode: TNode { fn init_style_and_layout_data(&self, data: OpaqueStyleAndLayoutData); fn get_style_and_layout_data(&self) -> Option; + + fn rev_children(self) -> ReverseChildrenIterator { + ReverseChildrenIterator { + current: self.last_child(), + } + } + + fn traverse_preorder(self) -> TreeIterator { + TreeIterator::new(self) + } } +pub struct ReverseChildrenIterator where ConcreteNode: TNode { + current: Option, +} + +impl Iterator for ReverseChildrenIterator + where ConcreteNode: TNode { + type Item = ConcreteNode; + fn next(&mut self) -> Option { + let node = self.current; + self.current = node.and_then(|node| node.prev_sibling()); + node + } +} + +pub struct TreeIterator where ConcreteNode: TNode { + stack: Vec, +} + +impl TreeIterator where ConcreteNode: LayoutNode { + fn new(root: ConcreteNode) -> TreeIterator { + let mut stack = vec![]; + stack.push(root); + TreeIterator { + stack: stack, + } + } + + pub fn next_skipping_children(&mut self) -> Option { + self.stack.pop() + } +} + +impl Iterator for TreeIterator + where ConcreteNode: LayoutNode { + type Item = ConcreteNode; + fn next(&mut self) -> Option { + let ret = self.stack.pop(); + ret.map(|node| self.stack.extend(node.rev_children())); + ret + } +} + + /// A thread-safe version of `LayoutNode`, used during flow construction. This type of layout /// node does not allow any parents or siblings of nodes to be accessed, to avoid races. pub trait ThreadSafeLayoutNode: Clone + Copy + Sized + PartialEq { diff --git a/components/style/dom.rs b/components/style/dom.rs index 3b0940c59ef..feae36d8ebf 100644 --- a/components/style/dom.rs +++ b/components/style/dom.rs @@ -83,10 +83,6 @@ pub trait TNode : Sized + Copy + Clone { fn dump_style(self); - fn traverse_preorder(self) -> TreeIterator { - TreeIterator::new(self) - } - /// Returns an iterator over this node's children. fn children(self) -> ChildrenIterator { ChildrenIterator { @@ -94,12 +90,6 @@ pub trait TNode : Sized + Copy + Clone { } } - fn rev_children(self) -> ReverseChildrenIterator { - ReverseChildrenIterator { - current: self.last_child(), - } - } - /// Converts self into an `OpaqueNode`. fn opaque(&self) -> OpaqueNode; @@ -255,34 +245,6 @@ pub trait TElement : PartialEq + Debug + Sized + Copy + Clone + ElementExt + Pre } } -pub struct TreeIterator where ConcreteNode: TNode { - stack: Vec, -} - -impl TreeIterator where ConcreteNode: TNode { - fn new(root: ConcreteNode) -> TreeIterator { - let mut stack = vec![]; - stack.push(root); - TreeIterator { - stack: stack, - } - } - - pub fn next_skipping_children(&mut self) -> Option { - self.stack.pop() - } -} - -impl Iterator for TreeIterator - where ConcreteNode: TNode { - type Item = ConcreteNode; - fn next(&mut self) -> Option { - let ret = self.stack.pop(); - ret.map(|node| self.stack.extend(node.rev_children())); - ret - } -} - pub struct ChildrenIterator where ConcreteNode: TNode { current: Option, } @@ -296,17 +258,3 @@ impl Iterator for ChildrenIterator node } } - -pub struct ReverseChildrenIterator where ConcreteNode: TNode { - current: Option, -} - -impl Iterator for ReverseChildrenIterator - where ConcreteNode: TNode { - type Item = ConcreteNode; - fn next(&mut self) -> Option { - let node = self.current; - self.current = node.and_then(|node| node.prev_sibling()); - node - } -}