tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 );