Title: [276822] trunk/LayoutTests
Revision
276822
Author
[email protected]
Date
2021-04-29 16:44:29 -0700 (Thu, 29 Apr 2021)

Log Message

REGRESSION: [iOS] 6 media/modern-media-controls/tracks-support/ tests timing out
https://bugs.webkit.org/show_bug.cgi?id=225202
<rdar://problem/77041631>

Reviewed by Devin Rousso.

The six tests modified in this patch were failing for two reasons:

1. The media controls logic was modified to hide certain controls at
smaller widths. To ensure the tracks button was visible, the width
of the <video> element was increased. However, on iOS, this led to the
tracks button being positioned outside the viewport. Consequently, any
attempts to tap the button and wait for a context menu to show up
would fail, causing the tests to timeout waiting for a context menu.

To fix (1), call Element.scrollIntoViewIfNeeded before attempting to
tap on the tracks button, ensuring it is visible in the viewport. Then,
use window coordinates to tap at the right position. To ensure the
viewport is actually scrollable on iOS, "useFlexibleViewport" and the
viewport meta tag were added to failing tests.

2. Even after fixing (1), the tests continued to timeout. Note that
both the pressOnElement() and getTracksContextMenu() helper methods
in "media-controls-utils.js" call into UIScriptController, and are
called in succession in the failing tests. Both methods add callbacks
to the test runner. However, pressOnElement() is not an async method,
which lead to getTracksContextMenu() getting called before the tap
actually completed. UIScriptController clears all callbacks after one
callback completes, so when the tap callback was completed, the context
menu callback was removed. Then, the tests get stuck waiting on the
context menu callback to get invoked.

To fix (2), make pressOnElement() return a promise if a continuation
function is not provided. Then, getTracksContextMenu() can be called
after the promise is resolved.

* media/modern-media-controls/resources/media-controls-utils.js:
(pressOnElement):
* media/modern-media-controls/tracks-support/auto-text-track.html:
* media/modern-media-controls/tracks-support/click-track-in-contextmenu.html:
* media/modern-media-controls/tracks-support/hidden-tracks.html:
* media/modern-media-controls/tracks-support/off-text-track.html:
* media/modern-media-controls/tracks-support/show-contextmenu-then-double-click-on-tracks-button.html:
* media/modern-media-controls/tracks-support/text-track-selected-via-media-api.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (276821 => 276822)


--- trunk/LayoutTests/ChangeLog	2021-04-29 23:41:09 UTC (rev 276821)
+++ trunk/LayoutTests/ChangeLog	2021-04-29 23:44:29 UTC (rev 276822)
@@ -1,3 +1,50 @@
+2021-04-29  Aditya Keerthi  <[email protected]>
+
+        REGRESSION: [iOS] 6 media/modern-media-controls/tracks-support/ tests timing out
+        https://bugs.webkit.org/show_bug.cgi?id=225202
+        <rdar://problem/77041631>
+
+        Reviewed by Devin Rousso.
+
+        The six tests modified in this patch were failing for two reasons:
+
+        1. The media controls logic was modified to hide certain controls at
+        smaller widths. To ensure the tracks button was visible, the width
+        of the <video> element was increased. However, on iOS, this led to the
+        tracks button being positioned outside the viewport. Consequently, any
+        attempts to tap the button and wait for a context menu to show up
+        would fail, causing the tests to timeout waiting for a context menu.
+
+        To fix (1), call Element.scrollIntoViewIfNeeded before attempting to
+        tap on the tracks button, ensuring it is visible in the viewport. Then,
+        use window coordinates to tap at the right position. To ensure the
+        viewport is actually scrollable on iOS, "useFlexibleViewport" and the
+        viewport meta tag were added to failing tests.
+
+        2. Even after fixing (1), the tests continued to timeout. Note that
+        both the pressOnElement() and getTracksContextMenu() helper methods
+        in "media-controls-utils.js" call into UIScriptController, and are
+        called in succession in the failing tests. Both methods add callbacks
+        to the test runner. However, pressOnElement() is not an async method,
+        which lead to getTracksContextMenu() getting called before the tap
+        actually completed. UIScriptController clears all callbacks after one
+        callback completes, so when the tap callback was completed, the context
+        menu callback was removed. Then, the tests get stuck waiting on the
+        context menu callback to get invoked.
+
+        To fix (2), make pressOnElement() return a promise if a continuation
+        function is not provided. Then, getTracksContextMenu() can be called
+        after the promise is resolved.
+
+        * media/modern-media-controls/resources/media-controls-utils.js:
+        (pressOnElement):
+        * media/modern-media-controls/tracks-support/auto-text-track.html:
+        * media/modern-media-controls/tracks-support/click-track-in-contextmenu.html:
+        * media/modern-media-controls/tracks-support/hidden-tracks.html:
+        * media/modern-media-controls/tracks-support/off-text-track.html:
+        * media/modern-media-controls/tracks-support/show-contextmenu-then-double-click-on-tracks-button.html:
+        * media/modern-media-controls/tracks-support/text-track-selected-via-media-api.html:
+
 2021-04-29  Zalan Bujtas  <[email protected]>
 
         Floating object are not removed from the initial containing block

