diff options
author | Ms2ger <ms2ger@gmail.com> | 2014-06-10 13:45:14 +0200 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2014-06-11 19:51:06 +0200 |
commit | 0b364d13b6f4eeffbaca66559016b44d26581b8f (patch) | |
tree | e3c5bbde22c8e78c3485fb37030a2c8ac34d3e97 /src | |
parent | d255a83a48388c0720cc7e495aac15f9ebcf2a7b (diff) | |
download | servo-0b364d13b6f4eeffbaca66559016b44d26581b8f.tar.gz servo-0b364d13b6f4eeffbaca66559016b44d26581b8f.zip |
Use internal mutability for Event.
Diffstat (limited to 'src')
-rw-r--r-- | src/components/script/dom/customevent.rs | 2 | ||||
-rw-r--r-- | src/components/script/dom/event.rs | 105 | ||||
-rw-r--r-- | src/components/script/dom/eventdispatcher.rs | 52 | ||||
-rw-r--r-- | src/components/script/dom/eventtarget.rs | 10 | ||||
-rw-r--r-- | src/components/script/dom/progressevent.rs | 12 | ||||
-rw-r--r-- | src/components/script/dom/uievent.rs | 2 | ||||
-rw-r--r-- | src/components/script/dom/xmlhttprequest.rs | 14 | ||||
-rw-r--r-- | src/components/script/script_task.rs | 19 |
8 files changed, 105 insertions, 111 deletions
diff --git a/src/components/script/dom/customevent.rs b/src/components/script/dom/customevent.rs index f528f8861f4..4e391cfd06c 100644 --- a/src/components/script/dom/customevent.rs +++ b/src/components/script/dom/customevent.rs @@ -70,7 +70,7 @@ impl<'a> CustomEventMethods for JSRef<'a, CustomEvent> { cancelable: bool, detail: JSVal) { self.detail = Traceable::new(detail); - let event: &mut JSRef<Event> = EventCast::from_mut_ref(self); + let event: &JSRef<Event> = EventCast::from_ref(self); event.InitEvent(type_, can_bubble, cancelable); } } diff --git a/src/components/script/dom/event.rs b/src/components/script/dom/event.rs index 8bb636c0f82..a151aed5026 100644 --- a/src/components/script/dom/event.rs +++ b/src/components/script/dom/event.rs @@ -4,14 +4,15 @@ use dom::bindings::codegen::Bindings::EventBinding; use dom::bindings::codegen::Bindings::EventBinding::EventConstants; +use dom::bindings::error::Fallible; use dom::bindings::js::{JS, JSRef, Temporary}; +use dom::bindings::trace::Untraceable; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; -use dom::bindings::error::Fallible; use dom::eventtarget::EventTarget; use dom::window::Window; use servo_util::str::DOMString; use servo_util::geometry::PagePx; -use std::cell::Cell; +use std::cell::{Cell, RefCell}; use geom::point::Point2D; use geom::size::TypedSize2D; @@ -51,16 +52,16 @@ pub struct Event { pub reflector_: Reflector, pub current_target: Cell<Option<JS<EventTarget>>>, pub target: Cell<Option<JS<EventTarget>>>, - pub type_: DOMString, - pub phase: EventPhase, - pub canceled: bool, - pub stop_propagation: bool, - pub stop_immediate: bool, - pub cancelable: bool, - pub bubbles: bool, - pub trusted: bool, - pub dispatching: bool, - pub initialized: bool, + type_: Untraceable<RefCell<DOMString>>, + pub phase: Untraceable<Cell<EventPhase>>, + pub canceled: Untraceable<Cell<bool>>, + pub stop_propagation: Untraceable<Cell<bool>>, + pub stop_immediate: Untraceable<Cell<bool>>, + pub cancelable: Untraceable<Cell<bool>>, + pub bubbles: Untraceable<Cell<bool>>, + pub trusted: Untraceable<Cell<bool>>, + pub dispatching: Untraceable<Cell<bool>>, + pub initialized: Untraceable<Cell<bool>>, pub timestamp: u64, } @@ -71,16 +72,16 @@ impl Event { reflector_: Reflector::new(), current_target: Cell::new(None), target: Cell::new(None), - phase: PhaseNone, - type_: "".to_string(), - canceled: false, - cancelable: true, - bubbles: false, - trusted: false, - dispatching: false, - stop_propagation: false, - stop_immediate: false, - initialized: false, + phase: Untraceable::new(Cell::new(PhaseNone)), + type_: Untraceable::new(RefCell::new("".to_string())), + canceled: Untraceable::new(Cell::new(false)), + cancelable: Untraceable::new(Cell::new(true)), + bubbles: Untraceable::new(Cell::new(false)), + trusted: Untraceable::new(Cell::new(false)), + dispatching: Untraceable::new(Cell::new(false)), + stop_propagation: Untraceable::new(Cell::new(false)), + stop_immediate: Untraceable::new(Cell::new(false)), + initialized: Untraceable::new(Cell::new(false)), timestamp: time::get_time().sec as u64, } } @@ -95,8 +96,8 @@ impl Event { type_: DOMString, can_bubble: bool, cancelable: bool) -> Temporary<Event> { - let mut event = Event::new_uninitialized(window).root(); - event.InitEvent(type_, can_bubble, cancelable); + let event = Event::new_uninitialized(window).root(); + event.deref().InitEvent(type_, can_bubble, cancelable); Temporary::from_rooted(&*event) } @@ -113,23 +114,23 @@ pub trait EventMethods { fn GetTarget(&self) -> Option<Temporary<EventTarget>>; fn GetCurrentTarget(&self) -> Option<Temporary<EventTarget>>; fn DefaultPrevented(&self) -> bool; - fn PreventDefault(&mut self); - fn StopPropagation(&mut self); - fn StopImmediatePropagation(&mut self); + fn PreventDefault(&self); + fn StopPropagation(&self); + fn StopImmediatePropagation(&self); fn Bubbles(&self) -> bool; fn Cancelable(&self) -> bool; fn TimeStamp(&self) -> u64; - fn InitEvent(&mut self, type_: DOMString, bubbles: bool, cancelable: bool); + fn InitEvent(&self, type_: DOMString, bubbles: bool, cancelable: bool); fn IsTrusted(&self) -> bool; } impl<'a> EventMethods for JSRef<'a, Event> { fn EventPhase(&self) -> u16 { - self.phase as u16 + self.phase.deref().get() as u16 } fn Type(&self) -> DOMString { - self.type_.clone() + self.type_.deref().borrow().clone() } fn GetTarget(&self) -> Option<Temporary<EventTarget>> { @@ -141,56 +142,56 @@ impl<'a> EventMethods for JSRef<'a, Event> { } fn DefaultPrevented(&self) -> bool { - self.canceled + self.canceled.deref().get() } - fn PreventDefault(&mut self) { - if self.cancelable { - self.canceled = true + fn PreventDefault(&self) { + if self.cancelable.deref().get() { + self.canceled.deref().set(true) } } - fn StopPropagation(&mut self) { - self.stop_propagation = true; + fn StopPropagation(&self) { + self.stop_propagation.deref().set(true); } - fn StopImmediatePropagation(&mut self) { - self.stop_immediate = true; - self.stop_propagation = true; + fn StopImmediatePropagation(&self) { + self.stop_immediate.deref().set(true); + self.stop_propagation.deref().set(true); } fn Bubbles(&self) -> bool { - self.bubbles + self.bubbles.deref().get() } fn Cancelable(&self) -> bool { - self.cancelable + self.cancelable.deref().get() } fn TimeStamp(&self) -> u64 { self.timestamp } - fn InitEvent(&mut self, + fn InitEvent(&self, type_: DOMString, bubbles: bool, cancelable: bool) { - self.initialized = true; - if self.dispatching { + self.initialized.deref().set(true); + if self.dispatching.deref().get() { return; } - self.stop_propagation = false; - self.stop_immediate = false; - self.canceled = false; - self.trusted = false; + self.stop_propagation.deref().set(false); + self.stop_immediate.deref().set(false); + self.canceled.deref().set(false); + self.trusted.deref().set(false); self.target.set(None); - self.type_ = type_; - self.bubbles = bubbles; - self.cancelable = cancelable; + *self.type_.deref().borrow_mut() = type_; + self.bubbles.deref().set(bubbles); + self.cancelable.deref().set(cancelable); } fn IsTrusted(&self) -> bool { - self.trusted + self.trusted.deref().get() } } diff --git a/src/components/script/dom/eventdispatcher.rs b/src/components/script/dom/eventdispatcher.rs index 83a716c4c07..6dd3d20213d 100644 --- a/src/components/script/dom/eventdispatcher.rs +++ b/src/components/script/dom/eventdispatcher.rs @@ -13,19 +13,16 @@ use dom::virtualmethods::vtable_for; // See http://dom.spec.whatwg.org/#concept-event-dispatch for the full dispatch algorithm pub fn dispatch_event<'a, 'b>(target: &JSRef<'a, EventTarget>, pseudo_target: Option<JSRef<'b, EventTarget>>, - event: &mut JSRef<Event>) -> bool { - assert!(!event.deref().dispatching); - - { - let event = event.deref_mut(); - event.target.assign(Some(match pseudo_target { - Some(pseudo_target) => pseudo_target, - None => target.clone(), - })); - event.dispatching = true; - } + event: &JSRef<Event>) -> bool { + assert!(!event.deref().dispatching.deref().get()); + + event.target.assign(Some(match pseudo_target { + Some(pseudo_target) => pseudo_target, + None => target.clone(), + })); + event.dispatching.deref().set(true); - let type_ = event.deref().type_.clone(); + let type_ = event.Type(); //TODO: no chain if not participating in a tree let mut chain: Vec<Root<EventTarget>> = if target.deref().is_node() { @@ -38,7 +35,7 @@ pub fn dispatch_event<'a, 'b>(target: &JSRef<'a, EventTarget>, vec!() }; - event.deref_mut().phase = PhaseCapturing; + event.deref().phase.deref().set(PhaseCapturing); //FIXME: The "callback this value" should be currentTarget @@ -51,12 +48,12 @@ pub fn dispatch_event<'a, 'b>(target: &JSRef<'a, EventTarget>, // Explicitly drop any exception on the floor. let _ = listener.HandleEvent_(&**cur_target, event, ReportExceptions); - if event.deref().stop_immediate { + if event.deref().stop_immediate.deref().get() { break; } } - event.deref().stop_propagation + event.deref().stop_propagation.deref().get() } None => false }; @@ -67,12 +64,9 @@ pub fn dispatch_event<'a, 'b>(target: &JSRef<'a, EventTarget>, } /* at target */ - if !event.deref().stop_propagation { - { - let event = event.deref_mut(); - event.phase = PhaseAtTarget; - event.current_target.assign(Some(target.clone())); - } + if !event.deref().stop_propagation.deref().get() { + event.phase.deref().set(PhaseAtTarget); + event.current_target.assign(Some(target.clone())); let opt_listeners = target.deref().get_listeners(type_.as_slice()); for listeners in opt_listeners.iter() { @@ -80,7 +74,7 @@ pub fn dispatch_event<'a, 'b>(target: &JSRef<'a, EventTarget>, // Explicitly drop any exception on the floor. let _ = listener.HandleEvent_(target, event, ReportExceptions); - if event.deref().stop_immediate { + if event.deref().stop_immediate.deref().get() { break; } } @@ -88,23 +82,23 @@ pub fn dispatch_event<'a, 'b>(target: &JSRef<'a, EventTarget>, } /* bubbling */ - if event.deref().bubbles && !event.deref().stop_propagation { - event.deref_mut().phase = PhaseBubbling; + if event.deref().bubbles.deref().get() && !event.deref().stop_propagation.deref().get() { + event.deref().phase.deref().set(PhaseBubbling); for cur_target in chain.iter() { let stopped = match cur_target.deref().get_listeners_for(type_.as_slice(), Bubbling) { Some(listeners) => { - event.deref_mut().current_target.assign(Some(cur_target.deref().clone())); + event.deref().current_target.assign(Some(cur_target.deref().clone())); for listener in listeners.iter() { // Explicitly drop any exception on the floor. let _ = listener.HandleEvent_(&**cur_target, event, ReportExceptions); - if event.deref().stop_immediate { + if event.deref().stop_immediate.deref().get() { break; } } - event.deref().stop_propagation + event.deref().stop_propagation.deref().get() } None => false }; @@ -136,8 +130,8 @@ pub fn dispatch_event<'a, 'b>(target: &JSRef<'a, EventTarget>, let _ = chain.pop(); } - event.dispatching = false; - event.phase = PhaseNone; + event.dispatching.deref().set(false); + event.phase.deref().set(PhaseNone); event.current_target.set(None); !event.DefaultPrevented() diff --git a/src/components/script/dom/eventtarget.rs b/src/components/script/dom/eventtarget.rs index 5c144056ca6..185913be1dd 100644 --- a/src/components/script/dom/eventtarget.rs +++ b/src/components/script/dom/eventtarget.rs @@ -89,7 +89,7 @@ impl EventTarget { pub trait EventTargetHelpers { fn dispatch_event_with_target<'a>(&self, target: Option<JSRef<'a, EventTarget>>, - event: &mut JSRef<Event>) -> Fallible<bool>; + event: &JSRef<Event>) -> Fallible<bool>; fn set_inline_event_listener(&mut self, ty: DOMString, listener: Option<EventListener>); @@ -108,8 +108,8 @@ pub trait EventTargetHelpers { impl<'a> EventTargetHelpers for JSRef<'a, EventTarget> { fn dispatch_event_with_target<'b>(&self, target: Option<JSRef<'b, EventTarget>>, - event: &mut JSRef<Event>) -> Fallible<bool> { - if event.deref().dispatching || !event.deref().initialized { + event: &JSRef<Event>) -> Fallible<bool> { + if event.deref().dispatching.deref().get() || !event.deref().initialized.deref().get() { return Err(InvalidState); } Ok(dispatch_event(self, target, event)) @@ -210,7 +210,7 @@ pub trait EventTargetMethods { ty: DOMString, listener: Option<EventListener>, capture: bool); - fn DispatchEvent(&self, event: &mut JSRef<Event>) -> Fallible<bool>; + fn DispatchEvent(&self, event: &JSRef<Event>) -> Fallible<bool>; } impl<'a> EventTargetMethods for JSRef<'a, EventTarget> { @@ -251,7 +251,7 @@ impl<'a> EventTargetMethods for JSRef<'a, EventTarget> { } } - fn DispatchEvent(&self, event: &mut JSRef<Event>) -> Fallible<bool> { + fn DispatchEvent(&self, event: &JSRef<Event>) -> Fallible<bool> { self.dispatch_event_with_target(None, event) } } diff --git a/src/components/script/dom/progressevent.rs b/src/components/script/dom/progressevent.rs index b5dde42efe9..7cc06d0a115 100644 --- a/src/components/script/dom/progressevent.rs +++ b/src/components/script/dom/progressevent.rs @@ -37,13 +37,11 @@ impl ProgressEvent { pub fn new(window: &JSRef<Window>, type_: DOMString, can_bubble: bool, cancelable: bool, length_computable: bool, loaded: u64, total: u64) -> Temporary<ProgressEvent> { - let mut ev = reflect_dom_object(box ProgressEvent::new_inherited(length_computable, loaded, total), - window, - ProgressEventBinding::Wrap).root(); - { - let event: &mut JSRef<Event> = EventCast::from_mut_ref(&mut *ev); - event.InitEvent(type_, can_bubble, cancelable); - } + let ev = reflect_dom_object(box ProgressEvent::new_inherited(length_computable, loaded, total), + window, + ProgressEventBinding::Wrap).root(); + let event: &JSRef<Event> = EventCast::from_ref(&*ev); + event.InitEvent(type_, can_bubble, cancelable); Temporary::from_rooted(&*ev) } pub fn Constructor(owner: &JSRef<Window>, diff --git a/src/components/script/dom/uievent.rs b/src/components/script/dom/uievent.rs index 226c4090dcd..ea2328cb8f9 100644 --- a/src/components/script/dom/uievent.rs +++ b/src/components/script/dom/uievent.rs @@ -90,7 +90,7 @@ impl<'a> UIEventMethods for JSRef<'a, UIEvent> { view: Option<JSRef<Window>>, detail: i32) { { - let event: &mut JSRef<Event> = EventCast::from_mut_ref(self); + let event: &JSRef<Event> = EventCast::from_ref(self); event.InitEvent(type_, can_bubble, cancelable); } self.view.assign(view); diff --git a/src/components/script/dom/xmlhttprequest.rs b/src/components/script/dom/xmlhttprequest.rs index cc99bb4ea88..e780e03ae77 100644 --- a/src/components/script/dom/xmlhttprequest.rs +++ b/src/components/script/dom/xmlhttprequest.rs @@ -638,10 +638,10 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> { assert!(self.ready_state != rs) self.ready_state = rs; let win = &*self.global.root(); - let mut event = + let event = Event::new(win, "readystatechange".to_string(), false, true).root(); let target: &JSRef<EventTarget> = EventTargetCast::from_ref(self); - target.dispatch_event_with_target(None, &mut *event).ok(); + target.dispatch_event_with_target(None, &*event).ok(); } fn process_partial_response(&mut self, progress: XHRProgress) { @@ -739,16 +739,16 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> { fn dispatch_progress_event(&self, upload: bool, type_: DOMString, loaded: u64, total: Option<u64>) { let win = &*self.global.root(); let upload_target = &*self.upload.get().root().unwrap(); - let mut progressevent = ProgressEvent::new(win, type_, false, false, - total.is_some(), loaded, - total.unwrap_or(0)).root(); + let progressevent = ProgressEvent::new(win, type_, false, false, + total.is_some(), loaded, + total.unwrap_or(0)).root(); let target: &JSRef<EventTarget> = if upload { EventTargetCast::from_ref(upload_target) } else { EventTargetCast::from_ref(self) }; - let event: &mut JSRef<Event> = EventCast::from_mut_ref(&mut *progressevent); - target.dispatch_event_with_target(None, &mut *event).ok(); + let event: &JSRef<Event> = EventCast::from_ref(&*progressevent); + target.dispatch_event_with_target(None, event).ok(); } fn dispatch_upload_progress_event(&self, type_: DOMString, partial_load: Option<u64>) { diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index c733f6acaf9..df1a0a3bd96 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -1033,12 +1033,11 @@ impl ScriptTask { // We have no concept of a document loader right now, so just dispatch the // "load" event as soon as we've finished executing all scripts parsed during // the initial load. - let mut event = - Event::new(&*window, "load".to_string(), false, false).root(); + let event = Event::new(&*window, "load".to_string(), false, false).root(); let doctarget: &JSRef<EventTarget> = EventTargetCast::from_ref(&*document); let wintarget: &JSRef<EventTarget> = EventTargetCast::from_ref(&*window); let _ = wintarget.dispatch_event_with_target(Some((*doctarget).clone()), - &mut *event); + &*event); page.fragment_node.assign(fragment.map_or(None, |fragid| page.find_fragment_node(fragid))); @@ -1089,12 +1088,14 @@ impl ScriptTask { Some(mut window) => { // http://dev.w3.org/csswg/cssom-view/#resizing-viewports // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#event-type-resize - let mut uievent = UIEvent::new(&window.clone(), "resize".to_string(), false, false, - Some((*window).clone()), 0i32).root(); - let event: &mut JSRef<Event> = EventCast::from_mut_ref(&mut *uievent); + let uievent = UIEvent::new(&window.clone(), + "resize".to_string(), false, + false, Some(window.clone()), + 0i32).root(); + let event: &JSRef<Event> = EventCast::from_ref(&*uievent); let wintarget: &mut JSRef<EventTarget> = EventTargetCast::from_mut_ref(&mut *window); - let _ = wintarget.dispatch_event_with_target(None, &mut *event); + let _ = wintarget.dispatch_event_with_target(None, event); } None => () } @@ -1129,12 +1130,12 @@ impl ScriptTask { match *page.frame() { Some(ref frame) => { let window = frame.window.root(); - let mut event = + let event = Event::new(&*window, "click".to_string(), true, true).root(); let eventtarget: &JSRef<EventTarget> = EventTargetCast::from_ref(&node); - let _ = eventtarget.dispatch_event_with_target(None, &mut *event); + let _ = eventtarget.dispatch_event_with_target(None, &*event); } None => {} } |