Bug 1446264 part 5 - Add test for this bug. r?bz
MozReview-Commit-ID: DS2ucDd0Met
--- a/toolkit/content/tests/chrome/chrome.ini
+++ b/toolkit/content/tests/chrome/chrome.ini
@@ -109,16 +109,18 @@ subsuite = clipboard
[test_findbar_events.xul]
[test_focus_anons.xul]
[test_hiddenitems.xul]
[test_hiddenpaging.xul]
[test_keys.xul]
[test_labelcontrol.xul]
[test_largemenu.xul]
skip-if = os == 'linux' && !debug # Bug 1207174
+[test_maximized_persist.xul]
+support-files = window_maximized_persist.xul
[test_menu.xul]
[test_menu_anchored.xul]
[test_menu_withcapture.xul]
[test_menu_hide.xul]
[test_menuchecks.xul]
[test_menuitem_blink.xul]
[test_menuitem_commands.xul]
[test_menulist.xul]
new file mode 100644
--- /dev/null
+++ b/toolkit/content/tests/chrome/test_maximized_persist.xul
@@ -0,0 +1,148 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
+<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
+<window title="Window Open Test"
+ onload="runTest()"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+<script type="application/javascript"
+ src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
+<script type="application/javascript"
+ src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
+<script class="testbody" type="application/javascript"><![CDATA[
+ SimpleTest.waitForExplicitFinish();
+ const WIDTH = 300;
+ const HEIGHT = 300;
+
+ 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.openDialog("window_maximized_persist.xul",
+ null, "chrome,dialog=no,all," + features);
+ }
+
+ 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() {
+ 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();
+
+ // Linux doesn't seem to persist sizemode across opening window
+ // with specified size, so mark it expected fail for now.
+ let todo = navigator.platform.includes('Linux');
+ let checkWindowMayFail = todo ? 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.
+ let XULStore = Cc["@mozilla.org/xul/xulstore;1"].getService(Ci.nsIXULStore);
+ XULStore.removeDocument(chrome_url);
+
+ SimpleTest.finish();
+ }
+]]></script>
+<body xmlns="http://www.w3.org/1999/xhtml">
+<p id="display">
+</p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+</pre>
+</body>
+</window>
new file mode 100644
--- /dev/null
+++ b/toolkit/content/tests/chrome/window_maximized_persist.xul
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
+<window title="Window Open Test"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ height="300"
+ width="300"
+ sizemode="normal"
+ id="window"
+ persist="height width sizemode">
+<script type="application/javascript"><![CDATA[
+ window.addEventListener("sizemodechange", evt => {
+ opener.postMessage("sizemodechange", "*");
+ });
+]]></script>
+</window>