/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const isMac = AppConstants.platform ==
"macosx";
const isWin = AppConstants.platform ==
"win";
async
function waitForSizeMode(aWindow, aSizeMode) {
await BrowserTestUtils.waitForEvent(aWindow,
"sizemodechange",
false, () => {
return aWindow.windowState === aSizeMode;
});
const expectedHidden =
aSizeMode == aWindow.STATE_MINIMIZED || aWindow.isFullyOccluded;
if (aWindow.document.hidden != expectedHidden) {
await BrowserTestUtils.waitForEvent(aWindow,
"visibilitychange");
}
is(
aWindow.document.hidden,
expectedHidden,
"Should be inactive if minimized or occluded"
);
}
async
function checkSizeModeAndFullscreenState(
aWindow,
aSizeMode,
aFullscreen,
aFullscreenEventShouldHaveFired,
aStepFun
) {
let promises = [];
if (aWindow.windowState != aSizeMode) {
promises.push(waitForSizeMode(aWindow, aSizeMode));
}
if (aFullscreenEventShouldHaveFired) {
promises.push(
BrowserTestUtils.waitForEvent(
aWindow,
aFullscreen ?
"willenterfullscreen" :
"willexitfullscreen"
)
);
promises.push(BrowserTestUtils.waitForEvent(aWindow,
"fullscreen"));
}
// Add listener for unexpected event.
let unexpectedEventListener = aEvent => {
ok(
false, `should not receive ${aEvent.type} event`);
};
if (aFullscreenEventShouldHaveFired) {
aWindow.addEventListener(
aFullscreen ?
"willexitfullscreen" :
"willenterfullscreen",
unexpectedEventListener
);
}
else {
aWindow.addEventListener(
"willenterfullscreen", unexpectedEventListener);
aWindow.addEventListener(
"willexitfullscreen", unexpectedEventListener);
aWindow.addEventListener(
"fullscreen", unexpectedEventListener);
}
let eventPromise = Promise.all(promises);
aStepFun();
await eventPromise;
// Check SizeMode.
is(
aWindow.windowState,
aSizeMode,
"The new sizemode should have the expected value"
);
// Check Fullscreen state.
is(
aWindow.fullScreen,
aFullscreen,
`chrome window should ${aFullscreen ?
"be" :
"not be"} in fullscreen`
);
is(
aWindow.document.documentElement.hasAttribute(
"inFullscreen"),
aFullscreen,
`chrome documentElement should ${
aFullscreen ?
"have" :
"not have"
} inFullscreen attribute`
);
// Remove listener for unexpected event.
if (aFullscreenEventShouldHaveFired) {
aWindow.removeEventListener(
aFullscreen ?
"willexitfullscreen" :
"willenterfullscreen",
unexpectedEventListener
);
}
else {
aWindow.removeEventListener(
"willenterfullscreen", unexpectedEventListener);
aWindow.removeEventListener(
"willexitfullscreen", unexpectedEventListener);
aWindow.removeEventListener(
"fullscreen", unexpectedEventListener);
}
}
async
function restoreWindowToNormal(aWindow) {
while (aWindow.windowState != aWindow.STATE_NORMAL) {
info(`
Try to restore window with state ${aWindow.windowState} to normal`);
let eventPromise = BrowserTestUtils.waitForEvent(aWindow,
"sizemodechange");
aWindow.restore();
await eventPromise;
info(`Window is now in state ${aWindow.windowState}`);
}
}
add_task(async
function test_fullscreen_restore() {
let win = await BrowserTestUtils.openNewBrowserWindow();
await restoreWindowToNormal(win);
info(
"Enter fullscreen");
await checkSizeModeAndFullscreenState(
win,
win.STATE_FULLSCREEN,
true,
true,
() => {
win.fullScreen =
true;
}
);
info(
"Restore window");
await checkSizeModeAndFullscreenState(
win,
win.STATE_NORMAL,
false,
true,
() => {
win.restore();
}
);
await BrowserTestUtils.closeWindow(win);
});
// This test only enable on Windows because:
// - Test gets intermittent timeout on macOS, see bug 1828848.
// - Restoring a fullscreen window on GTK doesn't return it to the previous
// sizemode, see bug 1828837.
if (isWin) {
add_task(async
function test_maximize_fullscreen_restore() {
let win = await BrowserTestUtils.openNewBrowserWindow();
await restoreWindowToNormal(win);
info(
"Maximize window");
await checkSizeModeAndFullscreenState(
win,
win.STATE_MAXIMIZED,
false,
false,
() => {
win.maximize();
}
);
info(
"Enter fullscreen");
await checkSizeModeAndFullscreenState(
win,
win.STATE_FULLSCREEN,
true,
true,
() => {
win.fullScreen =
true;
}
);
info(
"Restore window");
await checkSizeModeAndFullscreenState(
win,
win.STATE_MAXIMIZED,
false,
true,
() => {
win.restore();
}
);
await BrowserTestUtils.closeWindow(win);
});
}
// Restoring a minimized window on macOS doesn't return it to the previous
// sizemode, see bug 1828706.
if (!isMac) {
add_task(async
function test_fullscreen_minimize_restore() {
let win = await BrowserTestUtils.openNewBrowserWindow();
await restoreWindowToNormal(win);
info(
"Enter fullscreen");
await checkSizeModeAndFullscreenState(
win,
win.STATE_FULLSCREEN,
true,
true,
() => {
win.fullScreen =
true;
}
);
info(
"Minimize window");
await checkSizeModeAndFullscreenState(
win,
win.STATE_MINIMIZED,
true,
false,
() => {
win.minimize();
}
);
info(
"Restore window");
await checkSizeModeAndFullscreenState(
win,
win.STATE_FULLSCREEN,
true,
false,
() => {
win.restore();
}
);
await BrowserTestUtils.closeWindow(win);
});
}