128 lines
5.4 KiB
HTML
128 lines
5.4 KiB
HTML
<?xml version="1.0"?>
|
|
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
|
|
|
|
<window id="321671Test"
|
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
|
width="600"
|
|
height="600"
|
|
onload="setTimeout(runTest, 0);"
|
|
title="bug 321671 test">
|
|
|
|
<script type="application/javascript" src="chrome://mochikit/content/chrome-harness.js" />
|
|
<script type="application/javascript" src="docshell_helpers.js" />
|
|
<script type="application/javascript"><![CDATA[
|
|
Services.prefs.setBoolPref("browser.navigation.requireUserInteraction", false);
|
|
|
|
// Maximum number of entries in the bfcache for this session history.
|
|
// This number is hardcoded in docshell code. In the test, we'll
|
|
// navigate through enough pages so that we hit one that's been
|
|
// evicted from the bfcache because it's farther from the current
|
|
// page than this number.
|
|
const MAX_BFCACHE_PAGES = 3;
|
|
|
|
////
|
|
// Bug 321671: Scroll position should be retained when moving backwards and
|
|
// forwards through pages when bfcache is enabled.
|
|
//
|
|
async function runTest()
|
|
{
|
|
// Variable to hold the scroll positions of the test pages.
|
|
var scrollPositions = [];
|
|
|
|
// Make sure bfcache is on.
|
|
enableBFCache(true);
|
|
|
|
// Load enough test pages that so the first one is evicted from the
|
|
// bfcache, scroll down on each page, and save the
|
|
// current scroll position before continuing. Verify that each
|
|
// page we're navigating away from is initially put into the bfcache.
|
|
for (var i = 0; i <= MAX_BFCACHE_PAGES + 1; i++) {
|
|
let eventsToListenFor = ["pageshow"];
|
|
let expectedEvents = [ { type: "pageshow",
|
|
title: "bug321671 page" + (i + 1) } ];
|
|
if (i > 0) {
|
|
eventsToListenFor.push("pagehide");
|
|
expectedEvents.unshift({ type: "pagehide",
|
|
persisted: true,
|
|
title: "bug321671 page" + i });
|
|
}
|
|
await promisePageNavigation( {
|
|
uri: "data:text/html,<html><head><title>bug321671 page" + (i + 1) +
|
|
"</title></head>" +
|
|
"<body><table border='1' width='300' height='1000'>" +
|
|
"<tbody><tr><td>" +
|
|
" page " + (i + 1) + ": foobar foobar foobar foobar " +
|
|
"</td></tr></tbody></table> " +
|
|
"</body></html>",
|
|
eventsToListenFor,
|
|
expectedEvents,
|
|
} );
|
|
|
|
let { initialScrollY, scrollY } = await SpecialPowers.spawn(TestWindow.getBrowser(), [i], (i) => {
|
|
let initialScrollY = content.scrollY;
|
|
content.scrollByLines(10 + (2 * i));
|
|
return { initialScrollY, scrollY: content.scrollY };
|
|
});
|
|
is(initialScrollY, 0,
|
|
"Page initially has non-zero scrollY position");
|
|
ok(scrollY > 0,
|
|
"Page has zero scrollY position after scrolling");
|
|
scrollPositions[i] = scrollY;
|
|
}
|
|
|
|
// Go back to the first page, one page at a time. For each 'back'
|
|
// action, verify that its vertical scroll position is restored
|
|
// correctly. Verify that the last page in the sequence
|
|
// does not come from the bfcache. Again verify that all pages
|
|
// that we navigate away from are initially
|
|
// stored in the bfcache.
|
|
for (i = MAX_BFCACHE_PAGES + 1; i > 0; i--) {
|
|
await promisePageNavigation( {
|
|
back: true,
|
|
eventsToListenFor: ["pageshow", "pagehide"],
|
|
expectedEvents: [ { type: "pagehide",
|
|
title: "bug321671 page" + (i+1),
|
|
persisted: true },
|
|
{ type: "pageshow",
|
|
title: "bug321671 page" + i,
|
|
persisted: i > 1 } ],
|
|
} );
|
|
|
|
is(await SpecialPowers.spawn(TestWindow.getBrowser(), [], () => {
|
|
return content.scrollY;
|
|
}), scrollPositions[i-1],
|
|
"Scroll position not restored while going back!");
|
|
}
|
|
|
|
// Traverse history forward now, and verify scroll position is still
|
|
// restored. Similar to the backward traversal, verify that all
|
|
// but the last page in the sequence comes from the bfcache. Also
|
|
// verify that all of the pages get stored in the bfcache when we
|
|
// navigate away from them.
|
|
for (i = 1; i <= MAX_BFCACHE_PAGES + 1; i++) {
|
|
await promisePageNavigation( {
|
|
forward: true,
|
|
eventsToListenFor: ["pageshow", "pagehide"],
|
|
expectedEvents: [ { type: "pagehide",
|
|
persisted: true,
|
|
title: "bug321671 page" + i },
|
|
{ type: "pageshow",
|
|
persisted: i < MAX_BFCACHE_PAGES + 1,
|
|
title: "bug321671 page" + (i + 1) } ],
|
|
} );
|
|
|
|
is(await SpecialPowers.spawn(TestWindow.getBrowser(), [], () => {
|
|
return content.scrollY;
|
|
}), scrollPositions[i],
|
|
"Scroll position not restored while going forward!");
|
|
}
|
|
|
|
Services.prefs.clearUserPref("browser.navigation.requireUserInteraction");
|
|
// Tell the framework the test is finished.
|
|
finish();
|
|
}
|
|
|
|
]]></script>
|
|
|
|
<browser type="content" primary="true" flex="1" id="content" remote="true" maychangeremoteness="true" />
|
|
</window>
|