From 81cacdf820761d38cc1c8b145bfe3575b9291bfc Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 19 May 2015 03:00:34 +0200 Subject: [PATCH 1/3] Remove use of RootedVec in NodeList --- components/script/dom/document.rs | 16 +++++----------- components/script/dom/node.rs | 7 ++----- components/script/dom/nodelist.rs | 7 ++++--- 3 files changed, 11 insertions(+), 19 deletions(-) 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 { From 22931145ab12b32886c5a743c2f337700cd7dc6f Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 19 May 2015 03:00:59 +0200 Subject: [PATCH 2/3] Remove use of RootedVec in DOMRectList --- components/script/dom/domrectlist.rs | 11 +++++------ components/script/dom/element.rs | 17 ++++++----------- 2 files changed, 11 insertions(+), 17 deletions(-) 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 f0ff55e2e5b..79bc12da518 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -1243,17 +1243,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 From 178f696df341e12e373217bae2c5673192b89c6e Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 19 May 2015 20:05:28 +0200 Subject: [PATCH 3/3] Optimise use of RootedVec in ScriptTask::handle_event() --- components/script/script_task.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/components/script/script_task.rs b/components/script/script_task.rs index b114819c613..5d26ef23010 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -88,6 +88,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; @@ -1340,11 +1341,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) => {