summaryrefslogtreecommitdiffstats
path: root/widget/tests/test_sizemode_events.xhtml
blob: bd1e3a38d1aeefcbbf725a2da79436f6b931bd23 (plain)
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
142
143
144
145
146
147
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="Test for bug 715867"
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />

<body  xmlns="http://www.w3.org/1999/xhtml">
<p id="display"></p>
<div id="content" style="display: none">

</div>
<pre id="test">
</pre>
</body>

<script class="testbody">
<![CDATA[

const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

let gWindow = null;

const kIsLinux = navigator.platform.includes("Lin");
const kIsMacOS = navigator.platform.includes("Mac");
// On Linux and macOS sizemode changes might be async.
const kAsyncChanges = kIsLinux || kIsMacOS;

let gSizeModeDidChange = false;
let gSizeModeDidChangeTo = 0;

function sizemodeChanged(e) {
  gSizeModeDidChange = true;
  gSizeModeDidChangeTo = gWindow.windowState;
}

async function expectSizeModeChange(newMode, duringActionCallback) {
  gSizeModeDidChange = false;

  let promise = null;
  if (kAsyncChanges) {
    if (newMode) {
      promise = new Promise(resolve => {
        gWindow.addEventListener("sizemodechange", function() {
          SimpleTest.executeSoon(resolve);
        }, { once: true })
      });
    } else {
      promise = new Promise(SimpleTest.executeSoon);
    }
  }

  duringActionCallback();

  if (promise) {
    await promise;
  }

  if (newMode == 0) {
    // No change should have taken place, no event should have fired.
    ok(!gSizeModeDidChange, "No sizemodechange event should have fired.");
  } else {
    // Size mode change event was expected to fire.
    ok(gSizeModeDidChange, "A sizemodechanged event should have fired.");
    is(gSizeModeDidChangeTo, newMode, "The new sizemode should have the expected value.");
    const expectedHidden = newMode == gWindow.STATE_MINIMIZED || gWindow.isFullyOccluded;
    if (gWindow.document.hidden != expectedHidden) {
      await new Promise(resolve => {
        gWindow.addEventListener("visibilitychange", resolve, { once: true });
      });
    }
    is(gWindow.document.hidden, expectedHidden, "Should be inactive if minimized or occluded.");
  }
}

function startTest() {
  openWindow();
}

function openWindow() {
  gWindow = window.browsingContext.topChromeWindow
                  .open('empty_window.xhtml', '_blank', 'chrome,screenX=50,screenY=50,width=200,height=200,resizable');
  SimpleTest.waitForFocus(runTest, gWindow);
}

async function runTest() {
  // Install event handler.
  gWindow.addEventListener("sizemodechange", sizemodeChanged);

  // Run tests.
  info("Testing minimize()");
  await expectSizeModeChange(gWindow.STATE_MINIMIZED, function () {
    gWindow.minimize();
  });

  info("Testing restore() after minimize()");
  await expectSizeModeChange(gWindow.STATE_NORMAL, function () {
    gWindow.restore();
  });

  info("Testing maximize()");
  await expectSizeModeChange(gWindow.STATE_MAXIMIZED, function () {
    gWindow.maximize();
  });

  info("Testing restore() after maximize()");
  await expectSizeModeChange(gWindow.STATE_NORMAL, function () {
    gWindow.restore();
  });

  // Normal window resizing shouldn't fire a sizemodechanged event, bug 715867.
  info("Testing resizeTo() horizontal");
  await expectSizeModeChange(0, function () {
    gWindow.resizeTo(gWindow.outerWidth + 10, gWindow.outerHeight);
  });

  info("Testing resizeTo() vertical");
  await expectSizeModeChange(0, function () {
    gWindow.resizeTo(gWindow.outerWidth, gWindow.outerHeight + 10);
  });

  // Resizing a maximized window should change to normal sizemode.
  info("maximize() in preparation for resize");
  await expectSizeModeChange(gWindow.STATE_MAXIMIZED, function () {
    gWindow.maximize();
  });

  info("Testing resizeTo() from maximized");
  await expectSizeModeChange(gWindow.STATE_NORMAL, function () {
    // MacOS treats windows close to the available screen size as maximized.
    // Shrinking the window by only 10px isn't enough to change the sizemode.
    gWindow.resizeTo(gWindow.outerWidth / 2, gWindow.outerHeight / 2);
  });

  gWindow.removeEventListener("sizemodechange", sizemodeChanged);
  gWindow.close();
  SimpleTest.finish();
}

SimpleTest.waitForExplicitFinish();
SimpleTest.waitForFocus(startTest);

]]>
</script>

</window>