mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
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.
This commit is contained in:
parent
ea39b878ac
commit
4a2c4b65cc
1 changed files with 19 additions and 24 deletions
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue