diff --git a/testing/web-platform/meta/MANIFEST.json b/testing/web-platform/meta/MANIFEST.json index b44d3f6cab3e..3e270ea1584c 100644 --- a/testing/web-platform/meta/MANIFEST.json +++ b/testing/web-platform/meta/MANIFEST.json @@ -397743,6 +397743,12 @@ {} ] ], + "shadow-dom/event-dispatch-order.tentative.html": [ + [ + "/shadow-dom/event-dispatch-order.tentative.html", + {} + ] + ], "shadow-dom/event-inside-shadow-tree.html": [ [ "/shadow-dom/event-inside-shadow-tree.html", @@ -646238,6 +646244,10 @@ "2d6a5e36585b623a89b1e5f4e059d881027a0b94", "testharness" ], + "shadow-dom/event-dispatch-order.tentative.html": [ + "1e88740f53a2dc25d9650e4f54c3011e2b0e9355", + "testharness" + ], "shadow-dom/event-inside-shadow-tree.html": [ "a7405a59560c790c5708a7eaa4e65b6669adc0dd", "testharness" @@ -646307,7 +646317,7 @@ "support" ], "shadow-dom/resources/shadow-dom.js": [ - "3e55684dac1c4fbe1064c6d5d8b8d7ee86224921", + "192ad45413035ae629ba8158a5ceaca171af11fa", "support" ], "shadow-dom/scroll-to-the-fragment-in-shadow-tree.html": [ diff --git a/testing/web-platform/tests/shadow-dom/event-dispatch-order.tentative.html b/testing/web-platform/tests/shadow-dom/event-dispatch-order.tentative.html new file mode 100644 index 000000000000..1e88740f53a2 --- /dev/null +++ b/testing/web-platform/tests/shadow-dom/event-dispatch-order.tentative.html @@ -0,0 +1,30 @@ + +Shadow DOM: event dispatch order for capture and non-capture listerns at a shadow host + + + + + + +
+ +
+ diff --git a/testing/web-platform/tests/shadow-dom/resources/shadow-dom.js b/testing/web-platform/tests/shadow-dom/resources/shadow-dom.js index 3e55684dac1c..192ad4541303 100644 --- a/testing/web-platform/tests/shadow-dom/resources/shadow-dom.js +++ b/testing/web-platform/tests/shadow-dom/resources/shadow-dom.js @@ -53,7 +53,9 @@ function createTestTree(node) { return ids; } -function dispatchEventWithLog(nodes, target, event) { +// TODO: Refactor this so that only interested results are recorded. +// Callers of this function would not be interested in every results. +function dispatchEventWithLog(nodes, target, event, options) { function labelFor(e) { return e.id || e.tagName; @@ -70,15 +72,40 @@ function dispatchEventWithLog(nodes, target, event) { if (!id) continue; attachedNodes.push(node); - node.addEventListener(event.type, (e) => { + if (options && options.capture) { + // Record [currentTarget, target, relatedTarget, composedPath(), 'capture' | 'non-capture'] + // TODO: Support registering listeners in different orders. + // e.g. Register a non-capture listener at first, then register a capture listener. + node.addEventListener(event.type, (e) => { + log.push([id, + labelFor(e.target), + e.relatedTarget ? labelFor(e.relatedTarget) : null, + e.composedPath().map((n) => { + return labelFor(n); + }), + 'capture']); + }, true); + node.addEventListener(event.type, (e) => { + log.push([id, + labelFor(e.target), + e.relatedTarget ? labelFor(e.relatedTarget) : null, + e.composedPath().map((n) => { + return labelFor(n); + }), + 'non-capture']); + }); + } else { // Record [currentTarget, target, relatedTarget, composedPath()] - log.push([id, - labelFor(e.target), - e.relatedTarget ? labelFor(e.relatedTarget) : null, - e.composedPath().map((n) => { - return labelFor(n); - })]); - }); + node.addEventListener(event.type, (e) => { + log.push([id, + labelFor(e.target), + e.relatedTarget ? labelFor(e.relatedTarget) : null, + e.composedPath().map((n) => { + return labelFor(n); + })] + ); + }); + } } } target.dispatchEvent(event); @@ -122,9 +149,13 @@ function dispatchUAEventWithLog(nodes, target, eventType, callback) { function assert_event_path_equals(actual, expected) { assert_equals(actual.length, expected.length); for (let i = 0; i < actual.length; ++i) { + assert_equals(actual[i].length, expected[i].length); assert_equals(actual[i][0], expected[i][0], 'currentTarget at ' + i + ' should be same'); assert_equals(actual[i][1], expected[i][1], 'target at ' + i + ' should be same'); assert_equals(actual[i][2], expected[i][2], 'relatedTarget at ' + i + ' should be same'); assert_array_equals(actual[i][3], expected[i][3], 'composedPath at ' + i + ' should be same'); + if (actual[i][4]) { + assert_equals(actual[i][4], expected[i][4], 'listener type should be same at ' + i); + } } }