diff options
author | Ms2ger <ms2ger@gmail.com> | 2014-12-13 10:34:38 +0100 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2014-12-13 10:34:42 +0100 |
commit | 4a2c4b65ccbe583289bd354607ee88e4f9a09c1a (patch) | |
tree | 685d089a3fb5b1865b0ca1a4e9faab08bf35eb87 /components/script/dom/htmlcollection.rs | |
parent | ea39b878ac619e68907e27c486660dd4bc3fc618 (diff) | |
download | servo-4a2c4b65ccbe583289bd354607ee88e4f9a09c1a.tar.gz servo-4a2c4b65ccbe583289bd354607ee88e4f9a09c1a.zip |
Factor out part of the traversal routine in HTMLCollection.
I would move the filter() call into the traverse function as well, but the
callback can't outlive its stack frame.
Diffstat (limited to 'components/script/dom/htmlcollection.rs')
-rw-r--r-- | components/script/dom/htmlcollection.rs | 43 |
1 files changed, 19 insertions, 24 deletions
diff --git a/components/script/dom/htmlcollection.rs b/components/script/dom/htmlcollection.rs index 91034fd4423..8a95b558793 100644 --- a/components/script/dom/htmlcollection.rs +++ b/components/script/dom/htmlcollection.rs @@ -10,12 +10,13 @@ use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::trace::JSTraceable; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::element::{Element, AttributeHandlers, ElementHelpers}; -use dom::node::{Node, NodeHelpers}; +use dom::node::{Node, NodeHelpers, TreeIterator}; use dom::window::Window; use servo_util::namespace; use servo_util::str::{DOMString, split_html_space_chars}; use std::ascii::AsciiExt; +use std::iter::FilterMap; use string_cache::{Atom, Namespace}; pub trait CollectionFilter : JSTraceable { @@ -171,6 +172,14 @@ impl HTMLCollection { } HTMLCollection::create(window, root, box ElementChildFilter) } + + fn traverse<'a>(root: JSRef<'a, Node>) + -> FilterMap<'a, JSRef<'a, Node>, + JSRef<'a, Element>, + TreeIterator<'a>> { + root.traverse_preorder() + .filter_map(ElementCast::to_ref) + } } impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> { @@ -180,11 +189,9 @@ impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> { Static(ref elems) => elems.len() as u32, Live(ref root, ref filter) => { let root = root.root(); - root.traverse_preorder() - .filter(|&child| { - let elem: Option<JSRef<Element>> = ElementCast::to_ref(child); - elem.map_or(false, |elem| filter.filter(elem, *root)) - }).count() as u32 + HTMLCollection::traverse(*root) + .filter(|element| filter.filter(*element, *root)) + .count() as u32 } } } @@ -198,17 +205,11 @@ impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> { .map(|elem| Temporary::new(elem.clone())), Live(ref root, ref filter) => { let root = root.root(); - root.traverse_preorder() - .filter_map(|node| { - let elem: Option<JSRef<Element>> = ElementCast::to_ref(node); - match elem { - Some(ref elem) if filter.filter(*elem, *root) => Some(elem.clone()), - _ => None - } - }) + HTMLCollection::traverse(*root) + .filter(|element| filter.filter(*element, *root)) .nth(index as uint) .clone() - .map(|elem| Temporary::from_rooted(elem)) + .map(Temporary::from_rooted) } } } @@ -230,18 +231,12 @@ impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> { .map(|maybe_elem| Temporary::from_rooted(*maybe_elem)), Live(ref root, ref filter) => { let root = root.root(); - root.traverse_preorder() - .filter_map(|node| { - let elem: Option<JSRef<Element>> = ElementCast::to_ref(node); - match elem { - Some(ref elem) if filter.filter(*elem, *root) => Some(elem.clone()), - _ => None - } - }) + HTMLCollection::traverse(*root) + .filter(|element| filter.filter(*element, *root)) .find(|elem| { elem.get_string_attribute(&atom!("name")) == key || elem.get_string_attribute(&atom!("id")) == key }) - .map(|maybe_elem| Temporary::from_rooted(maybe_elem)) + .map(Temporary::from_rooted) } } } |