summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/general/browser_tabs_close_beforeunload.js
blob: 0534250970a5b19618704ba9af6118c75322de47 (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
"use strict";

SimpleTest.requestCompleteLog();

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

const FIRST_TAB =
  getRootDirectory(gTestPath) + "close_beforeunload_opens_second_tab.html";
const SECOND_TAB = getRootDirectory(gTestPath) + "close_beforeunload.html";

add_task(async function () {
  info("Opening first tab");
  let firstTab = await BrowserTestUtils.openNewForegroundTab(
    gBrowser,
    FIRST_TAB
  );
  let secondTabLoadedPromise;
  let secondTab;
  let tabOpened = new Promise(resolve => {
    info("Adding tabopen listener");
    gBrowser.tabContainer.addEventListener(
      "TabOpen",
      function tabOpenListener(e) {
        info("Got tabopen, removing listener and waiting for load");
        gBrowser.tabContainer.removeEventListener(
          "TabOpen",
          tabOpenListener,
          false,
          false
        );
        secondTab = e.target;
        secondTabLoadedPromise = BrowserTestUtils.browserLoaded(
          secondTab.linkedBrowser,
          false,
          SECOND_TAB
        );
        resolve();
      },
      false,
      false
    );
  });
  info("Opening second tab using a click");
  await SpecialPowers.spawn(firstTab.linkedBrowser, [""], async function () {
    content.document.getElementsByTagName("a")[0].click();
  });
  info("Waiting for the second tab to be opened");
  await tabOpened;
  info("Waiting for the load in that tab to finish");
  await secondTabLoadedPromise;

  let closeBtn = secondTab.closeButton;
  info("closing second tab (which will self-close in beforeunload)");
  closeBtn.click();
  ok(
    secondTab.closing,
    "Second tab should be marked as closing synchronously."
  );
  ok(!secondTab.linkedBrowser, "Second tab's browser should be dead");
  ok(!firstTab.closing, "First tab should not be closing");
  ok(firstTab.linkedBrowser, "First tab's browser should be alive");
  info("closing first tab");
  BrowserTestUtils.removeTab(firstTab);

  ok(firstTab.closing, "First tab should be marked as closing");
  ok(!firstTab.linkedBrowser, "First tab's browser should be dead");
});