aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/document.rs22
-rw-r--r--components/script/dom/element.rs39
-rw-r--r--components/script/script_task.rs8
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) => {