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);
+ }
}
}