diff options
-rw-r--r-- | components/script/dom/htmlcollection.rs | 22 | ||||
-rw-r--r-- | components/script/dom/node.rs | 27 |
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)) |