tor-browser

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

browser_beforeunload_duplicate_dialogs.js (3966B)


      1 const TEST_PAGE =
      2  "http://mochi.test:8888/browser/browser/components/tabbrowser/test/browser/tabs/file_double_close_tab.html";
      3 
      4 var expectingDialog = false;
      5 var wantToClose = true;
      6 var resolveDialogPromise;
      7 
      8 function promiseOpenAndLoadWindow(aOptions, aWaitForDelayedStartup = false) {
      9  return new Promise(resolve => {
     10    let win = OpenBrowserWindow(aOptions);
     11    if (aWaitForDelayedStartup) {
     12      Services.obs.addObserver(function onDS(aSubject) {
     13        if (aSubject != win) {
     14          return;
     15        }
     16        Services.obs.removeObserver(onDS, "browser-delayed-startup-finished");
     17        resolve(win);
     18      }, "browser-delayed-startup-finished");
     19    } else {
     20      win.addEventListener(
     21        "load",
     22        function () {
     23          resolve(win);
     24        },
     25        { once: true }
     26      );
     27    }
     28  });
     29 }
     30 
     31 function onCommonDialogLoaded(promptWindow) {
     32  ok(expectingDialog, "Should be expecting this dialog.");
     33  expectingDialog = false;
     34  let dialog = promptWindow.Dialog;
     35  if (wantToClose) {
     36    // This accepts the dialog, closing it.
     37    dialog.ui.button0.click();
     38  } else {
     39    // This keeps the page open
     40    dialog.ui.button1.click();
     41  }
     42  if (resolveDialogPromise) {
     43    resolveDialogPromise();
     44  }
     45 }
     46 
     47 SpecialPowers.pushPrefEnv({
     48  set: [["dom.require_user_interaction_for_beforeunload", false]],
     49 });
     50 
     51 // Listen for the dialog being created
     52 Services.obs.addObserver(onCommonDialogLoaded, "common-dialog-loaded");
     53 registerCleanupFunction(() => {
     54  Services.prefs.clearUserPref("browser.tabs.warnOnClose");
     55  Services.obs.removeObserver(onCommonDialogLoaded, "common-dialog-loaded");
     56 });
     57 
     58 add_task(async function closeLastTabInWindow() {
     59  let newWin = await promiseOpenAndLoadWindow({}, true);
     60  let firstTab = newWin.gBrowser.selectedTab;
     61  await BrowserTestUtils.loadURIString({
     62    browser: firstTab.linkedBrowser,
     63    uriString: TEST_PAGE,
     64  });
     65  let windowClosedPromise = BrowserTestUtils.domWindowClosed(newWin);
     66  expectingDialog = true;
     67  // close tab:
     68  firstTab.closeButton.click();
     69  await windowClosedPromise;
     70  ok(!expectingDialog, "There should have been a dialog.");
     71  ok(newWin.closed, "Window should be closed.");
     72 });
     73 
     74 add_task(async function closeWindowWithMultipleTabsIncludingOneBeforeUnload() {
     75  Services.prefs.setBoolPref("browser.tabs.warnOnClose", false);
     76  let newWin = await promiseOpenAndLoadWindow({}, true);
     77  let firstTab = newWin.gBrowser.selectedTab;
     78  await BrowserTestUtils.loadURIString({
     79    browser: firstTab.linkedBrowser,
     80    uriString: TEST_PAGE,
     81  });
     82  let secondTab = BrowserTestUtils.addTab(newWin.gBrowser);
     83  await BrowserTestUtils.loadURIString({
     84    browser: secondTab.linkedBrowser,
     85    // eslint-disable-next-line @microsoft/sdl/no-insecure-url
     86    uriString: "http://example.com/",
     87  });
     88  let windowClosedPromise = BrowserTestUtils.domWindowClosed(newWin);
     89  expectingDialog = true;
     90  newWin.BrowserCommands.tryToCloseWindow();
     91  await windowClosedPromise;
     92  ok(!expectingDialog, "There should have been a dialog.");
     93  ok(newWin.closed, "Window should be closed.");
     94  Services.prefs.clearUserPref("browser.tabs.warnOnClose");
     95 });
     96 
     97 add_task(async function closeWindoWithSingleTabTwice() {
     98  let newWin = await promiseOpenAndLoadWindow({}, true);
     99  let firstTab = newWin.gBrowser.selectedTab;
    100  await BrowserTestUtils.loadURIString({
    101    browser: firstTab.linkedBrowser,
    102    uriString: TEST_PAGE,
    103  });
    104  let windowClosedPromise = BrowserTestUtils.domWindowClosed(newWin);
    105  expectingDialog = true;
    106  wantToClose = false;
    107  let firstDialogShownPromise = new Promise(resolve => {
    108    resolveDialogPromise = resolve;
    109  });
    110  firstTab.closeButton.click();
    111  await firstDialogShownPromise;
    112  info("Got initial dialog, now trying again");
    113  expectingDialog = true;
    114  wantToClose = true;
    115  resolveDialogPromise = null;
    116  firstTab.closeButton.click();
    117  await windowClosedPromise;
    118  ok(!expectingDialog, "There should have been a dialog.");
    119  ok(newWin.closed, "Window should be closed.");
    120 });