|
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