diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 13f035f3e3f..b81b0f58e4f 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1045,17 +1045,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/domrectlist.rs b/components/script/dom/domrectlist.rs index a6ad5b50771..fe3a45ecf02 100644 --- a/components/script/dom/domrectlist.rs +++ b/components/script/dom/domrectlist.rs @@ -6,7 +6,6 @@ use dom::bindings::codegen::Bindings::DOMRectListBinding; use dom::bindings::codegen::Bindings::DOMRectListBinding::DOMRectListMethods; 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::domrect::DOMRect; use dom::window::Window; @@ -19,17 +18,17 @@ pub struct DOMRectList { } impl DOMRectList { - fn new_inherited(window: JSRef, - rects: &RootedVec>) -> DOMRectList { + fn new_inherited(window: JSRef, rects: T) -> DOMRectList + where T: Iterator> { DOMRectList { reflector_: Reflector::new(), - rects: (**rects).clone(), + rects: rects.map(JS::from_rooted).collect(), window: JS::from_rooted(window), } } - pub fn new(window: JSRef, - rects: &RootedVec>) -> Temporary { + pub fn new(window: JSRef, rects: T) -> Temporary + where T: Iterator> { reflect_dom_object(box DOMRectList::new_inherited(window, rects), GlobalRef::Window(window), DOMRectListBinding::Wrap) } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 3b830a982d1..e0d0b79f640 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -1301,17 +1301,12 @@ impl<'a> ElementMethods for JSRef<'a, Element> { let win = window_from_node(self).root(); let node: JSRef = NodeCast::from_ref(self); let raw_rects = node.get_content_boxes(); - let mut rects = RootedVec::new(); - for rect in raw_rects.iter() { - let rect = DOMRect::new(win.r(), - rect.origin.y, - rect.origin.y + rect.size.height, - rect.origin.x, - rect.origin.x + rect.size.width); - rects.push(JS::from_rooted(rect)); - } - - DOMRectList::new(win.r(), &rects) + let rects = raw_rects.iter().map(|rect| { + DOMRect::new(win.r(), + rect.origin.y, rect.origin.y + rect.size.height, + rect.origin.x, rect.origin.x + rect.size.width) + }); + DOMRectList::new(win.r(), rects) } // http://dev.w3.org/csswg/cssom-view/#dom-element-getboundingclientrect diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index d9e9ef25b7c..50f4db71f8f 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -917,12 +917,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 { diff --git a/components/script/script_task.rs b/components/script/script_task.rs index bd20c027d79..7df8bef26aa 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -91,6 +91,7 @@ use std::any::Any; use std::borrow::ToOwned; use std::cell::{Cell, RefCell}; use std::collections::HashSet; +use std::mem; use std::option::Option; use std::ptr; use std::rc::Rc; @@ -1395,11 +1396,12 @@ impl ScriptTask { } let page = get_page(&self.root_page(), pipeline_id); let document = page.document().root(); + // We temporarily steal the list of targets over which the mouse is to pass it to + // handle_mouse_move_event() in a safe RootedVec container. let mut mouse_over_targets = RootedVec::new(); - mouse_over_targets.append(&mut *self.mouse_over_targets.borrow_mut()); - + mem::swap(&mut *self.mouse_over_targets.borrow_mut(), &mut *mouse_over_targets); document.r().handle_mouse_move_event(self.js_runtime.rt(), point, &mut mouse_over_targets); - *self.mouse_over_targets.borrow_mut() = mouse_over_targets.clone(); + mem::swap(&mut *self.mouse_over_targets.borrow_mut(), &mut *mouse_over_targets); } KeyEvent(key, state, modifiers) => {