1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
SimpleTest.waitForExplicitFinish();
const WIDTH = 300;
const HEIGHT = 300;
let gWindow;
let gTitlebar;
function promiseMessage(msg) {
info(`wait for message "${msg}"`);
return new Promise(resolve => {
function listener(evt) {
info(`got message "${evt.data}"`);
if (evt.data == msg) {
window.removeEventListener("message", listener);
resolve();
}
}
window.addEventListener("message", listener);
});
}
function openWindow(features = "") {
return window.browsingContext.topChromeWindow.openDialog(
gWindow,
"_blank",
"chrome,dialog=no,all," + features,
window
);
}
function checkWindow(msg, win, sizemode, width, height) {
is(win.windowState, sizemode, "sizemode should match " + msg);
if (sizemode == win.STATE_NORMAL) {
is(win.innerWidth, width, "width should match " + msg);
is(win.innerHeight, height, "height should match " + msg);
}
}
function todoCheckWindow(msg, win, sizemode) {
todo_is(win.windowState, sizemode, "sizemode should match " + msg);
}
// Persistence of "sizemode" is delayed to 500ms after it's changed.
// See SIZE_PERSISTENCE_TIMEOUT in nsWebShellWindow.cpp.
// We wait for 1000ms to ensure that it is actually persisted.
// We can also wait for condition that XULStore does have the value
// set, but that way we cannot test the cases where we don't expect
// persistence to happen.
function waitForSizeModePersisted() {
return new Promise(resolve => {
setTimeout(resolve, 1000);
});
}
async function changeSizeMode(func) {
let promiseSizeModeChange = promiseMessage("sizemodechange");
func();
await promiseSizeModeChange;
await waitForSizeModePersisted();
}
async function runTest(aWindow) {
gWindow = aWindow;
gTitlebar = aWindow != "window_maximized_persist_with_no_titlebar.xhtml";
let win = openWindow();
await SimpleTest.promiseFocus(win);
// Check the default state.
const chrome_url = win.location.href;
checkWindow("when open initially", win, win.STATE_NORMAL, WIDTH, HEIGHT);
const widthDiff = win.outerWidth - win.innerWidth;
const heightDiff = win.outerHeight - win.innerHeight;
// Maximize the window.
await changeSizeMode(() => win.maximize());
checkWindow("after maximize window", win, win.STATE_MAXIMIZED);
win.close();
// Open a new window to check persisted sizemode.
win = openWindow();
await SimpleTest.promiseFocus(win);
checkWindow("when reopen to maximized", win, win.STATE_MAXIMIZED);
// Restore the window.
if (win.windowState == win.STATE_MAXIMIZED) {
await changeSizeMode(() => win.restore());
}
checkWindow("after restore window", win, win.STATE_NORMAL, WIDTH, HEIGHT);
win.close();
// Open a new window again to check persisted sizemode.
win = openWindow();
await SimpleTest.promiseFocus(win);
checkWindow("when reopen to normal", win, win.STATE_NORMAL, WIDTH, HEIGHT);
// And maximize the window again for next test.
await changeSizeMode(() => win.maximize());
win.close();
// Open a new window again with centerscreen which shouldn't revert
// the persisted sizemode.
win = openWindow("centerscreen");
await SimpleTest.promiseFocus(win);
checkWindow("when open with centerscreen", win, win.STATE_MAXIMIZED);
win.close();
// Linux doesn't seem to persist sizemode across opening window
// with specified size, so mark it expected fail for now.
const isLinux = navigator.platform.includes("Linux");
let checkWindowMayFail = isLinux ? todoCheckWindow : checkWindow;
// Open a new window with size specified.
win = openWindow("width=400,height=400");
await SimpleTest.promiseFocus(win);
checkWindow("when reopen with size", win, win.STATE_NORMAL, 400, 400);
await waitForSizeModePersisted();
win.close();
// Open a new window without size specified.
// The window opened before should not change persisted sizemode.
win = openWindow();
await SimpleTest.promiseFocus(win);
checkWindowMayFail("when reopen without size", win, win.STATE_MAXIMIZED);
win.close();
// Open a new window with sizing synchronously.
win = openWindow();
win.resizeTo(500 + widthDiff, 500 + heightDiff);
await SimpleTest.promiseFocus(win);
checkWindow("when sized synchronously", win, win.STATE_NORMAL, 500, 500);
await waitForSizeModePersisted();
win.close();
// Open a new window without any sizing.
// The window opened before should not change persisted sizemode.
win = openWindow();
await SimpleTest.promiseFocus(win);
checkWindowMayFail("when reopen without sizing", win, win.STATE_MAXIMIZED);
win.close();
// Clean up the XUL store for the given window.
Services.xulStore.removeDocument(chrome_url);
SimpleTest.finish();
}
|