aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlcollection.rs
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-12-13 10:34:38 +0100
committerMs2ger <ms2ger@gmail.com>2014-12-13 10:34:42 +0100
commit4a2c4b65ccbe583289bd354607ee88e4f9a09c1a (patch)
tree685d089a3fb5b1865b0ca1a4e9faab08bf35eb87 /components/script/dom/htmlcollection.rs
parentea39b878ac619e68907e27c486660dd4bc3fc618 (diff)
downloadservo-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.rs43
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)
}
}
}