Bug 1464908 - Wait for MozAfterPaint on new windows before requesting fullscreen. r?xidorn draft
authorKartikaya Gupta <kgupta@mozilla.com>
Mon, 28 May 2018 17:53:44 -0400
changeset 800668 13435e4ab3674dacfdf75d33aca6f0bef7e464ba
parent 800667 7ee2efa7b194151cc8e0996731bfedb372563999
push id111440
push userkgupta@mozilla.com
push dateMon, 28 May 2018 21:58:44 +0000
reviewersxidorn
bugs1464908
milestone62.0a1
Bug 1464908 - Wait for MozAfterPaint on new windows before requesting fullscreen. r?xidorn New windows cannot execute fullscreen requests until after the first MozAfterPaint event has been fired on the window, because some of the machinery in browser-fullScreenAndPointerLock.js isn't initialized until that point. This test exercises that behaviour, and therefore should also wait until the first MozAfterPaint before requesting fullscreen. MozReview-Commit-ID: Igy7WfjslWA
dom/html/test/test_fullscreen-api-race.html
--- a/dom/html/test/test_fullscreen-api-race.html
+++ b/dom/html/test/test_fullscreen-api-race.html
@@ -40,20 +40,28 @@ addLoadEvent(function () {
       ["security.data_uri.unique_opaque_origin", false],
       ["security.data_uri.block_toplevel_data_uri_navigations", false],
     ]
   }, next);
 });
 
 const OPEN_WINDOW_FUNCS = [
   function openNewTab() {
-    return window.open("about:blank");
+    return new Promise(resolve => {
+      var win = window.open("about:blank");
+      resolve(win);
+    });
   },
   function openNewWindow() {
-    return window.open("about:blank", "", "width=300,height=200");
+    return new Promise(resolve => {
+      var win = window.open("about:blank", "", "width=300,height=200");
+      win.addEventListener("MozAfterPaint", () => {
+        resolve(win);
+      }, { once: true });
+    });
   }
 ];
 
 const ACTION_FUNCS = [
   function navigate(win) {
     info("About to navigate to another page");
     var deferred = new Deferred();
     win.location = "data:text/html,<html>";
@@ -100,50 +108,52 @@ function* testGenerator() {
     for (var actionFunc of ACTION_FUNCS) {
       info(`Testing ${openWinFunc.name}, ${actionFunc.name}`);
       yield { openWinFunc: openWinFunc, actionFunc: actionFunc };
     }
   }
 }
 
 function runTest(test) {
-  var win = test.openWinFunc();
-  return new Promise(resolve => {
-    SimpleTest.waitForFocus(resolve, win, true);
-  }).then(() => {
+  var winPromise = test.openWinFunc();
+  return winPromise.then((win) => {
+    return new Promise(resolve => {
+      SimpleTest.waitForFocus(() => resolve(win), win, true);
+    });
+  }).then((win) => {
     return new Promise((resolve, reject) => {
       var retried = false;
       function listener(evt) {
         if (!retried && evt.type == "fullscreenerror") {
           todo(false, "Failed to enter fullscreen, but try again");
           retried = true;
           SimpleTest.waitForFocus(() => {
             win.document.documentElement.requestFullscreen();
           }, win, true);
           return;
         }
         win.removeEventListener("fullscreenchange", listener);
         win.removeEventListener("fullscreenerror", listener);
         is(evt.type, "fullscreenchange", "Should get fullscreenchange");
         ok(win.document.fullscreenElement, "Should have entered fullscreen");
         ok(win.fullScreen, "The window should be in fullscreen");
-        test.actionFunc(win).then(resolve);
+        test.actionFunc(win).then(() => resolve(win));
       }
       if (win.fullScreen) {
         todo(false, "Should not open in fullscreen mode");
         win.close();
         reject();
         return;
       }
       info("About to enter fullscreen");
       win.addEventListener("fullscreenchange", listener);
       win.addEventListener("fullscreenerror", listener);
       win.document.documentElement.requestFullscreen();
     });
-  }).then(() => {
+  }).then((win) => {
     ok(win.closed, "The window should have been closed");
   });
 }
 
 var tests = testGenerator();
 
 function next() {
   var test = tests.next().value;