summaryrefslogtreecommitdiffstats
path: root/docshell/test/browser/browser_bug1594938.js
blob: 30c8de5cb96a634a49d327c01a7814a109117bb2 (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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

/**
 * Test for Bug 1594938
 *
 * If a session history listener blocks reloads we shouldn't crash.
 */

add_task(async function test() {
  await BrowserTestUtils.withNewTab(
    { gBrowser, url: "https://example.com/" },
    async function (browser) {
      if (!SpecialPowers.Services.appinfo.sessionHistoryInParent) {
        await SpecialPowers.spawn(browser, [], async function () {
          let history = this.content.docShell.QueryInterface(
            Ci.nsIWebNavigation
          ).sessionHistory;

          let testDone = {};
          testDone.promise = new Promise(resolve => {
            testDone.resolve = resolve;
          });

          let listenerCalled = false;
          let listener = {
            OnHistoryNewEntry: () => {},
            OnHistoryReload: () => {
              listenerCalled = true;
              this.content.setTimeout(() => {
                testDone.resolve();
              });
              return false;
            },
            OnHistoryGotoIndex: () => {},
            OnHistoryPurge: () => {},
            OnHistoryReplaceEntry: () => {},

            QueryInterface: ChromeUtils.generateQI([
              "nsISHistoryListener",
              "nsISupportsWeakReference",
            ]),
          };

          history.legacySHistory.addSHistoryListener(listener);

          history.reload(Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE);
          await testDone.promise;

          Assert.ok(listenerCalled, "reloads were blocked");

          history.legacySHistory.removeSHistoryListener(listener);
        });

        return;
      }

      let history = browser.browsingContext.sessionHistory;

      let testDone = {};
      testDone.promise = new Promise(resolve => {
        testDone.resolve = resolve;
      });

      let listenerCalled = false;
      let listener = {
        OnHistoryNewEntry: () => {},
        OnHistoryReload: () => {
          listenerCalled = true;
          setTimeout(() => {
            testDone.resolve();
          });
          return false;
        },
        OnHistoryGotoIndex: () => {},
        OnHistoryPurge: () => {},
        OnHistoryReplaceEntry: () => {},

        QueryInterface: ChromeUtils.generateQI([
          "nsISHistoryListener",
          "nsISupportsWeakReference",
        ]),
      };

      history.addSHistoryListener(listener);

      await SpecialPowers.spawn(browser, [], () => {
        let history = this.content.docShell.QueryInterface(
          Ci.nsIWebNavigation
        ).sessionHistory;
        history.reload(Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE);
      });
      await testDone.promise;

      Assert.ok(listenerCalled, "reloads were blocked");

      history.removeSHistoryListener(listener);
    }
  );
});