Modified: trunk/LayoutTests/media/modern-media-controls/resources/media-controls-utils.js (276821 => 276822)


--- trunk/LayoutTests/media/modern-media-controls/resources/media-controls-utils.js	2021-04-29 23:41:09 UTC (rev 276821)
+++ trunk/LayoutTests/media/modern-media-controls/resources/media-controls-utils.js	2021-04-29 23:44:29 UTC (rev 276822)
@@ -48,21 +48,25 @@
 
 function pressOnElement(element, continuation)
 {
-    if (typeof continuation !== "function")
-        continuation = new Function;
+    let promise = null;
+    if (typeof continuation !== "function") {
+        promise = new Promise((resolve, reject) => {
+            continuation = resolve;
+        });
+    }
 
+    element.scrollIntoViewIfNeeded(false);
+
     const bounds = element.getBoundingClientRect();
     if (bounds.width === 0 || bounds.height === 0)
         return false;
 
-    const centerX = bounds.left + bounds.width / 2;
-    const centerY = bounds.top + bounds.height / 2;
+    const centerX = window.scrollX + bounds.left + bounds.width / 2;
+    const centerY = window.scrollY + bounds.top + bounds.height / 2;
 
-    // debug(`Trying to press on &lt;${element.localName} class="${element.className}"> at ${centerX}x${centerY}.`);
-
     pressAtPoint(centerX, centerY, continuation);
 
-    return true;
+    return promise || true;
 }
 
 function pressAtPoint(x, y, continuation)

Modified: trunk/LayoutTests/media/modern-media-controls/tracks-support/auto-text-track.html (276821 => 276822)


--- trunk/LayoutTests/media/modern-media-controls/tracks-support/auto-text-track.html	2021-04-29 23:41:09 UTC (rev 276821)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/auto-text-track.html	2021-04-29 23:44:29 UTC (rev 276822)
@@ -1,4 +1,5 @@
-<!DOCTYPE html>
+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<meta name="viewport" content="width=device-width">
 <script src=""
 <script src=""
 <script src=""
@@ -26,10 +27,9 @@
             window.internals.setCaptionDisplayMode("automatic");
 
             debug("Tapping tracks button...");
