- 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 <${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);