Source code

Revision control

Copy as Markdown

Other Tools

<?xml version="1.0"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<window id="396519Test"
width="600"
height="600"
onload="runTest();"
title="396519 test">
<script type="application/javascript" src="docshell_helpers.js" />
<script type="application/javascript"><![CDATA[
Services.prefs.setBoolPref("browser.navigation.requireUserInteraction", false);
var gTestCount = 0;
async function navigateAndTest(params, expected) {
await promisePageNavigation(params);
++gTestCount;
await doTest(expected);
}
async function doTest(expected) {
function check(testCount, expected) {
let history;
if (SpecialPowers.Services.appinfo.sessionHistoryInParent) {
history = this.browsingContext.sessionHistory;
} else {
history = this.content.browsingContext.childSessionHistory.legacySHistory;
}
if (history.count == expected.length) {
for (let i = 0; i < history.count; i++) {
var shEntry = history.getEntryAtIndex(i).
QueryInterface(Ci.nsISHEntry);
is(shEntry.isInBFCache, expected[i], `BFCache for shentry[${i}], test ${testCount}`);
}
// Make sure none of the SHEntries share bfcache entries with one
// another.
for (let i = 0; i < history.count; i++) {
for (let j = 0; j < history.count; j++) {
if (j == i)
continue;
let shentry1 = history.getEntryAtIndex(i)
.QueryInterface(Ci.nsISHEntry);
let shentry2 = history.getEntryAtIndex(j)
.QueryInterface(Ci.nsISHEntry);
ok(!shentry1.sharesDocumentWith(shentry2),
'Test ' + testCount + ': shentry[' + i + "] shouldn't " +
"share document with shentry[" + j + ']');
}
}
}
else {
is(history.count, expected.length, "Wrong history length in test "+testCount);
}
}
if (SpecialPowers.Services.appinfo.sessionHistoryInParent) {
check.call(TestWindow.getBrowser(), gTestCount, expected);
} else {
await SpecialPowers.spawn(TestWindow.getBrowser(), [gTestCount, expected], check);
}
}
async function runTest() {
// Tests 1 + 2:
// Back/forward between two simple documents. Bfcache will be used.
var test1Doc = "data:text/html,<html><head><title>test1</title></head>" +
"<body>test1</body></html>";
await navigateAndTest({
uri: test1Doc,
}, [false]);
var test2Doc = test1Doc.replace(/1/,"2");
await navigateAndTest({
uri: test2Doc,
}, [true, false]);
await navigateAndTest({
uri: test1Doc,
}, [true, true, false]);
await navigateAndTest({
uri: test2Doc,
}, [true, true, true, false]);
await navigateAndTest({
uri: test1Doc,
}, [false, true, true, true, false]);
await navigateAndTest({
uri: test2Doc,
}, [false, false, true, true, true, false]);
await navigateAndTest({
back: true,
}, [false, false, true, true, false, true]);
await navigateAndTest({
forward: true,
}, [false, false, true, true, true, false]);
await navigateAndTest({
gotoIndex: 1,
}, [false, false, true, true, true, false]);
await navigateAndTest({
back: true,
}, [false, true, true, true, false, false]);
await navigateAndTest({
gotoIndex: 5,
}, [false, false, true, true, false, false]);
Services.prefs.clearUserPref("browser.navigation.requireUserInteraction");
finish();
}
]]></script>
<browser type="content" primary="true" flex="1" id="content" remote="true" maychangeremoteness="true" />
</window>