diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 19901c43796..f331eb26a07 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1028,17 +1028,11 @@ trait PrivateDocumentHelpers { impl<'a> PrivateDocumentHelpers for JSRef<'a, Document> { fn create_node_list) -> bool>(self, callback: F) -> Temporary { let window = self.window.root(); - let document_element = self.GetDocumentElement().root(); - let mut nodes = RootedVec::new(); - if let Some(ref root) = document_element { - for node in NodeCast::from_ref(root.r()).traverse_preorder() { - let node = node.root(); - if callback(node.r()) { - nodes.push(JS::from_rooted(node.r())); - } - } - }; - NodeList::new_simple_list(window.r(), &nodes) + let doc = self.GetDocumentElement().root(); + let maybe_node = doc.r().map(NodeCast::from_ref); + let iter = maybe_node.iter().flat_map(|node| node.traverse_preorder()) + .filter(|node| callback(node.root().r())); + NodeList::new_simple_list(window.r(), iter) } fn get_html_element(self) -> Option> { diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index f7401c99b11..72e385cdfac 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -913,12 +913,9 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { // https://dom.spec.whatwg.org/#dom-parentnode-queryselectorall #[allow(unsafe_code)] fn query_selector_all(self, selectors: DOMString) -> Fallible> { - let mut nodes = RootedVec::new(); - for node in try!(unsafe { self.query_selector_iter(selectors) }) { - nodes.push(JS::from_rooted(node)); - } let window = window_from_node(self).root(); - Ok(NodeList::new_simple_list(window.r(), &nodes)) + let iter = try!(unsafe { self.query_selector_iter(selectors) }); + Ok(NodeList::new_simple_list(window.r(), iter)) } diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs index 66b2cb6c5c4..bb3df75e920 100644 --- a/components/script/dom/nodelist.rs +++ b/components/script/dom/nodelist.rs @@ -6,7 +6,6 @@ use dom::bindings::codegen::Bindings::NodeListBinding; use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, JSRef, Rootable, Temporary}; -use dom::bindings::trace::RootedVec; use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::node::{Node, NodeHelpers}; use dom::window::Window; @@ -39,8 +38,10 @@ impl NodeList { GlobalRef::Window(window), NodeListBinding::Wrap) } - pub fn new_simple_list(window: JSRef, elements: &RootedVec>) -> Temporary { - NodeList::new(window, NodeListType::Simple((**elements).clone())) + pub fn new_simple_list(window: JSRef, iter: T) + -> Temporary + where T: Iterator> { + NodeList::new(window, NodeListType::Simple(iter.map(JS::from_rooted).collect())) } pub fn new_child_list(window: JSRef, node: JSRef) -> Temporary {