diff options
17 files changed, 66 insertions, 86 deletions
diff --git a/components/script/dom/eventdispatcher.rs b/components/script/dom/eventdispatcher.rs index 28a269b7429..f80a217658b 100644 --- a/components/script/dom/eventdispatcher.rs +++ b/components/script/dom/eventdispatcher.rs @@ -10,6 +10,7 @@ use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, Root, RootedReference}; use dom::bindings::reflector::Reflectable; use dom::bindings::trace::RootedVec; +use dom::document::Document; use dom::event::{Event, EventPhase}; use dom::eventtarget::{CompiledEventListener, EventTarget, ListenerPhase}; use dom::node::Node; @@ -153,6 +154,13 @@ pub fn dispatch_event(target: &EventTarget, pseudo_target: Option<&EventTarget>, for ancestor in target_node.ancestors() { chain.push(JS::from_ref(ancestor.upcast())); } + let top_most_ancestor_or_target = + Root::from_ref(chain.r().last().cloned().unwrap_or(target)); + if let Some(document) = Root::downcast::<Document>(top_most_ancestor_or_target) { + if event.type_() != atom!("load") && document.browsing_context().is_some() { + chain.push(JS::from_ref(document.window().upcast())); + } + } } dispatch_to_listeners(event, target, chain.r()); diff --git a/tests/wpt/metadata-css/css-transitions-1_dev/html/before-load-001.htm.ini b/tests/wpt/metadata-css/css-transitions-1_dev/html/before-load-001.htm.ini index ed4c2c93660..377e0824655 100644 --- a/tests/wpt/metadata-css/css-transitions-1_dev/html/before-load-001.htm.ini +++ b/tests/wpt/metadata-css/css-transitions-1_dev/html/before-load-001.htm.ini @@ -1,3 +1,5 @@ [before-load-001.htm] type: testharness - expected: TIMEOUT + [transition height from 10px to 100px / events] + expected: FAIL + diff --git a/tests/wpt/metadata/DOMEvents/tests/approved/DOM.event.flow.html.ini b/tests/wpt/metadata/DOMEvents/tests/approved/DOM.event.flow.html.ini deleted file mode 100644 index 841772257c2..00000000000 --- a/tests/wpt/metadata/DOMEvents/tests/approved/DOM.event.flow.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[DOM.event.flow.html] - type: testharness - [Test Description: Dispatch an event in a DOM tree using the DOM event flow.] - expected: FAIL - diff --git a/tests/wpt/metadata/DOMEvents/tests/approved/stopImmediatePropagation.effect.html.ini b/tests/wpt/metadata/DOMEvents/tests/approved/stopImmediatePropagation.effect.html.ini deleted file mode 100644 index 6e5f153d75e..00000000000 --- a/tests/wpt/metadata/DOMEvents/tests/approved/stopImmediatePropagation.effect.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[stopImmediatePropagation.effect.html] - type: testharness - [Test Description: stopImmediatePropagation() prevents other event listeners from being triggered and, unlike Event.stopPropagation(), its effect must be immediate. Once it has been called, further calls to this method have no additional effect.] - expected: FAIL - diff --git a/tests/wpt/metadata/DOMEvents/tests/approved/stopPropagation.deferred.effect.html.ini b/tests/wpt/metadata/DOMEvents/tests/approved/stopPropagation.deferred.effect.html.ini deleted file mode 100644 index 355e0411c1f..00000000000 --- a/tests/wpt/metadata/DOMEvents/tests/approved/stopPropagation.deferred.effect.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[stopPropagation.deferred.effect.html] - type: testharness - [Test Description: stopPropagation() prevents other event listeners from being triggered but its effect must be deferred until all event listeners attached on the Event.currentTarget have been triggered.] - expected: FAIL - diff --git a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/DOM.event.flow.html.ini b/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/DOM.event.flow.html.ini deleted file mode 100644 index 841772257c2..00000000000 --- a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/DOM.event.flow.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[DOM.event.flow.html] - type: testharness - [Test Description: Dispatch an event in a DOM tree using the DOM event flow.] - expected: FAIL - diff --git a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/EventListener.dispatch.new.event.html.ini b/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/EventListener.dispatch.new.event.html.ini deleted file mode 100644 index 778f1b788b3..00000000000 --- a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/EventListener.dispatch.new.event.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[EventListener.dispatch.new.event.html] - type: testharness - [Test Description: Implementations of the DOM event model must be reentrant. Event listeners may perform actions that cause additional events to be dispatched. Such events are handled in a synchronous manner, the event propagation that causes the event listener to be triggered must resume only after the event dispatch of the new event is completed.] - expected: FAIL - diff --git a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/stopImmediatePropagation.effect.html.ini b/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/stopImmediatePropagation.effect.html.ini deleted file mode 100644 index 6e5f153d75e..00000000000 --- a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/stopImmediatePropagation.effect.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[stopImmediatePropagation.effect.html] - type: testharness - [Test Description: stopImmediatePropagation() prevents other event listeners from being triggered and, unlike Event.stopPropagation(), its effect must be immediate. Once it has been called, further calls to this method have no additional effect.] - expected: FAIL - diff --git a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/stopPropagation.deferred.effect.html.ini b/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/stopPropagation.deferred.effect.html.ini deleted file mode 100644 index 355e0411c1f..00000000000 --- a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/stopPropagation.deferred.effect.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[stopPropagation.deferred.effect.html] - type: testharness - [Test Description: stopPropagation() prevents other event listeners from being triggered but its effect must be deferred until all event listeners attached on the Event.currentTarget have been triggered.] - expected: FAIL - diff --git a/tests/wpt/metadata/dom/events/Event-dispatch-bubbles-false.html.ini b/tests/wpt/metadata/dom/events/Event-dispatch-bubbles-false.html.ini deleted file mode 100644 index ee6a91dd03f..00000000000 --- a/tests/wpt/metadata/dom/events/Event-dispatch-bubbles-false.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[Event-dispatch-bubbles-false.html] - type: testharness - [Event.dispatchEvent with Event.bubbles set to false.] - expected: FAIL - diff --git a/tests/wpt/metadata/dom/events/Event-dispatch-handlers-changed.html.ini b/tests/wpt/metadata/dom/events/Event-dispatch-handlers-changed.html.ini deleted file mode 100644 index 7cc011a25d1..00000000000 --- a/tests/wpt/metadata/dom/events/Event-dispatch-handlers-changed.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[Event-dispatch-handlers-changed.html] - type: testharness - [ Dispatch additional events inside an event listener ] - expected: FAIL - diff --git a/tests/wpt/metadata/dom/events/Event-dispatch-omitted-capture.html.ini b/tests/wpt/metadata/dom/events/Event-dispatch-omitted-capture.html.ini deleted file mode 100644 index 5108f7dcd51..00000000000 --- a/tests/wpt/metadata/dom/events/Event-dispatch-omitted-capture.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[Event-dispatch-omitted-capture.html] - type: testharness - [EventTarget.addEventListener with the capture argument omitted] - expected: FAIL - diff --git a/tests/wpt/metadata/dom/events/Event-dispatch-reenter.html.ini b/tests/wpt/metadata/dom/events/Event-dispatch-reenter.html.ini deleted file mode 100644 index 4d7f85c0779..00000000000 --- a/tests/wpt/metadata/dom/events/Event-dispatch-reenter.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[Event-dispatch-reenter.html] - type: testharness - [ Dispatch additional events inside an event listener ] - expected: FAIL - diff --git a/tests/wpt/metadata/dom/events/Event-dispatch-target-moved.html.ini b/tests/wpt/metadata/dom/events/Event-dispatch-target-moved.html.ini deleted file mode 100644 index eada02233cf..00000000000 --- a/tests/wpt/metadata/dom/events/Event-dispatch-target-moved.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[Event-dispatch-target-moved.html] - type: testharness - [Event propagation path when an element in it is moved within the DOM] - expected: FAIL - diff --git a/tests/wpt/metadata/dom/events/Event-dispatch-target-removed.html.ini b/tests/wpt/metadata/dom/events/Event-dispatch-target-removed.html.ini deleted file mode 100644 index 8343b0b1bd9..00000000000 --- a/tests/wpt/metadata/dom/events/Event-dispatch-target-removed.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[Event-dispatch-target-removed.html] - type: testharness - [Event propagation path when an element in it is removed from the DOM] - expected: FAIL - diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/112.html.ini b/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/112.html.ini new file mode 100644 index 00000000000..ae9b23716a9 --- /dev/null +++ b/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/112.html.ini @@ -0,0 +1,5 @@ +[112.html] + type: testharness + [ scheduler: removing async attribute at runtime, script also has defer attribute] + expected: FAIL + diff --git a/tests/wpt/web-platform-tests/dom/events/Event-dispatch-bubbles-false.html b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-bubbles-false.html index c381459f5e4..aaad28a6169 100644 --- a/tests/wpt/web-platform-tests/dom/events/Event-dispatch-bubbles-false.html +++ b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-bubbles-false.html @@ -19,32 +19,21 @@ </tbody> </table> <script> -test(function() { - var event_type = "click"; - var target = document.getElementById("target"); - var targets = [ - window, +function targetsForDocumentChain(document) { + return [ document, document.documentElement, document.body, document.getElementById("table"), document.getElementById("table-body"), - document.getElementById("parent"), - target, - ]; - var expected_targets = targets.concat(target); - var phases = [ - Event.CAPTURING_PHASE, - Event.CAPTURING_PHASE, - Event.CAPTURING_PHASE, - Event.CAPTURING_PHASE, - Event.CAPTURING_PHASE, - Event.CAPTURING_PHASE, - Event.CAPTURING_PHASE, - Event.AT_TARGET, - Event.AT_TARGET, + document.getElementById("parent") ]; +} +function testChain(document, targetParents, phases, event_type) { + var target = document.getElementById("target"); + var targets = targetParents.concat(target); + var expected_targets = targets.concat(target); var actual_targets = [], actual_phases = []; var test_event = function(evt) { @@ -64,5 +53,46 @@ test(function() { assert_array_equals(actual_targets, expected_targets, "targets"); assert_array_equals(actual_phases, phases, "phases"); -}, "Event.dispatchEvent with Event.bubbles set to false."); +} + +var phasesForDocumentChain = [ + Event.CAPTURING_PHASE, + Event.CAPTURING_PHASE, + Event.CAPTURING_PHASE, + Event.CAPTURING_PHASE, + Event.CAPTURING_PHASE, + Event.CAPTURING_PHASE, + Event.AT_TARGET, + Event.AT_TARGET, +]; + +test(function () { + var chainWithWindow = [window].concat(targetsForDocumentChain(document)); + testChain( + document, chainWithWindow, [Event.CAPTURING_PHASE].concat(phasesForDocumentChain), "click"); +}, "In window.document with click event"); + +test(function () { + testChain(document, targetsForDocumentChain(document), phasesForDocumentChain, "load"); +}, "In window.document with load event") + +test(function () { + var documentClone = document.cloneNode(true); + testChain( + documentClone, targetsForDocumentChain(documentClone), phasesForDocumentChain, "click"); +}, "In window.document.cloneNode(true)"); + +test(function () { + var newDocument = new Document(); + newDocument.appendChild(document.documentElement.cloneNode(true)); + testChain( + newDocument, targetsForDocumentChain(newDocument), phasesForDocumentChain, "click"); +}, "In new Document()"); + +test(function () { + var HTMLDocument = document.implementation.createHTMLDocument(); + HTMLDocument.body.appendChild(document.getElementById("table").cloneNode(true)); + testChain( + HTMLDocument, targetsForDocumentChain(HTMLDocument), phasesForDocumentChain, "click"); +}, "In DOMImplementation.createHTMLDocument()"); </script> |