From 7ecc39e9ba0e8e73ba4d928a92314758cb56caec Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 5 Mar 2014 12:19:28 +0100 Subject: [PATCH] Rewrite Document::create_collection to work better with createNodeList. --- src/components/script/dom/document.rs | 51 +++++++++++++++++---------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 4f82d70d758..69b18f427e1 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -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 { - 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 = 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| -> bool) -> ~[JS] { - let mut elements = ~[]; + pub fn create_collection(&self, callback: |elem: &JS| -> Option>) -> ~[JS] { + let mut nodes = ~[]; match self.GetDocumentElement() { None => {}, Some(root) => { let root: JS = NodeCast::from(&root); for child in root.traverse_preorder() { - if child.is_element() { - let elem: JS = 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| -> bool) -> JS { - 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 = ElementCast::to(node); + if !callback(&element) { + return None; + } + + Some(element) + })) } - pub fn createNodeList(&self, callback: |elem: &JS| -> bool) -> JS { - let elements = self.create_collection(callback); - let nodes = elements.map(|element| { - let node: JS = NodeCast::from(element); - node - }); - NodeList::new_simple_list(&self.window, nodes) + pub fn createNodeList(&self, callback: |node: &JS| -> bool) -> JS { + NodeList::new_simple_list(&self.window, self.create_collection(|node| { + if !callback(node) { + return None; + } + + Some(node.clone()) + })) } pub fn content_changed(&self) {