summaryrefslogtreecommitdiffstats
path: root/dom/security/test/https-first/browser_navigation.js
blob: dba83d56450f83cfaef037c6951b8402d02318b3 (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
"use strict";

const REQUEST_URL =
  "http://httpsfirst.com/browser/dom/security/test/https-first/";

async function promiseGetHistoryIndex(browser) {
  if (!SpecialPowers.Services.appinfo.sessionHistoryInParent) {
    return SpecialPowers.spawn(browser, [], function () {
      let shistory =
        docShell.browsingContext.childSessionHistory.legacySHistory;
      return shistory.index;
    });
  }

  let shistory = browser.browsingContext.sessionHistory;
  return shistory.index;
}

async function testNavigations() {
  // Load initial site

  let url1 = REQUEST_URL + "file_navigation.html?foo1";
  let url2 = REQUEST_URL + "file_navigation.html?foo2";
  let url3 = REQUEST_URL + "file_navigation.html?foo3";

  let loaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
  BrowserTestUtils.startLoadingURIString(gBrowser, url1);
  await loaded;

  // Load another site
  loaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
  await SpecialPowers.spawn(
    gBrowser.selectedBrowser,
    [url2],
    async url => (content.location.href = url)
  );
  await loaded;

  // Load another site
  loaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
  await SpecialPowers.spawn(
    gBrowser.selectedBrowser,
    [url3],
    async url => (content.location.href = url)
  );
  await loaded;
  is(
    await promiseGetHistoryIndex(gBrowser.selectedBrowser),
    2,
    "correct session history index after load 3"
  );

  // Go back one site by clicking the back button
  info("Clicking back button");
  loaded = BrowserTestUtils.waitForLocationChange(gBrowser, url2);
  let backButton = document.getElementById("back-button");
  backButton.click();
  await loaded;
  is(
    await promiseGetHistoryIndex(gBrowser.selectedBrowser),
    1,
    "correct session history index after going back for the first time"
  );

  // Go back again
  info("Clicking back button again");
  loaded = BrowserTestUtils.waitForLocationChange(gBrowser, url1);
  backButton.click();
  await loaded;
  is(
    await promiseGetHistoryIndex(gBrowser.selectedBrowser),
    0,
    "correct session history index after going back for the second time"
  );
}

add_task(async function () {
  waitForExplicitFinish();

  await SpecialPowers.pushPrefEnv({
    set: [["dom.security.https_first", true]],
  });

  await testNavigations();

  // If fission is enabled we also want to test the navigations with the bfcache
  // in the parent.
  if (SpecialPowers.getBoolPref("fission.autostart")) {
    await SpecialPowers.pushPrefEnv({
      set: [["fission.bfcacheInParent", true]],
    });

    await testNavigations();
  }

  finish();
});