Merge mozilla-central to autoland. CLOSED TREE
[gecko.git] / widget / tests / test_sizemode_events.xhtml
blobc1224fbf7003fc5284c61c91aa56d9aa5b4c0fb2
1 <?xml version="1.0"?>
2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?>
3 <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
4 type="text/css"?>
5 <window title="Test for bug 715867"
6 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
8 <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
10 <body xmlns="http://www.w3.org/1999/xhtml">
11 <p id="display"></p>
12 <div id="content" style="display: none">
14 </div>
15 <pre id="test">
16 </pre>
17 </body>
19 <script class="testbody">
20 <![CDATA[
22 const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
24 let gWindow = null;
26 const kIsLinux = navigator.platform.includes("Lin");
27 const kIsMacOS = navigator.platform.includes("Mac");
28 // On Linux and macOS sizemode changes might be async.
29 const kAsyncChanges = kIsLinux || kIsMacOS;
31 let gSizeModeDidChange = false;
32 let gSizeModeDidChangeTo = 0;
34 function sizemodeChanged() {
35 gSizeModeDidChange = true;
36 gSizeModeDidChangeTo = gWindow.windowState;
39 async function expectSizeModeChange(newMode, duringActionCallback) {
40 gSizeModeDidChange = false;
42 let promise = null;
43 if (kAsyncChanges) {
44 if (newMode) {
45 promise = new Promise(resolve => {
46 gWindow.addEventListener("sizemodechange", function() {
47 SimpleTest.executeSoon(resolve);
48 }, { once: true })
49 });
50 } else {
51 promise = new Promise(SimpleTest.executeSoon);
55 duringActionCallback();
57 if (promise) {
58 await promise;
61 if (newMode == 0) {
62 // No change should have taken place, no event should have fired.
63 ok(!gSizeModeDidChange, "No sizemodechange event should have fired.");
64 } else {
65 // Size mode change event was expected to fire.
66 ok(gSizeModeDidChange, "A sizemodechanged event should have fired.");
67 is(gSizeModeDidChangeTo, newMode, "The new sizemode should have the expected value.");
68 const expectedHidden = newMode == gWindow.STATE_MINIMIZED || gWindow.isFullyOccluded;
69 if (gWindow.document.hidden != expectedHidden) {
70 await new Promise(resolve => {
71 gWindow.addEventListener("visibilitychange", resolve, { once: true });
72 });
74 is(gWindow.document.hidden, expectedHidden, "Should be inactive if minimized or occluded.");
78 function startTest() {
79 openWindow();
82 function openWindow() {
83 gWindow = window.browsingContext.topChromeWindow
84 .open('empty_window.xhtml', '_blank', 'chrome,screenX=50,screenY=50,width=200,height=200,resizable');
85 SimpleTest.waitForFocus(runTest, gWindow);
88 async function runTest() {
89 // Install event handler.
90 gWindow.addEventListener("sizemodechange", sizemodeChanged);
92 // Run tests.
93 info("Testing minimize()");
94 await expectSizeModeChange(gWindow.STATE_MINIMIZED, function () {
95 gWindow.minimize();
96 });
98 info("Testing restore() after minimize()");
99 await expectSizeModeChange(gWindow.STATE_NORMAL, function () {
100 gWindow.restore();
103 info("Testing maximize()");
104 await expectSizeModeChange(gWindow.STATE_MAXIMIZED, function () {
105 gWindow.maximize();
108 info("Testing restore() after maximize()");
109 await expectSizeModeChange(gWindow.STATE_NORMAL, function () {
110 gWindow.restore();
113 // Normal window resizing shouldn't fire a sizemodechanged event, bug 715867.
114 info("Testing resizeTo() horizontal");
115 await expectSizeModeChange(0, function () {
116 gWindow.resizeTo(gWindow.outerWidth + 10, gWindow.outerHeight);
119 info("Testing resizeTo() vertical");
120 await expectSizeModeChange(0, function () {
121 gWindow.resizeTo(gWindow.outerWidth, gWindow.outerHeight + 10);
124 // Resizing a maximized window should change to normal sizemode.
125 info("maximize() in preparation for resize");
126 await expectSizeModeChange(gWindow.STATE_MAXIMIZED, function () {
127 gWindow.maximize();
130 info("Testing resizeTo() from maximized");
131 await expectSizeModeChange(gWindow.STATE_NORMAL, function () {
132 // MacOS treats windows close to the available screen size as maximized.
133 // Shrinking the window by only 10px isn't enough to change the sizemode.
134 gWindow.resizeTo(gWindow.outerWidth / 2, gWindow.outerHeight / 2);
137 gWindow.removeEventListener("sizemodechange", sizemodeChanged);
138 gWindow.close();
139 SimpleTest.finish();
142 SimpleTest.waitForExplicitFinish();
143 SimpleTest.waitForFocus(startTest);
146 </script>
148 </window>