|
110 | 110 | assert_element_states(elements, [1, 0, 0, 1, 0, 1, 0, 1], "after final mutation");
|
111 | 111 | }, "mutually exclusive details across multiple names and multiple tree scopes");
|
112 | 112 |
|
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 |
| - |
127 | 113 | promise_test(async t => {
|
128 |
| - if (!mutation_events_for_attribute_removal_supported()) { |
129 |
| - return; |
130 |
| - } |
131 | 114 | container.innerHTML = `
|
132 | 115 | <details name="a" id="e0" open></details>
|
133 | 116 | <details name="a" id="e1"></details>
|
|
143 | 126 | document.getElementById("e3") ];
|
144 | 127 | container.insertBefore(e2, elements[3]);
|
145 | 128 |
|
146 |
| - let received_ids = []; |
147 |
| - let listener = event => { |
| 129 | + let mutation_event_received_ids = []; |
| 130 | + let mutation_listener = event => { |
148 | 131 | assert_equals(event.type, "DOMSubtreeModified");
|
149 | 132 | assert_equals(event.target.nodeType, Node.ELEMENT_NODE);
|
150 | 133 | let element = event.target;
|
151 | 134 | assert_equals(element.localName, "details");
|
152 |
| - received_ids.push(element.id); |
| 135 | + mutation_event_received_ids.push(element.id); |
153 | 136 | };
|
| 137 | + let toggle_event_received_ids = []; |
| 138 | + let toggle_event_promises = []; |
154 | 139 | 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 | + })); |
156 | 149 | }
|
157 |
| - assert_array_equals(received_ids, []); |
| 150 | + assert_array_equals(mutation_event_received_ids, []); |
158 | 151 | assert_element_states(elements, [1, 0, 1, 1], "states before mutation");
|
159 | 152 | 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 | + } |
162 | 159 | 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 | +} |
164 | 180 |
|
165 | 181 | promise_test(async t => {
|
166 | 182 | if (!mutation_events_for_attribute_removal_supported()) {
|
|
0 commit comments