2 <?xml-stylesheet href=
"chrome://global/skin" type=
"text/css"?>
3 <?xml-stylesheet href=
"chrome://mochikit/content/tests/SimpleTest/test.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">
12 <div id=
"content" style=
"display: none">
19 <script class=
"testbody">
22 const XUL_NS =
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
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;
45 promise = new Promise(resolve =
> {
46 gWindow.addEventListener(
"sizemodechange", function() {
47 SimpleTest.executeSoon(resolve);
51 promise = new Promise(SimpleTest.executeSoon);
55 duringActionCallback();
62 // No change should have taken place, no event should have fired.
63 ok(!gSizeModeDidChange,
"No sizemodechange event should have fired.");
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 });
74 is(gWindow.document.hidden, expectedHidden,
"Should be inactive if minimized or occluded.");
78 function startTest() {
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);
93 info(
"Testing minimize()");
94 await expectSizeModeChange(gWindow.STATE_MINIMIZED, function () {
98 info(
"Testing restore() after minimize()");
99 await expectSizeModeChange(gWindow.STATE_NORMAL, function () {
103 info(
"Testing maximize()");
104 await expectSizeModeChange(gWindow.STATE_MAXIMIZED, function () {
108 info(
"Testing restore() after maximize()");
109 await expectSizeModeChange(gWindow.STATE_NORMAL, function () {
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 () {
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);
142 SimpleTest.waitForExplicitFinish();
143 SimpleTest.waitForFocus(startTest);