aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/treewalker.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/treewalker.rs')
-rw-r--r--components/script/dom/treewalker.rs70
1 files changed, 41 insertions, 29 deletions
diff --git a/components/script/dom/treewalker.rs b/components/script/dom/treewalker.rs
index b578823acd6..d7dab56949d 100644
--- a/components/script/dom/treewalker.rs
+++ b/components/script/dom/treewalker.rs
@@ -119,30 +119,37 @@ impl<'a> TreeWalkerMethods for JSRef<'a, TreeWalker> {
}
}
-type NodeAdvancer<'a> = |node: JSRef<'a, Node>|: 'a -> Option<Temporary<Node>>;
-
-trait PrivateTreeWalkerHelpers<'a> {
- fn traverse_children(self,
- next_child: NodeAdvancer<'a>,
- next_sibling: NodeAdvancer<'a>)
- -> Fallible<Option<Temporary<Node>>>;
- fn traverse_siblings(self,
- next_child: NodeAdvancer<'a>,
- next_sibling: NodeAdvancer<'a>)
- -> Fallible<Option<Temporary<Node>>>;
- fn is_root_node(self, node: JSRef<'a, Node>) -> bool;
- fn is_current_node(self, node: JSRef<'a, Node>) -> bool;
- fn first_following_node_not_following_root(self, node: JSRef<'a, Node>)
+type NodeAdvancer<'a> = Fn(JSRef<'a, Node>) -> Option<Temporary<Node>> + 'a;
+
+trait PrivateTreeWalkerHelpers {
+ fn traverse_children<F, G>(self,
+ next_child: F,
+ next_sibling: G)
+ -> Fallible<Option<Temporary<Node>>>
+ where F: Fn(JSRef<Node>) -> Option<Temporary<Node>>,
+ G: Fn(JSRef<Node>) -> Option<Temporary<Node>>;
+ fn traverse_siblings<F, G>(self,
+ next_child: F,
+ next_sibling: G)
+ -> Fallible<Option<Temporary<Node>>>
+ where F: Fn(JSRef<Node>) -> Option<Temporary<Node>>,
+ G: Fn(JSRef<Node>) -> Option<Temporary<Node>>;
+ fn is_root_node(self, node: JSRef<Node>) -> bool;
+ fn is_current_node(self, node: JSRef<Node>) -> bool;
+ fn first_following_node_not_following_root(self, node: JSRef<Node>)
-> Option<Temporary<Node>>;
- fn accept_node(self, node: JSRef<'a, Node>) -> Fallible<u16>;
+ fn accept_node(self, node: JSRef<Node>) -> Fallible<u16>;
}
-impl<'a> PrivateTreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
+impl<'a> PrivateTreeWalkerHelpers for JSRef<'a, TreeWalker> {
// http://dom.spec.whatwg.org/#concept-traverse-children
- fn traverse_children(self,
- next_child: NodeAdvancer<'a>,
- next_sibling: NodeAdvancer<'a>)
- -> Fallible<Option<Temporary<Node>>> {
+ fn traverse_children<F, G>(self,
+ next_child: F,
+ next_sibling: G)
+ -> Fallible<Option<Temporary<Node>>>
+ where F: Fn(JSRef<Node>) -> Option<Temporary<Node>>,
+ G: Fn(JSRef<Node>) -> Option<Temporary<Node>>
+ {
// "To **traverse children** of type *type*, run these steps:"
// "1. Let node be the value of the currentNode attribute."
// "2. Set node to node's first child if type is first, and node's last child if type is last."
@@ -218,10 +225,13 @@ impl<'a> PrivateTreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
}
// http://dom.spec.whatwg.org/#concept-traverse-siblings
- fn traverse_siblings(self,
- next_child: NodeAdvancer<'a>,
- next_sibling: NodeAdvancer<'a>)
- -> Fallible<Option<Temporary<Node>>> {
+ fn traverse_siblings<F, G>(self,
+ next_child: F,
+ next_sibling: G)
+ -> Fallible<Option<Temporary<Node>>>
+ where F: Fn(JSRef<Node>) -> Option<Temporary<Node>>,
+ G: Fn(JSRef<Node>) -> Option<Temporary<Node>>
+ {
// "To **traverse siblings** of type *type* run these steps:"
// "1. Let node be the value of the currentNode attribute."
let mut node = self.current_node.get().root().clone();
@@ -282,7 +292,7 @@ impl<'a> PrivateTreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
}
// http://dom.spec.whatwg.org/#concept-tree-following
- fn first_following_node_not_following_root(self, node: JSRef<'a, Node>)
+ fn first_following_node_not_following_root(self, node: JSRef<Node>)
-> Option<Temporary<Node>> {
// "An object A is following an object B if A and B are in the same tree
// and A comes after B in tree order."
@@ -309,7 +319,7 @@ impl<'a> PrivateTreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
}
// http://dom.spec.whatwg.org/#concept-node-filter
- fn accept_node(self, node: JSRef<'a, Node>) -> Fallible<u16> {
+ fn accept_node(self, node: JSRef<Node>) -> Fallible<u16> {
// "To filter node run these steps:"
// "1. Let n be node's nodeType attribute value minus 1."
let n: uint = node.NodeType() as uint - 1;
@@ -329,11 +339,11 @@ impl<'a> PrivateTreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
}
}
- fn is_root_node(self, node: JSRef<'a, Node>) -> bool {
+ fn is_root_node(self, node: JSRef<Node>) -> bool {
JS::from_rooted(node) == self.root_node
}
- fn is_current_node(self, node: JSRef<'a, Node>) -> bool {
+ fn is_current_node(self, node: JSRef<Node>) -> bool {
JS::from_rooted(node) == self.current_node.get()
}
}
@@ -526,7 +536,9 @@ impl<'a> TreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
}
}
-impl<'a> Iterator<JSRef<'a, Node>> for JSRef<'a, TreeWalker> {
+impl<'a> Iterator for JSRef<'a, TreeWalker> {
+ type Item = JSRef<'a, Node>;
+
fn next(&mut self) -> Option<JSRef<'a, Node>> {
match self.next_node() {
Ok(node) => node.map(|n| n.root().clone()),