diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 57cee418838..b7aef194096 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -26,6 +26,7 @@ use dom::bindings::global::GlobalRef; use dom::bindings::js::{MutNullableJS, JS, JSRef, LayoutJS, Temporary, TemporaryPushable}; use dom::bindings::js::{OptionalRootable, RootedReference}; use dom::bindings::refcounted::Trusted; +use dom::bindings::trace::RootedVec; use dom::bindings::utils::reflect_dom_object; use dom::bindings::utils::{xml_name_type, validate_and_extract}; use dom::bindings::utils::XMLName::InvalidXMLName; @@ -817,22 +818,23 @@ impl Document { } trait PrivateDocumentHelpers { - fn createNodeList) -> bool>(self, callback: F) -> Temporary; + fn create_node_list) -> bool>(self, callback: F) -> Temporary; fn get_html_element(self) -> Option>; } impl<'a> PrivateDocumentHelpers for JSRef<'a, Document> { - fn createNodeList) -> bool>(self, callback: F) -> Temporary { + fn create_node_list) -> bool>(self, callback: F) -> Temporary { let window = self.window.root(); let document_element = self.GetDocumentElement().root(); - let nodes = match document_element { - None => vec!(), - Some(ref root) => { - let root: JSRef = NodeCast::from_ref(root.r()); - root.traverse_preorder().filter(|&node| callback(node)).collect() + let mut nodes = RootedVec::new(); + if let Some(ref root) = document_element { + for node in NodeCast::from_ref(root.r()).traverse_preorder() { + if callback(node) { + nodes.push(node.unrooted()); + } } }; - NodeList::new_simple_list(window.r(), nodes) + NodeList::new_simple_list(window.r(), &nodes) } fn get_html_element(self) -> Option> { @@ -1255,7 +1257,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-getelementsbyname fn GetElementsByName(self, name: DOMString) -> Temporary { - self.createNodeList(|node| { + self.create_node_list(|node| { let element: JSRef = match ElementCast::to_ref(node) { Some(element) => element, None => return false, diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index e628ee4b2d9..2da771cab64 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -839,13 +839,12 @@ impl<'a> NodeHelpers<'a> for JSRef<'a, Node> { // http://dom.spec.whatwg.org/#dom-parentnode-queryselectorall #[allow(unsafe_code)] fn query_selector_all(self, selectors: DOMString) -> Fallible> { - // Step 1. - unsafe { - self.query_selector_iter(selectors).map(|iter| { - let window = window_from_node(self).root(); - NodeList::new_simple_list(window.r(), iter.collect()) - }) + let mut nodes = RootedVec::new(); + for node in try!(unsafe { self.query_selector_iter(selectors) }) { + nodes.push(node.unrooted()); } + let window = window_from_node(self).root(); + Ok(NodeList::new_simple_list(window.r(), &nodes)) } diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs index 84aa5d6e2ea..8826733cfa6 100644 --- a/components/script/dom/nodelist.rs +++ b/components/script/dom/nodelist.rs @@ -6,6 +6,7 @@ use dom::bindings::codegen::Bindings::NodeListBinding; use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, JSRef, Temporary}; +use dom::bindings::trace::RootedVec; use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::node::{Node, NodeHelpers}; use dom::window::Window; @@ -38,8 +39,8 @@ impl NodeList { GlobalRef::Window(window), NodeListBinding::Wrap) } - pub fn new_simple_list(window: JSRef, elements: Vec>) -> Temporary { - NodeList::new(window, NodeListType::Simple(elements.iter().map(|element| JS::from_rooted(*element)).collect())) + pub fn new_simple_list(window: JSRef, elements: &RootedVec>) -> Temporary { + NodeList::new(window, NodeListType::Simple((**elements).clone())) } pub fn new_child_list(window: JSRef, node: JSRef) -> Temporary {