Use internal mutability for CustomEvent.

This commit is contained in:
Ms2ger 2014-06-10 16:03:53 +02:00
parent 0b364d13b6
commit 781299aaa6

View file

@ -14,10 +14,12 @@ use js::jsapi::JSContext;
use js::jsval::{JSVal, NullValue}; use js::jsval::{JSVal, NullValue};
use servo_util::str::DOMString; use servo_util::str::DOMString;
use std::cell::Cell;
#[deriving(Encodable)] #[deriving(Encodable)]
pub struct CustomEvent { pub struct CustomEvent {
event: Event, event: Event,
detail: Traceable<JSVal> detail: Traceable<Cell<Traceable<JSVal>>>,
} }
impl CustomEventDerived for Event { impl CustomEventDerived for Event {
@ -28,7 +30,7 @@ impl CustomEventDerived for Event {
pub trait CustomEventMethods { pub trait CustomEventMethods {
fn Detail(&self, _cx: *mut JSContext) -> JSVal; fn Detail(&self, _cx: *mut JSContext) -> JSVal;
fn InitCustomEvent(&mut self, _cx: *mut JSContext, fn InitCustomEvent(&self, _cx: *mut JSContext,
type_: DOMString, can_bubble: bool, type_: DOMString, can_bubble: bool,
cancelable: bool, detail: JSVal); cancelable: bool, detail: JSVal);
} }
@ -37,7 +39,7 @@ impl CustomEvent {
pub fn new_inherited(type_id: EventTypeId) -> CustomEvent { pub fn new_inherited(type_id: EventTypeId) -> CustomEvent {
CustomEvent { CustomEvent {
event: Event::new_inherited(type_id), event: Event::new_inherited(type_id),
detail: Traceable::new(NullValue()) detail: Traceable::new(Cell::new(Traceable::new(NullValue()))),
} }
} }
@ -47,8 +49,8 @@ impl CustomEvent {
CustomEventBinding::Wrap) CustomEventBinding::Wrap)
} }
pub fn new(window: &JSRef<Window>, type_: DOMString, bubbles: bool, cancelable: bool, detail: JSVal) -> Temporary<CustomEvent> { pub fn new(window: &JSRef<Window>, type_: DOMString, bubbles: bool, cancelable: bool, detail: JSVal) -> Temporary<CustomEvent> {
let mut ev = CustomEvent::new_uninitialized(window).root(); let ev = CustomEvent::new_uninitialized(window).root();
ev.InitCustomEvent(window.deref().get_cx(), type_, bubbles, cancelable, detail); ev.deref().InitCustomEvent(window.deref().get_cx(), type_, bubbles, cancelable, detail);
Temporary::from_rooted(&*ev) Temporary::from_rooted(&*ev)
} }
pub fn Constructor(owner: &JSRef<Window>, pub fn Constructor(owner: &JSRef<Window>,
@ -60,16 +62,16 @@ impl CustomEvent {
impl<'a> CustomEventMethods for JSRef<'a, CustomEvent> { impl<'a> CustomEventMethods for JSRef<'a, CustomEvent> {
fn Detail(&self, _cx: *mut JSContext) -> JSVal { fn Detail(&self, _cx: *mut JSContext) -> JSVal {
self.detail.deref().clone() *self.detail.deref().get()
} }
fn InitCustomEvent(&mut self, fn InitCustomEvent(&self,
_cx: *mut JSContext, _cx: *mut JSContext,
type_: DOMString, type_: DOMString,
can_bubble: bool, can_bubble: bool,
cancelable: bool, cancelable: bool,
detail: JSVal) { detail: JSVal) {
self.detail = Traceable::new(detail); self.detail.deref().set(Traceable::new(detail));
let event: &JSRef<Event> = EventCast::from_ref(self); let event: &JSRef<Event> = EventCast::from_ref(self);
event.InitEvent(type_, can_bubble, cancelable); event.InitEvent(type_, can_bubble, cancelable);
} }