Use Cell/RefCell for interior mutability of Event.

This commit is contained in:
Tetsuharu OHZEKI 2014-05-28 05:33:29 +09:00
parent 92da2f16fc
commit f78e561746
2 changed files with 9 additions and 8 deletions

View file

@ -10,6 +10,7 @@ use dom::bindings::error::Fallible;
use dom::eventtarget::EventTarget; use dom::eventtarget::EventTarget;
use dom::window::Window; use dom::window::Window;
use servo_util::str::DOMString; use servo_util::str::DOMString;
use std::cell::Cell;
use geom::point::Point2D; use geom::point::Point2D;
@ -46,8 +47,8 @@ pub enum EventTypeId {
pub struct Event { pub struct Event {
pub type_id: EventTypeId, pub type_id: EventTypeId,
pub reflector_: Reflector, pub reflector_: Reflector,
pub current_target: Option<JS<EventTarget>>, pub current_target: Cell<Option<JS<EventTarget>>>,
pub target: Option<JS<EventTarget>>, pub target: Cell<Option<JS<EventTarget>>>,
pub type_: DOMString, pub type_: DOMString,
pub phase: EventPhase, pub phase: EventPhase,
pub canceled: bool, pub canceled: bool,
@ -66,8 +67,8 @@ impl Event {
Event { Event {
type_id: type_id, type_id: type_id,
reflector_: Reflector::new(), reflector_: Reflector::new(),
current_target: None, current_target: Cell::new(None),
target: None, target: Cell::new(None),
phase: PhaseNone, phase: PhaseNone,
type_: "".to_owned(), type_: "".to_owned(),
canceled: false, canceled: false,
@ -123,11 +124,11 @@ impl<'a> EventMethods for JSRef<'a, Event> {
} }
fn GetTarget(&self) -> Option<Temporary<EventTarget>> { fn GetTarget(&self) -> Option<Temporary<EventTarget>> {
self.target.as_ref().map(|target| Temporary::new(target.clone())) self.target.get().as_ref().map(|target| Temporary::new(target.clone()))
} }
fn GetCurrentTarget(&self) -> Option<Temporary<EventTarget>> { fn GetCurrentTarget(&self) -> Option<Temporary<EventTarget>> {
self.current_target.as_ref().map(|target| Temporary::new(target.clone())) self.current_target.get().as_ref().map(|target| Temporary::new(target.clone()))
} }
fn DefaultPrevented(&self) -> bool { fn DefaultPrevented(&self) -> bool {
@ -173,7 +174,7 @@ impl<'a> EventMethods for JSRef<'a, Event> {
self.stop_immediate = false; self.stop_immediate = false;
self.canceled = false; self.canceled = false;
self.trusted = false; self.trusted = false;
self.target = None; self.target.set(None);
self.type_ = type_; self.type_ = type_;
self.bubbles = bubbles; self.bubbles = bubbles;
self.cancelable = cancelable; self.cancelable = cancelable;

View file

@ -140,7 +140,7 @@ pub fn dispatch_event<'a, 'b>(target: &JSRef<'a, EventTarget>,
event.dispatching = false; event.dispatching = false;
event.phase = PhaseNone; event.phase = PhaseNone;
event.current_target = None; event.current_target.set(None);
!event.DefaultPrevented() !event.DefaultPrevented()
} }