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
--- 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;