diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2015-07-23 17:38:49 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2015-07-23 20:56:27 +0200 |
commit | 389a9ff643b714c6c8ba01fd8f1d208773dccb7a (patch) | |
tree | 3436437e0147c864c5e1aa23fee4c06732731c10 /components/script | |
parent | 658c3d05ae72b52e543342c7a33d37a345eb4374 (diff) | |
download | servo-389a9ff643b714c6c8ba01fd8f1d208773dccb7a.tar.gz servo-389a9ff643b714c6c8ba01fd8f1d208773dccb7a.zip |
Introduce RootedVec<JS<T>>::r()
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/bindings/trace.rs | 8 | ||||
-rw-r--r-- | components/script/dom/document.rs | 12 | ||||
-rw-r--r-- | components/script/dom/element.rs | 6 | ||||
-rw-r--r-- | components/script/dom/eventdispatcher.rs | 18 |
4 files changed, 24 insertions, 20 deletions
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 079f1ecbafc..49c7018dbd6 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -70,6 +70,7 @@ use std::collections::hash_state::HashState; use std::ffi::CString; use std::hash::{Hash, Hasher}; use std::intrinsics::return_address; +use std::mem; use std::ops::{Deref, DerefMut}; use std::rc::Rc; use std::sync::Arc; @@ -482,6 +483,13 @@ impl<T: JSTraceable + Reflectable> RootedVec<T> { } } +impl<T: JSTraceable + Reflectable> RootedVec<JS<T>> { + /// Obtain a safe slice of references that can't outlive that RootedVec. + pub fn r(&self) -> &[&T] { + unsafe { mem::transmute(&*self.v) } + } +} + impl<T: JSTraceable + Reflectable> Drop for RootedVec<T> { fn drop(&mut self) { RootedTraceableSet::remove(self); diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index d074dca0d4e..0e494b79a89 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -733,15 +733,13 @@ impl<'a> DocumentHelpers<'a> for &'a Document { // Set hover state for any elements in the current mouse over list. // Check if any of them changed state to determine whether to // force a reflow below. - for target in mouse_over_targets.iter() { - let target = target.root(); - let target_ref = target.r(); - if !target_ref.get_hover_state() { - target_ref.set_hover_state(true); + for target in mouse_over_targets.r() { + if !target.get_hover_state() { + target.set_hover_state(true); - let target = EventTargetCast::from_ref(target_ref); + let target = EventTargetCast::from_ref(*target); - self.fire_mouse_event(point, &target, "mouseover".to_owned()); + self.fire_mouse_event(point, target, "mouseover".to_owned()); } } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 5e86a33c698..83abd6c0e01 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -865,9 +865,9 @@ impl<'a> AttributeHandlers for &'a Element { fn get_attribute(self, namespace: &Namespace, local_name: &Atom) -> Option<Root<Attr>> { let mut attributes = RootedVec::new(); self.get_attributes(local_name, &mut attributes); - attributes.iter() - .map(|attr| attr.root()) - .find(|attr| attr.r().namespace() == namespace) + attributes.r().iter() + .find(|attr| attr.namespace() == namespace) + .map(|attr| Root::from_ref(*attr)) } // https://dom.spec.whatwg.org/#concept-element-attributes-get-by-name diff --git a/components/script/dom/eventdispatcher.rs b/components/script/dom/eventdispatcher.rs index 8633f63df7c..0c6c7e14b18 100644 --- a/components/script/dom/eventdispatcher.rs +++ b/components/script/dom/eventdispatcher.rs @@ -41,14 +41,13 @@ pub fn dispatch_event<'a, 'b>(target: &'a EventTarget, //FIXME: The "callback this value" should be currentTarget /* capturing */ - for cur_target in chain.iter().rev() { - let cur_target = cur_target.root(); - let stopped = match cur_target.r().get_listeners_for(&type_, ListenerPhase::Capturing) { + for cur_target in chain.r().iter().rev() { + let stopped = match cur_target.get_listeners_for(&type_, ListenerPhase::Capturing) { Some(listeners) => { - event.set_current_target(cur_target.r()); + event.set_current_target(cur_target); for listener in listeners.iter() { // Explicitly drop any exception on the floor. - let _ = listener.HandleEvent_(cur_target.r(), event, Report); + let _ = listener.HandleEvent_(*cur_target, event, Report); if event.stop_immediate() { break; @@ -87,14 +86,13 @@ pub fn dispatch_event<'a, 'b>(target: &'a EventTarget, if event.bubbles() && !event.stop_propagation() { event.set_phase(EventPhase::Bubbling); - for cur_target in chain.iter() { - let cur_target = cur_target.root(); - let stopped = match cur_target.r().get_listeners_for(&type_, ListenerPhase::Bubbling) { + for cur_target in chain.r() { + let stopped = match cur_target.get_listeners_for(&type_, ListenerPhase::Bubbling) { Some(listeners) => { - event.set_current_target(cur_target.r()); + event.set_current_target(cur_target); for listener in listeners.iter() { // Explicitly drop any exception on the floor. - let _ = listener.HandleEvent_(cur_target.r(), event, Report); + let _ = listener.HandleEvent_(*cur_target, event, Report); if event.stop_immediate() { break; |