aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/htmlcollection.rs22
-rw-r--r--components/script/dom/node.rs27
2 files changed, 26 insertions, 23 deletions
diff --git a/components/script/dom/htmlcollection.rs b/components/script/dom/htmlcollection.rs
index 230102bd423..d87230a42dc 100644
--- a/components/script/dom/htmlcollection.rs
+++ b/components/script/dom/htmlcollection.rs
@@ -205,24 +205,24 @@ impl HTMLCollection {
HTMLCollection::create(window, root, box ElementChildFilter)
}
- pub fn elements_iter_after(&self, after: &Node) -> HTMLCollectionElementsIter {
+ pub fn elements_iter_after<'a>(&'a self, after: &'a Node) -> impl Iterator<Item=Root<Element>> + 'a {
// Iterate forwards from a node.
HTMLCollectionElementsIter {
- node_iter: box after.following_nodes(&self.root),
+ node_iter: after.following_nodes(&self.root),
root: Root::from_ref(&self.root),
filter: &self.filter,
}
}
- pub fn elements_iter(&self) -> HTMLCollectionElementsIter {
+ pub fn elements_iter<'a>(&'a self) -> impl Iterator<Item=Root<Element>> + 'a {
// Iterate forwards from the root.
self.elements_iter_after(&*self.root)
}
- pub fn elements_iter_before(&self, before: &Node) -> HTMLCollectionElementsIter {
+ pub fn elements_iter_before<'a>(&'a self, before: &'a Node) -> impl Iterator<Item=Root<Element>> + 'a {
// Iterate backwards from a node.
HTMLCollectionElementsIter {
- node_iter: box before.preceding_nodes(&self.root),
+ node_iter: before.preceding_nodes(&self.root),
root: Root::from_ref(&self.root),
filter: &self.filter,
}
@@ -234,13 +234,13 @@ impl HTMLCollection {
}
// TODO: Make this generic, and avoid code duplication
-pub struct HTMLCollectionElementsIter<'a> {
- node_iter: Box<Iterator<Item = Root<Node>>>,
+struct HTMLCollectionElementsIter<'a, I> {
+ node_iter: I,
root: Root<Node>,
filter: &'a Box<CollectionFilter>,
}
-impl<'a> Iterator for HTMLCollectionElementsIter<'a> {
+impl<'a, I: Iterator<Item=Root<Node>>> Iterator for HTMLCollectionElementsIter<'a, I> {
type Item = Root<Element>;
fn next(&mut self) -> Option<Self::Item> {
@@ -284,13 +284,15 @@ impl HTMLCollectionMethods for HTMLCollection {
// Iterate forwards, starting at the cursor.
let offset = index - (cached_index + 1);
let node: Root<Node> = Root::upcast(element);
- self.set_cached_cursor(index, self.elements_iter_after(&node).nth(offset as usize))
+ let mut iter = self.elements_iter_after(&node);
+ self.set_cached_cursor(index, iter.nth(offset as usize))
} else {
// The cursor is after the element we're looking for
// Iterate backwards, starting at the cursor.
let offset = cached_index - (index + 1);
let node: Root<Node> = Root::upcast(element);
- self.set_cached_cursor(index, self.elements_iter_before(&node).nth(offset as usize))
+ let mut iter = self.elements_iter_before(&node);
+ self.set_cached_cursor(index, iter.nth(offset as usize))
}
} else {
// Cache miss
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 767a3132eb3..8afe20f0aea 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -849,22 +849,23 @@ impl Node {
let tr = new_child();
- let after_node = if index == -1 {
- None
- } else {
- match get_items().elements_iter()
- .map(Root::upcast::<Node>)
- .map(Some)
- .chain(iter::once(None))
- .nth(index as usize) {
- None => return Err(Error::IndexSize),
- Some(node) => node,
- }
- };
{
let tr_node = tr.upcast::<Node>();
- try!(self.InsertBefore(tr_node, after_node.r()));
+ if index == -1 {
+ try!(self.InsertBefore(tr_node, None));
+ } else {
+ let items = get_items();
+ let node = match items.elements_iter()
+ .map(Root::upcast::<Node>)
+ .map(Some)
+ .chain(iter::once(None))
+ .nth(index as usize) {
+ None => return Err(Error::IndexSize),
+ Some(node) => node,
+ };
+ try!(self.InsertBefore(tr_node, node.r()));
+ }
}
Ok(Root::upcast::<HTMLElement>(tr))