From a5925020ce2752192ff45a401e86205dbbcb65f1 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 16 Sep 2015 14:54:26 +0200 Subject: [PATCH] Avoid calling any listeners for events whose stop propagation flag is set prior to dispatching. --- components/script/dom/eventdispatcher.rs | 8 ++++++++ .../tests/approved/stopPropagation.dispatchEvent.html.ini | 5 ----- .../converted/stopPropagation.dispatchEvent.html.ini | 5 ----- 3 files changed, 8 insertions(+), 10 deletions(-) delete mode 100644 tests/wpt/metadata/DOMEvents/tests/approved/stopPropagation.dispatchEvent.html.ini delete mode 100644 tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/stopPropagation.dispatchEvent.html.ini diff --git a/components/script/dom/eventdispatcher.rs b/components/script/dom/eventdispatcher.rs index 33c07c69bb0..13ccf5be4b9 100644 --- a/components/script/dom/eventdispatcher.rs +++ b/components/script/dom/eventdispatcher.rs @@ -13,6 +13,9 @@ use dom::node::Node; use dom::virtualmethods::vtable_for; fn dispatch_to_listeners(event: &Event, target: &EventTarget, chain: &[&EventTarget]) { + assert!(!event.stop_propagation()); + assert!(!event.stop_immediate()); + let type_ = event.Type(); /* capturing */ @@ -98,6 +101,11 @@ pub fn dispatch_event(target: &EventTarget, pseudo_target: Option<&EventTarget>, Some(pseudo_target) => pseudo_target, None => target.clone(), }); + + if event.stop_propagation() { + return !event.DefaultPrevented(); + } + event.set_dispatching(true); //TODO: no chain if not participating in a tree diff --git a/tests/wpt/metadata/DOMEvents/tests/approved/stopPropagation.dispatchEvent.html.ini b/tests/wpt/metadata/DOMEvents/tests/approved/stopPropagation.dispatchEvent.html.ini deleted file mode 100644 index ad9ce52a5f2..00000000000 --- a/tests/wpt/metadata/DOMEvents/tests/approved/stopPropagation.dispatchEvent.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[stopPropagation.dispatchEvent.html] - type: testharness - [Test Description: If Event.stopPropagation() has been called prior to the dispatch, all phases must be skipped.] - expected: FAIL - diff --git a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/stopPropagation.dispatchEvent.html.ini b/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/stopPropagation.dispatchEvent.html.ini deleted file mode 100644 index ad9ce52a5f2..00000000000 --- a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/stopPropagation.dispatchEvent.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[stopPropagation.dispatchEvent.html] - type: testharness - [Test Description: If Event.stopPropagation() has been called prior to the dispatch, all phases must be skipped.] - expected: FAIL -