-            let [contextmenu] = await Promise.all([
-                getTracksContextMenu(),
-                pressOnElement(shadowRoot.querySelector("button.tracks")),
-            ]);
+            await pressOnElement(shadowRoot.querySelector("button.tracks"));
+            contextmenu = await getTracksContextMenu();
+
             let subtitlesMenu = contextmenu[0].children.find((submenu) => submenu.title === "Subtitles");
             if (subtitlesMenu?.children?.length) {
                 await UIHelper.chooseMenuAction(subtitlesMenu.title);

Modified: trunk/LayoutTests/media/modern-media-controls/tracks-support/click-track-in-contextmenu.html (276821 => 276822)


--- trunk/LayoutTests/media/modern-media-controls/tracks-support/click-track-in-contextmenu.html	2021-04-29 23:41:09 UTC (rev 276821)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/click-track-in-contextmenu.html	2021-04-29 23:44:29 UTC (rev 276822)
@@ -1,4 +1,5 @@
-<!DOCTYPE html>
+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<meta name="viewport" content="width=device-width">
 <script src=""
 <script src=""
 <script src=""

Modified: trunk/LayoutTests/media/modern-media-controls/tracks-support/hidden-tracks.html (276821 => 276822)


--- trunk/LayoutTests/media/modern-media-controls/tracks-support/hidden-tracks.html	2021-04-29 23:41:09 UTC (rev 276821)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/hidden-tracks.html	2021-04-29 23:44:29 UTC (rev 276822)
@@ -1,4 +1,5 @@
-<!DOCTYPE html>
+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<meta name="viewport" content="width=device-width">
 <script src=""
 <script src=""
 <script src=""
@@ -27,10 +28,9 @@
                 textTrack.mode = "hidden";
 
             debug("Tapping tracks button...");
-            let [contextmenu] = await Promise.all([
-                getTracksContextMenu(),
-                pressOnElement(shadowRoot.querySelector("button.tracks")),
-            ]);
+            await pressOnElement(shadowRoot.querySelector("button.tracks"));
+            contextmenu = await getTracksContextMenu();
+
             let subtitlesMenu = contextmenu[0].children.find((submenu) => submenu.title === "Subtitles");
             if (subtitlesMenu?.children?.length) {
                 await UIHelper.chooseMenuAction(subtitlesMenu.title);

Modified: trunk/LayoutTests/media/modern-media-controls/tracks-support/off-text-track.html (276821 => 276822)


--- trunk/LayoutTests/media/modern-media-controls/tracks-support/off-text-track.html	2021-04-29 23:41:09 UTC (rev 276821)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/off-text-track.html	2021-04-29 23:44:29 UTC (rev 276822)
@@ -1,4 +1,5 @@
-<!DOCTYPE html>
+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<meta name="viewport" content="width=device-width">
 <script src=""
 <script src=""
 <script src=""
@@ -23,10 +24,9 @@
     shouldBecomeDifferent("shadowRoot.querySelector('button.tracks')", "null", () => {
         shouldBecomeDifferent("shadowRoot.querySelector('button.tracks').getBoundingClientRect().width", "0", async () => {
             debug("Tapping tracks button...");
-            let [contextmenu] = await Promise.all([
-                getTracksContextMenu(),
-                pressOnElement(shadowRoot.querySelector("button.tracks")),
-            ]);
+            await pressOnElement(shadowRoot.querySelector("button.tracks"));
+            contextmenu = await getTracksContextMenu();
+
             let subtitlesMenu = contextmenu[0].children.find((submenu) => submenu.title === "Subtitles");
             if (subtitlesMenu?.children?.length) {
                 await UIHelper.chooseMenuAction(subtitlesMenu.title);

Modified: trunk/LayoutTests/media/modern-media-controls/tracks-support/show-contextmenu-then-double-click-on-tracks-button.html (276821 => 276822)


--- trunk/LayoutTests/media/modern-media-controls/tracks-support/show-contextmenu-then-double-click-on-tracks-button.html	2021-04-29 23:41:09 UTC (rev 276821)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/show-contextmenu-then-double-click-on-tracks-button.html	2021-04-29 23:44:29 UTC (rev 276822)
@@ -1,4 +1,5 @@
-<!DOCTYPE html>
+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<meta name="viewport" content="width=device-width">
 <script src=""
 <script src=""
 <script src=""
@@ -21,31 +22,23 @@
     shouldBecomeDifferent("shadowRoot.querySelector('button.tracks')", "null", () => {
         shouldBecomeDifferent("shadowRoot.querySelector('button.tracks').getBoundingClientRect().width", "0", async () => {
             debug("Tapping tracks button...");
-            await Promise.all([
-                UIHelper.waitForContextMenuToShow(),
-                pressOnElement(shadowRoot.querySelector("button.tracks")),
-            ]);
+            await pressOnElement(shadowRoot.querySelector("button.tracks"));
+            await UIHelper.waitForContextMenuToShow();
             debug("Context menu shown.");
 
             debug("Tapping tracks button...");
-            await Promise.all([
-                UIHelper.waitForContextMenuToHide(),
-                pressOnElement(shadowRoot.querySelector("button.tracks")),
-            ]);
+            await pressOnElement(shadowRoot.querySelector("button.tracks"));
+            await UIHelper.waitForContextMenuToHide();
             debug("Context menu hidden.");
 
             debug("Tapping tracks button...");
-            await Promise.all([
-                UIHelper.waitForContextMenuToShow(),
-                pressOnElement(shadowRoot.querySelector("button.tracks")),
-            ]);
+            await pressOnElement(shadowRoot.querySelector("button.tracks"));
+            await UIHelper.waitForContextMenuToShow();
             debug("Context menu shown.");
 
             debug("Tapping tracks button...");
-            await Promise.all([
-                UIHelper.waitForContextMenuToHide(),
-                pressOnElement(shadowRoot.querySelector("button.tracks")),
-            ]);
+            await pressOnElement(shadowRoot.querySelector("button.tracks"));
+            await UIHelper.waitForContextMenuToHide();
             debug("Context menu hidden.");
 
             media.remove();

Modified: trunk/LayoutTests/media/modern-media-controls/tracks-support/text-track-selected-via-media-api.html (276821 => 276822)


--- trunk/LayoutTests/media/modern-media-controls/tracks-support/text-track-selected-via-media-api.html	2021-04-29 23:41:09 UTC (rev 276821)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/text-track-selected-via-media-api.html	2021-04-29 23:44:29 UTC (rev 276822)
@@ -1,4 +1,5 @@
-<!DOCTYPE html>
+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<meta name="viewport" content="width=device-width">
 <script src=""
 <script src=""
 <script src=""
@@ -36,10 +37,9 @@
 
             {
                 debug("Tapping tracks button...");
-                [contextmenu] = await Promise.all([
-                    getTracksContextMenu(),
-                    pressOnElement(shadowRoot.querySelector("button.tracks")),
-                ]);
+                await pressOnElement(shadowRoot.querySelector("button.tracks"));
+                contextmenu = await getTracksContextMenu();
+
                 let subtitlesMenu = contextmenu[0].children.find((submenu) => submenu.title === "Subtitles");
                 if (subtitlesMenu?.children?.length) {
                     await UIHelper.chooseMenuAction(subtitlesMenu.title);
@@ -59,10 +59,9 @@
 
             {
                 debug("Tapping tracks button...");
-                [contextmenu] = await Promise.all([
-                    getTracksContextMenu(),
-                    pressOnElement(shadowRoot.querySelector("button.tracks")),
-                ]);
+                await pressOnElement(shadowRoot.querySelector("button.tracks"));
+                contextmenu = await getTracksContextMenu();
+
                 let subtitlesMenu = contextmenu[0].children.find((submenu) => submenu.title === "Subtitles");
                 if (subtitlesMenu?.children?.length) {
                     await UIHelper.chooseMenuAction(subtitlesMenu.title);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to