browser_WindowManager.js (12235B)
1 /* Any copyright is dedicated to the Public Domain. 2 https://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 const { windowManager } = ChromeUtils.importESModule( 7 "chrome://remote/content/shared/WindowManager.sys.mjs" 8 ); 9 const { WindowState } = ChromeUtils.importESModule( 10 "chrome://remote/content/shared/WindowManager.sys.mjs" 11 ); 12 13 const { AppInfo } = ChromeUtils.importESModule( 14 "chrome://remote/content/shared/AppInfo.sys.mjs" 15 ); 16 17 add_task(async function test_adjustWindowGeometry() { 18 const testWin = await BrowserTestUtils.openNewBrowserWindow(); 19 const isWayland = AppInfo.isWayland; 20 21 try { 22 await windowManager.adjustWindowGeometry(testWin, 100, 100, 800, 600); 23 is(testWin.outerWidth, 800, "Window width is set to initial value"); 24 is(testWin.outerHeight, 600, "Window height is set to initial value"); 25 26 if (!isWayland) { 27 is(testWin.screenX, 100, "Window x position is set to initial value"); 28 is(testWin.screenY, 100, "Window y position is set to initial value"); 29 } 30 31 await windowManager.adjustWindowGeometry(testWin, null, null, 640, 480); 32 is(testWin.outerWidth, 640, "Window width is updated"); 33 is(testWin.outerHeight, 480, "Window height is updated"); 34 35 if (!isWayland) { 36 is(testWin.screenX, 100, "Window x position stays at initial value"); 37 is(testWin.screenY, 100, "Window y position stays at initial value"); 38 } 39 40 await windowManager.adjustWindowGeometry(testWin, 200, 200, null, null); 41 if (!isWayland) { 42 is(testWin.screenX, 200, "Window x position is updated"); 43 is(testWin.screenY, 200, "Window y position is updated"); 44 } 45 is(testWin.outerWidth, 640, "Window width stays at previous value"); 46 is(testWin.outerHeight, 480, "Window height stays at previous value"); 47 48 await windowManager.adjustWindowGeometry(testWin, 200, 200, 560, 450); 49 is(testWin.outerWidth, 560, "Window width is updated"); 50 is(testWin.outerHeight, 450, "Window height is updated"); 51 if (!isWayland) { 52 is(testWin.screenX, 200, "Window x position is updated"); 53 is(testWin.screenY, 200, "Window y position is updated"); 54 } 55 } finally { 56 await BrowserTestUtils.closeWindow(testWin); 57 } 58 }); 59 60 add_task(async function test_adjustWindowGeometry_invalid_values() { 61 const testWin = await BrowserTestUtils.openNewBrowserWindow(); 62 const isWayland = AppInfo.isWayland; 63 64 const originalWidth = testWin.outerWidth; 65 const originalHeight = testWin.outerHeight; 66 const originalX = testWin.screenX; 67 const originalY = testWin.screenY; // codespell:ignore 68 69 let minWidth, minHeight; 70 71 try { 72 await windowManager.adjustWindowGeometry(testWin, 100, 100, 50, 50); 73 minWidth = testWin.outerWidth; 74 minHeight = testWin.outerHeight; 75 76 await windowManager.adjustWindowGeometry( 77 testWin, 78 originalWidth, 79 originalHeight, 80 originalX, 81 originalY // codespell:ignore 82 ); 83 84 await windowManager.adjustWindowGeometry(testWin, 100, 100, 100, 100); 85 is(testWin.outerWidth, minWidth, "Width is set to minimum allowed width"); 86 is( 87 testWin.outerHeight, 88 minHeight, 89 "Height is set to minimum allowed height" 90 ); 91 if (!isWayland) { 92 is(testWin.screenX, 100, "Window x-coordinate is adjusted"); 93 is(testWin.screenY, 100, "Window y-coordinate is adjusted"); 94 } 95 96 await windowManager.adjustWindowGeometry(testWin, 100, 100, 600.5, 300.7); 97 is(testWin.outerWidth, 600, "Decimal width is floored"); 98 is(testWin.outerHeight, 300, "Decimal height is floored"); 99 if (!isWayland) { 100 is(testWin.screenX, 100, "Window x-coordinate is adjusted"); 101 is(testWin.screenY, 100, "Window y-coordinate is adjusted"); 102 } 103 } finally { 104 await BrowserTestUtils.closeWindow(testWin); 105 } 106 }); 107 108 add_task(async function test_minimizeWindow() { 109 const testWin = await BrowserTestUtils.openNewBrowserWindow(); 110 111 try { 112 await windowManager.adjustWindowGeometry(testWin, 100, 100, 800, 600); 113 is(testWin.outerWidth, 800, "Window width is set to initial value"); 114 is(testWin.outerHeight, 600, "Window height is set to initial value"); 115 116 is( 117 WindowState.from(testWin.windowState), 118 WindowState.Normal, 119 "Window is initially in normal state" 120 ); 121 122 await windowManager.minimizeWindow(testWin); 123 124 is( 125 WindowState.from(testWin.windowState), 126 WindowState.Minimized, 127 "Window is minimized" 128 ); 129 130 await windowManager.minimizeWindow(testWin); 131 is( 132 WindowState.from(testWin.windowState), 133 WindowState.Minimized, 134 "Minimizing an already minimized window has no effect" 135 ); 136 } finally { 137 await BrowserTestUtils.closeWindow(testWin); 138 } 139 }); 140 141 add_task(async function test_maximizeWindow() { 142 const testWin = await BrowserTestUtils.openNewBrowserWindow(); 143 144 try { 145 await windowManager.adjustWindowGeometry(testWin, 100, 100, 800, 600); 146 is(testWin.outerWidth, 800, "Window width is set to initial value"); 147 is(testWin.outerHeight, 600, "Window height is set to initial value"); 148 149 is( 150 WindowState.from(testWin.windowState), 151 WindowState.Normal, 152 "Window is initially in normal state" 153 ); 154 155 await windowManager.maximizeWindow(testWin); 156 is( 157 WindowState.from(testWin.windowState), 158 WindowState.Maximized, 159 "Window is maximized" 160 ); 161 162 await windowManager.maximizeWindow(testWin); 163 is( 164 WindowState.from(testWin.windowState), 165 WindowState.Maximized, 166 "Maximizing an already maximized window has no effect" 167 ); 168 } finally { 169 await BrowserTestUtils.closeWindow(testWin); 170 } 171 }); 172 173 add_task(async function test_restoreWindow() { 174 const testWin = await BrowserTestUtils.openNewBrowserWindow(); 175 176 try { 177 await windowManager.maximizeWindow(testWin); 178 is( 179 WindowState.from(testWin.windowState), 180 WindowState.Maximized, 181 "Window is maximized" 182 ); 183 184 await windowManager.restoreWindow(testWin); 185 is( 186 WindowState.from(testWin.windowState), 187 WindowState.Normal, 188 "Window is restored to normal state" 189 ); 190 191 await windowManager.restoreWindow(testWin); 192 is( 193 WindowState.from(testWin.windowState), 194 WindowState.Normal, 195 "Restoring an already normal window has no effect" 196 ); 197 } finally { 198 await BrowserTestUtils.closeWindow(testWin); 199 } 200 }); 201 202 add_task(async function test_setFullscreen() { 203 const testWin = await BrowserTestUtils.openNewBrowserWindow(); 204 205 try { 206 await windowManager.adjustWindowGeometry(testWin, 100, 100, 800, 600); 207 is(testWin.outerWidth, 800, "Window width is set to initial value"); 208 is(testWin.outerHeight, 600, "Window height is set to initial value"); 209 is( 210 WindowState.from(testWin.windowState), 211 WindowState.Normal, 212 "Window is initially in normal state" 213 ); 214 215 await windowManager.setFullscreen(testWin, true); 216 is( 217 WindowState.from(testWin.windowState), 218 WindowState.Fullscreen, 219 "Window entered fullscreen mode" 220 ); 221 222 await windowManager.setFullscreen(testWin, true); 223 is( 224 WindowState.from(testWin.windowState), 225 WindowState.Fullscreen, 226 "Setting fullscreen when already in fullscreen mode has no effect" 227 ); 228 229 await windowManager.setFullscreen(testWin, false); 230 is( 231 WindowState.from(testWin.windowState), 232 WindowState.Normal, 233 "Window exited fullscreen mode and returned to normal state" 234 ); 235 236 await windowManager.setFullscreen(testWin, false); 237 is( 238 WindowState.from(testWin.windowState), 239 WindowState.Normal, 240 "Exiting fullscreen when already in normal state has no effect" 241 ); 242 } finally { 243 await BrowserTestUtils.closeWindow(testWin); 244 } 245 }); 246 247 add_task(async function test_windows() { 248 const win1 = await BrowserTestUtils.openNewBrowserWindow(); 249 const win2 = await BrowserTestUtils.openNewBrowserWindow(); 250 const win3 = await BrowserTestUtils.openNewBrowserWindow(); 251 252 const expectedWindows = [gBrowser.ownerGlobal, win1, win2, win3]; 253 254 try { 255 is( 256 windowManager.windows.length, 257 5, 258 "All browser windows and the Mochikit harness window were returned" 259 ); 260 ok( 261 expectedWindows.every(win => windowManager.windows.includes(win)), 262 "Expected windows were returned" 263 ); 264 } finally { 265 await BrowserTestUtils.closeWindow(win3); 266 await BrowserTestUtils.closeWindow(win2); 267 await BrowserTestUtils.closeWindow(win1); 268 } 269 }); 270 271 add_task(async function test_getIdForWindow() { 272 const win1 = await BrowserTestUtils.openNewBrowserWindow(); 273 const win2 = await BrowserTestUtils.openNewBrowserWindow(); 274 275 try { 276 windowManager.startTracking(); 277 278 const win1Id = windowManager.getIdForWindow(win1); 279 Assert.stringMatches( 280 win1Id, 281 uuidRegex, 282 "The first window id is a valid UUID" 283 ); 284 is( 285 windowManager.getIdForWindow(win1), 286 win1Id, 287 "getIdForWindow returns the same id when called multiple times for the same window" 288 ); 289 290 const win2Id = windowManager.getIdForWindow(win2); 291 Assert.stringMatches( 292 win2Id, 293 uuidRegex, 294 "The second window id is a valid UUID" 295 ); 296 isnot( 297 win1Id, 298 win2Id, 299 "getIdForWindow returns different ids for different windows" 300 ); 301 } finally { 302 await BrowserTestUtils.closeWindow(win2); 303 await BrowserTestUtils.closeWindow(win1); 304 305 windowManager.destroy(); 306 } 307 }); 308 309 add_task(async function test_getWindowById() { 310 windowManager.startTracking(); 311 const win = await BrowserTestUtils.openNewBrowserWindow(); 312 313 try { 314 const winId = windowManager.getIdForWindow(win); 315 is( 316 windowManager.getWindowById(winId), 317 win, 318 "getWindowById returns the correct window for a valid id" 319 ); 320 is( 321 windowManager.getWindowById("non-existent-id"), 322 undefined, 323 "getWindowById returns undefined for a non-existent id" 324 ); 325 } finally { 326 await BrowserTestUtils.closeWindow(win); 327 328 windowManager.destroy(); 329 } 330 }); 331 332 add_task(async function test_waitForChromeWindowLoaded_newBrowserWindow() { 333 const win = Services.ww.openWindow( 334 null, 335 AppConstants.BROWSER_CHROME_URL, 336 "_blank", 337 "chrome,all,dialog=no", 338 null 339 ); 340 341 try { 342 ok( 343 !win.gBrowserInit?.delayedStartupFinished, 344 "Browser window not finished delayed startup" 345 ); 346 347 await windowManager.waitForChromeWindowLoaded(win); 348 349 ok( 350 win.gBrowserInit.delayedStartupFinished, 351 "Browser window finished delayed startup" 352 ); 353 is( 354 win.document.readyState, 355 "complete", 356 "Window document is in complete state" 357 ); 358 ok( 359 !win.document.isUncommittedInitialDocument, 360 "Window document is not an uncommitted initial document" 361 ); 362 } finally { 363 await BrowserTestUtils.closeWindow(win); 364 } 365 }); 366 367 add_task(async function test_waitForChromeWindowLoaded_alreadyLoadedWindow() { 368 const win = await BrowserTestUtils.openNewBrowserWindow(); 369 370 try { 371 ok( 372 win.gBrowserInit.delayedStartupFinished, 373 "Browser window is already fully loaded" 374 ); 375 376 await windowManager.waitForChromeWindowLoaded(win); 377 378 is( 379 win.document.readyState, 380 "complete", 381 "Window document is in complete state" 382 ); 383 ok( 384 !win.document.isUncommittedInitialDocument, 385 "Window document is not an uncommitted initial document" 386 ); 387 } finally { 388 await BrowserTestUtils.closeWindow(win); 389 } 390 }); 391 392 add_task( 393 async function test_waitForChromeWindowLoaded_nonBrowserChromeWindow() { 394 const win = Services.ww.openWindow( 395 gBrowser.ownerGlobal, 396 "chrome://browser/content/pageinfo/pageInfo.xhtml", 397 "_blank", 398 "chrome,dialog=no,all", 399 null 400 ); 401 402 try { 403 await windowManager.waitForChromeWindowLoaded(win); 404 405 isnot( 406 win.document.documentURI, 407 AppConstants.BROWSER_CHROME_URL, 408 "Window is not a browser window" 409 ); 410 is( 411 win.document.readyState, 412 "complete", 413 "Window document is in complete state" 414 ); 415 ok( 416 !win.document.isUncommittedInitialDocument, 417 "Window document is not an uncommitted initial document" 418 ); 419 } finally { 420 await BrowserTestUtils.closeWindow(win); 421 } 422 } 423 );