Rewrite Document::create_collection to work better with createNodeList.

This commit is contained in:
Ms2ger 2014-03-05 12:19:28 +01:00
parent cd1d81e402
commit 7ecc39e9ba

View file

@ -405,8 +405,13 @@ impl Document {
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-getelementsbyname
pub fn GetElementsByName(&self, name: DOMString) -> JS<NodeList> {
self.createNodeList(|elem| {
elem.get().get_attribute(Null, "name").map_default(false, |attr| {
self.createNodeList(|node| {
if !node.is_element() {
return false;
}
let element: JS<Element> = ElementCast::to(node);
element.get().get_attribute(Null, "name").map_default(false, |attr| {
attr.get().value_ref() == name
})
})
@ -451,36 +456,46 @@ impl Document {
self.createHTMLCollection(|elem| "applet" == elem.get().tag_name)
}
pub fn create_collection(&self, callback: |elem: &JS<Element>| -> bool) -> ~[JS<Element>] {
let mut elements = ~[];
pub fn create_collection<T>(&self, callback: |elem: &JS<Node>| -> Option<JS<T>>) -> ~[JS<T>] {
let mut nodes = ~[];
match self.GetDocumentElement() {
None => {},
Some(root) => {
let root: JS<Node> = NodeCast::from(&root);
for child in root.traverse_preorder() {
if child.is_element() {
let elem: JS<Element> = ElementCast::to(&child);
if callback(&elem) {
elements.push(elem);
}
match callback(&child) {
Some(node) => nodes.push(node),
None => (),
}
}
}
}
elements
nodes
}
pub fn createHTMLCollection(&self, callback: |elem: &JS<Element>| -> bool) -> JS<HTMLCollection> {
HTMLCollection::new(&self.window, self.create_collection(callback))
HTMLCollection::new(&self.window, self.create_collection(|node| {
if !node.is_element() {
return None;
}
let element: JS<Element> = ElementCast::to(node);
if !callback(&element) {
return None;
}
Some(element)
}))
}
pub fn createNodeList(&self, callback: |elem: &JS<Element>| -> bool) -> JS<NodeList> {
let elements = self.create_collection(callback);
let nodes = elements.map(|element| {
let node: JS<Node> = NodeCast::from(element);
node
});
NodeList::new_simple_list(&self.window, nodes)
pub fn createNodeList(&self, callback: |node: &JS<Node>| -> bool) -> JS<NodeList> {
NodeList::new_simple_list(&self.window, self.create_collection(|node| {
if !callback(node) {
return None;
}
Some(node.clone())
}))
}
pub fn content_changed(&self) {