diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/document.rs | 22 | ||||
-rw-r--r-- | components/script/dom/element.rs | 39 | ||||
-rw-r--r-- | components/script/script_task.rs | 8 |
3 files changed, 27 insertions, 42 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 41a5753f4ff..3fc82215167 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -231,7 +231,7 @@ pub trait DocumentHelpers<'a> { fn handle_mouse_move_event(self, js_runtime: *mut JSRuntime, point: Point2D<f32>, - prev_mouse_over_targets: &mut Vec<JS<Node>>); + prev_mouse_over_targets: &mut RootedVec<JS<Node>>); fn set_current_script(self, script: Option<JSRef<HTMLScriptElement>>); fn trigger_mozbrowser_event(self, event: MozBrowserEvent); @@ -562,17 +562,18 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> { fn handle_mouse_move_event(self, js_runtime: *mut JSRuntime, point: Point2D<f32>, - prev_mouse_over_targets: &mut Vec<JS<Node>>) { + prev_mouse_over_targets: &mut RootedVec<JS<Node>>) { // Build a list of elements that are currently under the mouse. let mouse_over_addresses = self.get_nodes_under_mouse(&point); - let mouse_over_targets: Vec<JS<Node>> = mouse_over_addresses.iter() - .filter_map(|node_address| { + let mut mouse_over_targets: RootedVec<JS<Node>> = RootedVec::new(); + for node_address in mouse_over_addresses.iter() { let node = node::from_untrusted_node_address(js_runtime, *node_address); - node.root().r().inclusive_ancestors() - .map(|node| node.root()) - .find(|node| node.r().is_element()) - .map(|node| JS::from_rooted(node.r())) - }).collect(); + mouse_over_targets.push(node.root().r().inclusive_ancestors() + .map(|node| node.root()) + .find(|node| node.r() + .is_element()) + .map(|node| JS::from_rooted(node.r())).unwrap()); + }; // Remove hover from any elements in the previous list that are no longer // under the mouse. @@ -619,7 +620,8 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> { } // Store the current mouse over targets for next frame - *prev_mouse_over_targets = mouse_over_targets; + prev_mouse_over_targets.clear(); + prev_mouse_over_targets.append(&mut *mouse_over_targets); let window = self.window.root(); window.r().reflow(ReflowGoal::ForDisplay, diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 24eda14cab5..88366f591d2 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -171,14 +171,14 @@ pub trait RawLayoutElementHelpers { #[inline] #[allow(unsafe_code)] -unsafe fn get_attr_for_layout<'a>(elem: &'a Element, namespace: &Namespace, name: &Atom) -> Option<&'a JS<Attr>> { +unsafe fn get_attr_for_layout(elem: &Element, namespace: &Namespace, name: &Atom) -> Option<LayoutJS<Attr>> { // cast to point to T in RefCell<T> directly let attrs = elem.attrs.borrow_for_layout(); attrs.iter().find(|attr: & &JS<Attr>| { let attr = attr.to_layout().unsafe_get(); *name == (*attr).local_name_atom_forever() && (*attr).namespace() == namespace - }) + }).map(|attr| attr.to_layout()) } #[allow(unsafe_code)] @@ -187,8 +187,7 @@ impl RawLayoutElementHelpers for Element { unsafe fn get_attr_val_for_layout<'a>(&'a self, namespace: &Namespace, name: &Atom) -> Option<&'a str> { get_attr_for_layout(self, namespace, name).map(|attr| { - let attr = attr.to_layout().unsafe_get(); - (*attr).value_ref_forever() + (*attr.unsafe_get()).value_ref_forever() }) } @@ -208,40 +207,22 @@ impl RawLayoutElementHelpers for Element { #[inline] unsafe fn get_attr_atom_for_layout(&self, namespace: &Namespace, name: &Atom) -> Option<Atom> { - let attrs = self.attrs.borrow_for_layout(); - (*attrs).iter().find(|attr: & &JS<Attr>| { - let attr = attr.to_layout().unsafe_get(); - *name == (*attr).local_name_atom_forever() && - (*attr).namespace() == namespace - }).and_then(|attr| { - let attr = attr.to_layout().unsafe_get(); - (*attr).value_atom_forever() + get_attr_for_layout(self, namespace, name).and_then(|attr| { + (*attr.unsafe_get()).value_atom_forever() }) } #[inline] unsafe fn has_class_for_layout(&self, name: &Atom) -> bool { - let attrs = self.attrs.borrow_for_layout(); - (*attrs).iter().find(|attr: & &JS<Attr>| { - let attr = attr.to_layout().unsafe_get(); - (*attr).local_name_atom_forever() == atom!("class") - }).map_or(false, |attr| { - let attr = attr.to_layout().unsafe_get(); - (*attr).value_tokens_forever().map(|tokens| { - tokens.iter().any(|atom| atom == name) - }) - }.take().unwrap()) + get_attr_for_layout(self, &ns!(""), &atom!("class")).map_or(false, |attr| { + (*attr.unsafe_get()).value_tokens_forever().unwrap().iter().any(|atom| atom == name) + }) } #[inline] unsafe fn get_classes_for_layout(&self) -> Option<&'static [Atom]> { - let attrs = self.attrs.borrow_for_layout(); - (*attrs).iter().find(|attr: & &JS<Attr>| { - let attr = attr.to_layout().unsafe_get(); - (*attr).local_name_atom_forever() == atom!("class") - }).and_then(|attr| { - let attr = attr.to_layout().unsafe_get(); - (*attr).value_tokens_forever() + get_attr_for_layout(self, &ns!(""), &atom!("class")).map(|attr| { + (*attr.unsafe_get()).value_tokens_forever().unwrap() }) } diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 31116307b3c..4956e810d0f 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -28,7 +28,7 @@ use dom::bindings::js::{JS, JSRef, OptionalRootable, RootedReference}; use dom::bindings::js::{RootCollection, RootCollectionPtr}; use dom::bindings::refcounted::{LiveDOMReferences, Trusted, TrustedReference}; use dom::bindings::structuredclone::StructuredCloneData; -use dom::bindings::trace::{JSTraceable, trace_collections}; +use dom::bindings::trace::{JSTraceable, trace_collections, RootedVec}; use dom::bindings::utils::{wrap_for_same_compartment, pre_wrap}; use dom::document::{Document, IsHTMLDocument, DocumentHelpers, DocumentProgressHandler, DocumentProgressTask, DocumentSource}; use dom::element::{Element, AttributeHandlers}; @@ -1243,9 +1243,11 @@ impl ScriptTask { } let page = get_page(&self.root_page(), pipeline_id); let document = page.document().root(); - let mouse_over_targets = &mut *self.mouse_over_targets.borrow_mut(); + let mut mouse_over_targets = RootedVec::new(); + mouse_over_targets.append(&mut *self.mouse_over_targets.borrow_mut()); - document.r().handle_mouse_move_event(self.js_runtime.ptr, point, mouse_over_targets); + document.r().handle_mouse_move_event(self.js_runtime.ptr, point, &mut mouse_over_targets); + *self.mouse_over_targets.borrow_mut() = mouse_over_targets.clone(); } KeyEvent(key, state, modifiers) => { |