slotchange-event-bubbling.html fails in Chrome & Firefox
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 31 Aug 2018 20:41:57 +0000 (20:41 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 31 Aug 2018 20:41:57 +0000 (20:41 +0000)
https://bugs.webkit.org/show_bug.cgi?id=189183

Reviewed by Chris Dumez.

slotchange event is supposed to fire when a slot element is inserted and there are assigned nodes.

Firefox and Chrome implement this behavior and fail this test since the test doesn't let microstask
check point run before start mutating the DOM.

Fixed the test by manually waiting for the current microtask queue to be emptied after constructing
the test shadow tree so that slotchange event from the initial tree construction doesn't get merged
with slotchange event fired for the actual DOM mutation being tested.

Also fixed typos in slotchange-in-fallback.html and a bug that we were removing the slot instead
of the shadow host at the end of each test case.

* fast/shadow-dom/slotchange-event-bubbling.html:
* fast/shadow-dom/slotchange-in-fallback.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235568 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/shadow-dom/slotchange-event-bubbling.html
LayoutTests/fast/shadow-dom/slotchange-in-fallback.html

index 79d6cc8..f1b32e7 100644 (file)
@@ -1,3 +1,25 @@
+2018-08-30  Ryosuke Niwa  <rniwa@webkit.org>
+
+        slotchange-event-bubbling.html fails in Chrome & Firefox
+        https://bugs.webkit.org/show_bug.cgi?id=189183
+
+        Reviewed by Chris Dumez.
+
+        slotchange event is supposed to fire when a slot element is inserted and there are assigned nodes.
+
+        Firefox and Chrome implement this behavior and fail this test since the test doesn't let microstask
+        check point run before start mutating the DOM.
+
+        Fixed the test by manually waiting for the current microtask queue to be emptied after constructing
+        the test shadow tree so that slotchange event from the initial tree construction doesn't get merged
+        with slotchange event fired for the actual DOM mutation being tested.
+
+        Also fixed typos in slotchange-in-fallback.html and a bug that we were removing the slot instead
+        of the shadow host at the end of each test case.
+
+        * fast/shadow-dom/slotchange-event-bubbling.html:
+        * fast/shadow-dom/slotchange-in-fallback.html:
+
 2018-08-31  Zalan Bujtas  <zalan@apple.com>
 
         [LFC] Add margin box verification back now that Display::Box has non-computed horizontal margin.
index 032cab5..32a3662 100644 (file)
@@ -75,7 +75,7 @@ test_slotchange_event_bubbles('open', false);
 test_slotchange_event_bubbles('open', true);
 
 function test_single_slotchange_event_for_nested_slots(outerMode, innerMode, connected) {
-    promise_test(() => {
+    promise_test(async () => {
         const outerHost = document.createElement('outer-host');
         if (connected)
             document.body.appendChild(outerHost);
@@ -91,6 +91,8 @@ function test_single_slotchange_event_for_nested_slots(outerMode, innerMode, con
         const innerSlotParent = innerShadow.querySelector('div');
         const innerSlot = innerShadow.querySelector('slot');
 
+        await Promise.resolve();
+
         const observer = create_slotchange_observer();
         observer.observe(outerSlot);
         observer.observe(innerHost);
@@ -109,23 +111,23 @@ function test_single_slotchange_event_for_nested_slots(outerMode, innerMode, con
         outerHost.textContent = ' ';
 
         assert_array_equals(observer.takeLog(), [], 'slotchange event must not be fired synchronously');
-        return Promise.resolve().then(() => {
-            const log = observer.takeLog();
-
-            const events = new Set(log.map((entry) => entry.event));
-            assert_equals(events.size, 1, 'Mutating the assigned content of a slot must fire exactly one slotchange event');
-
-            assert_slotchange_log(log[0], outerSlot, outerSlot, 'slotchange event must be dispatched at the slot element first');
-            assert_slotchange_log(log[1], innerSlot, outerSlot, 'slotchange event must bubble up from a slot element to its assigned slot');
-            assert_slotchange_log(log[2], innerSlotParent, outerSlot, 'slotchange event must bubble up to the parent node of a slot');
-            assert_slotchange_log(log[3], innerShadow, outerSlot, 'slotchange event must bubble up to the shadow root');
-            assert_slotchange_log(log[4], innerHost, outerSlot,
-                'slotchange event must bubble up to the shadow host if the host is a descendent of the tree in which the event was fired');
-            assert_slotchange_log(log[5], outerHostParent, outerSlot,
-                'slotchange event must bubble up to the parent of an inner shadow host');
-            assert_slotchange_log(log[6], outerShadow, outerSlot, 'slotchange event must bubble up to the shadow root');
-            assert_equals(log.length, 7, 'slotchange must not bubble beyond the shadow root in which the event was fired');
-        });
+        await Promise.resolve();
+
+        const log = observer.takeLog();
+
+        const events = new Set(log.map((entry) => entry.event));
+        assert_equals(events.size, 1, 'Mutating the assigned content of a slot must fire exactly one slotchange event');
+
+        assert_slotchange_log(log[0], outerSlot, outerSlot, 'slotchange event must be dispatched at the slot element first');
+        assert_slotchange_log(log[1], innerSlot, outerSlot, 'slotchange event must bubble up from a slot element to its assigned slot');
+        assert_slotchange_log(log[2], innerSlotParent, outerSlot, 'slotchange event must bubble up to the parent node of a slot');
+        assert_slotchange_log(log[3], innerShadow, outerSlot, 'slotchange event must bubble up to the shadow root');
+        assert_slotchange_log(log[4], innerHost, outerSlot,
+            'slotchange event must bubble up to the shadow host if the host is a descendent of the tree in which the event was fired');
+        assert_slotchange_log(log[5], outerHostParent, outerSlot,
+            'slotchange event must bubble up to the parent of an inner shadow host');
+        assert_slotchange_log(log[6], outerShadow, outerSlot, 'slotchange event must bubble up to the shadow root');
+        assert_equals(log.length, 7, 'slotchange must not bubble beyond the shadow root in which the event was fired');
     }, `A single slotchange event must bubble from a ${connected ? 'connected' : 'disconnected'} ${innerMode}-mode shadow tree to`
         + `a slot in its parent ${outerMode}-mode shadow tree`);
 }
index 5abf04b..993e1f4 100644 (file)
@@ -19,14 +19,14 @@ function generateTests(...args) {
     testMutatingSlot('open', false, ...args);
 }
 
-function testMutatingSlot(mode, connectedToDocument, shadowContent, slotName, prepareSlot, mutateSlot, description)
+function testMutatingSlot(mode, connectedToDocument, hostContent, slotName, prepareSlot, mutateSlot, description)
 {
     promise_test(async function () {
         const host = document.createElement('div');
         if (connectedToDocument)
             document.body.appendChild(host);
-        if (shadowContent)
-            host.innerHTML = shadowContent;
+        if (hostContent)
+            host.innerHTML = hostContent;
 
         const shadowRoot = host.attachShadow({mode});
 
@@ -44,9 +44,9 @@ function testMutatingSlot(mode, connectedToDocument, shadowContent, slotName, pr
 
         mutateSlot(slot);
         await Promise.resolve();
-        assert_equals(eventCount, shadowContent ? 0 : 1);
+        assert_equals(eventCount, hostContent ? 0 : 1);
 
-        slot.remove();
+        host.remove();
     }, description + ` in a ${connectedToDocument ? 'connected' : 'disconnected'} ${mode} mode shadow root`);
 }