diff options
author | Josh Matthews <josh@joshmatthews.net> | 2014-11-12 14:23:52 -0500 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2014-11-13 12:53:54 -0500 |
commit | c23edf6f5a020f24008c84957c1a290241632c6d (patch) | |
tree | 64428ac6615df95fabb298f0aeb274fc10f947c7 /components/script | |
parent | 642a3592c7ea1b82e3a3a660370b9871aa5b5e96 (diff) | |
download | servo-c23edf6f5a020f24008c84957c1a290241632c6d.tar.gz servo-c23edf6f5a020f24008c84957c1a290241632c6d.zip |
Short-circuit initFooEvent while dispatching events.
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/customevent.rs | 6 | ||||
-rw-r--r-- | components/script/dom/event.rs | 3 | ||||
-rw-r--r-- | components/script/dom/keyboardevent.rs | 7 | ||||
-rw-r--r-- | components/script/dom/mouseevent.rs | 7 | ||||
-rw-r--r-- | components/script/dom/uievent.rs | 4 |
5 files changed, 23 insertions, 4 deletions
diff --git a/components/script/dom/customevent.rs b/components/script/dom/customevent.rs index 3cad0e2ddba..e1ac0125bb8 100644 --- a/components/script/dom/customevent.rs +++ b/components/script/dom/customevent.rs @@ -65,8 +65,12 @@ impl<'a> CustomEventMethods for JSRef<'a, CustomEvent> { can_bubble: bool, cancelable: bool, detail: JSVal) { - self.detail.set(detail); let event: JSRef<Event> = EventCast::from_ref(self); + if event.dispatching() { + return; + } + + self.detail.set(detail); event.InitEvent(type_, can_bubble, cancelable); } } diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index bbeb2cb7df2..f04b6d0a055 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -219,10 +219,11 @@ impl<'a> EventMethods for JSRef<'a, Event> { type_: DOMString, bubbles: bool, cancelable: bool) { - self.initialized.set(true); if self.dispatching.get() { return; } + + self.initialized.set(true); self.stop_propagation.set(false); self.stop_immediate.set(false); self.canceled.set(false); diff --git a/components/script/dom/keyboardevent.rs b/components/script/dom/keyboardevent.rs index 3a097fb54e2..b48a3295299 100644 --- a/components/script/dom/keyboardevent.rs +++ b/components/script/dom/keyboardevent.rs @@ -5,7 +5,7 @@ use dom::bindings::codegen::Bindings::KeyboardEventBinding; use dom::bindings::codegen::Bindings::KeyboardEventBinding::{KeyboardEventMethods, KeyboardEventConstants}; use dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; -use dom::bindings::codegen::InheritTypes::{UIEventCast, KeyboardEventDerived}; +use dom::bindings::codegen::InheritTypes::{EventCast, UIEventCast, KeyboardEventDerived}; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::global; @@ -558,6 +558,11 @@ impl<'a> KeyboardEventMethods for JSRef<'a, KeyboardEvent> { _modifiersListArg: DOMString, repeat: bool, _locale: DOMString) { + let event: JSRef<Event> = EventCast::from_ref(self); + if event.dispatching() { + return; + } + let uievent: JSRef<UIEvent> = UIEventCast::from_ref(self); uievent.InitUIEvent(typeArg, canBubbleArg, cancelableArg, viewArg, 0); *self.key.borrow_mut() = keyArg; diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index b617505c41e..81d23bf8afb 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -5,7 +5,7 @@ use dom::bindings::codegen::Bindings::MouseEventBinding; use dom::bindings::codegen::Bindings::MouseEventBinding::MouseEventMethods; use dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; -use dom::bindings::codegen::InheritTypes::{UIEventCast, MouseEventDerived}; +use dom::bindings::codegen::InheritTypes::{EventCast, UIEventCast, MouseEventDerived}; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::global; @@ -160,6 +160,11 @@ impl<'a> MouseEventMethods for JSRef<'a, MouseEvent> { metaKeyArg: bool, buttonArg: i16, relatedTargetArg: Option<JSRef<EventTarget>>) { + let event: JSRef<Event> = EventCast::from_ref(self); + if event.dispatching() { + return; + } + let uievent: JSRef<UIEvent> = UIEventCast::from_ref(self); uievent.InitUIEvent(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg); self.screen_x.set(screenXArg); diff --git a/components/script/dom/uievent.rs b/components/script/dom/uievent.rs index 6a55f6ccbf8..036de7bfb64 100644 --- a/components/script/dom/uievent.rs +++ b/components/script/dom/uievent.rs @@ -89,6 +89,10 @@ impl<'a> UIEventMethods for JSRef<'a, UIEvent> { view: Option<JSRef<Window>>, detail: i32) { let event: JSRef<Event> = EventCast::from_ref(self); + if event.dispatching() { + return; + } + event.InitEvent(type_, can_bubble, cancelable); self.view.assign(view); self.detail.set(detail); |