/* 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: aNewURI => {},
            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: aNewURI => {},
        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);
    }
  );
});
