Skip to content

Commit a61c760

Browse files
dbaronchromium-wpt-export-bot
authored andcommitted
Test order of toggle events in addition to order of DOMSubtreeModified events.
I realized while writing whatwg/html#9400 (comment) that the ordering of the `open` attribute manipulation is also exposed through `toggle` events, so this tests those events in addition to `DOMSubtreeModified` events. Bug: 1444057 Change-Id: I6d3c65f5402053d77e4f6c488aa07209181a8cdd Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4599204 Reviewed-by: Mason Freed <[email protected]> Commit-Queue: David Baron <[email protected]> Cr-Commit-Position: refs/heads/main@{#1154716}
1 parent 8969965 commit a61c760

File tree

1 file changed

+41
-25
lines changed

1 file changed

+41
-25
lines changed

html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -110,24 +110,7 @@
110110
assert_element_states(elements, [1, 0, 0, 1, 0, 1, 0, 1], "after final mutation");
111111
}, "mutually exclusive details across multiple names and multiple tree scopes");
112112

113-
// The next two tests test characteristics of the design that are only
114-
// exposed via mutation events. If mutation events (for attribute
115-
// addition/removal) are removed from the web, these tests could be
116-
// removed, and some small simplifications could be made to the code
117-
// implementing this feature.
118-
function mutation_events_for_attribute_removal_supported() {
119-
container.innerHTML = `<div id="event-removal-test"></div>`;
120-
let element = container.firstChild;
121-
let event_fired = false;
122-
element.addEventListener("DOMSubtreeModified", event => event_fired = true);
123-
element.removeAttribute("id");
124-
return event_fired;
125-
}
126-
127113
promise_test(async t => {
128-
if (!mutation_events_for_attribute_removal_supported()) {
129-
return;
130-
}
131114
container.innerHTML = `
132115
<details name="a" id="e0" open></details>
133116
<details name="a" id="e1"></details>
@@ -143,24 +126,57 @@
143126
document.getElementById("e3") ];
144127
container.insertBefore(e2, elements[3]);
145128

146-
let received_ids = [];
147-
let listener = event => {
129+
let mutation_event_received_ids = [];
130+
let mutation_listener = event => {
148131
assert_equals(event.type, "DOMSubtreeModified");
149132
assert_equals(event.target.nodeType, Node.ELEMENT_NODE);
150133
let element = event.target;
151134
assert_equals(element.localName, "details");
152-
received_ids.push(element.id);
135+
mutation_event_received_ids.push(element.id);
153136
};
137+
let toggle_event_received_ids = [];
138+
let toggle_event_promises = [];
154139
for (let element of elements) {
155-
element.addEventListener("DOMSubtreeModified", listener);
140+
element.addEventListener("DOMSubtreeModified", mutation_listener);
141+
toggle_event_promises.push(new Promise((resolve, reject) => {
142+
element.addEventListener("toggle", event => {
143+
assert_equals(event.type, "toggle");
144+
assert_equals(event.target, element);
145+
toggle_event_received_ids.push(element.id);
146+
resolve(undefined);
147+
});
148+
}));
156149
}
157-
assert_array_equals(received_ids, []);
150+
assert_array_equals(mutation_event_received_ids, []);
158151
assert_element_states(elements, [1, 0, 1, 1], "states before mutation");
159152
elements[1].open = true;
160-
assert_array_equals(received_ids, ["e0", "e3", "e2", "e1"],
161-
"removal events received in node insertion order, followed by addition event");
153+
if (mutation_event_received_ids.length == 0) {
154+
// ok if mutation events are not supported
155+
} else {
156+
assert_array_equals(mutation_event_received_ids, ["e0", "e3", "e2", "e1"],
157+
"removal events received in node insertion order, followed by addition event");
158+
}
162159
assert_element_states(elements, [0, 1, 0, 0], "states after mutation");
163-
}, "mutation event order matches order of insertion in set of named elements");
160+
assert_array_equals(toggle_event_received_ids, [], "toggle events received before awaiting promises");
161+
await Promise.all(toggle_event_promises);
162+
assert_array_equals(toggle_event_received_ids, ["e1", "e0", "e3", "e2"], "toggle events received after awaiting promises");
163+
}, "mutation event and toggle event order matches order of insertion in set of named elements");
164+
165+
// This function is used to guard tests that test behavior that is
166+
// relevant only because of Mutation Events. If mutation events (for
167+
// attribute addition/removal) are removed from the web, the tests using
168+
// this function can be removed.
169+
function mutation_events_for_attribute_removal_supported() {
170+
if (!("MutationEvent" in window)) {
171+
return false;
172+
}
173+
container.innerHTML = `<div id="event-removal-test"></div>`;
174+
let element = container.firstChild;
175+
let event_fired = false;
176+
element.addEventListener("DOMSubtreeModified", event => event_fired = true);
177+
element.removeAttribute("id");
178+
return event_fired;
179+
}
164180

165181
promise_test(async t => {
166182
if (!mutation_events_for_attribute_removal_supported()) {

0 commit comments

Comments
 (0)