summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/tabs/browser_close_during_beforeunload.js
blob: 2a93e29c00c1c673a2a8669acfd44ba1e1f0dc2d (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
"use strict";

// Tests that a second attempt to close a window while blocked on a
// beforeunload confirmation ignores the beforeunload listener and
// unblocks the original close call.

const CONTENT_PROMPT_SUBDIALOG = Services.prefs.getBoolPref(
  "prompts.contentPromptSubDialog",
  false
);

const DIALOG_TOPIC = CONTENT_PROMPT_SUBDIALOG
  ? "common-dialog-loaded"
  : "tabmodal-dialog-loaded";

add_task(async function () {
  await SpecialPowers.pushPrefEnv({
    set: [["dom.require_user_interaction_for_beforeunload", false]],
  });

  let win = await BrowserTestUtils.openNewBrowserWindow();

  let browser = win.gBrowser.selectedBrowser;
  // eslint-disable-next-line @microsoft/sdl/no-insecure-url
  BrowserTestUtils.loadURIString(browser, "http://example.com/");
  // eslint-disable-next-line @microsoft/sdl/no-insecure-url
  await BrowserTestUtils.browserLoaded(browser, false, "http://example.com/");

  await SpecialPowers.spawn(browser, [], () => {
    // eslint-disable-next-line mozilla/balanced-listeners
    content.addEventListener("beforeunload", event => {
      event.preventDefault();
    });
  });

  let confirmationShown = false;

  BrowserUtils.promiseObserved(DIALOG_TOPIC).then(() => {
    confirmationShown = true;
    win.close();
  });

  win.close();
  ok(confirmationShown, "Before unload confirmation should have been shown");
  ok(win.closed, "Window should have been closed after second close() call");
});