aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2014-11-12 14:23:52 -0500
committerJosh Matthews <josh@joshmatthews.net>2014-11-13 12:53:54 -0500
commitc23edf6f5a020f24008c84957c1a290241632c6d (patch)
tree64428ac6615df95fabb298f0aeb274fc10f947c7 /components/script
parent642a3592c7ea1b82e3a3a660370b9871aa5b5e96 (diff)
downloadservo-c23edf6f5a020f24008c84957c1a290241632c6d.tar.gz
servo-c23edf6f5a020f24008c84957c1a290241632c6d.zip
Short-circuit initFooEvent while dispatching events.
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/customevent.rs6
-rw-r--r--components/script/dom/event.rs3
-rw-r--r--components/script/dom/keyboardevent.rs7
-rw-r--r--components/script/dom/mouseevent.rs7
-rw-r--r--components/script/dom/uievent.rs4
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);