Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!DOCTYPE HTML>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="resources/helper.sub.js"></script>
<script>
// Tests what happens when doing history navigation to an entry that's created
// via pushState, with and without BFCache:
// 1. Navigate to `urlA`.
// 2. `pushState(urlPushState)`.
// 3. Navigate to `urlB`.
// 4. Do a back navigation.
// With BFCache, the page loaded at Step 1 is restored from BFCache,
// and is not reloaded from `urlPushState` nor `urlA`.
// Without BFCache, a page is loaded from `urlPushState`, not from `urlA`.
// In both cases, `location` and `history.state` are set to those set by
// `pushState()` in Step 2.
// See https://github.com/whatwg/html/issues/6207 for more discussion on the
// specified, implemented and desired behaviors. While this test contradicts
// the current spec but matches the desired behavior, and the spec will be
for (const bfcacheDisabled of [false, true]) {
const pushStateExecutorPath =
'/html/browsers/browsing-the-web/back-forward-cache/resources/executor-pushstate.html';
runBfcacheTest({
funcBeforeNavigation: async (bfcacheDisabled, pushStateExecutorPath) => {
const urlPushState = new URL(location.href);
urlPushState.pathname = pushStateExecutorPath;
if (bfcacheDisabled) {
await disableBFCache();
}
// `pushState(..., urlPushState)` on `urlA`,
history.pushState('blue', '', urlPushState.href);
},
argsBeforeNavigation: [bfcacheDisabled, pushStateExecutorPath],
shouldBeCached: !bfcacheDisabled,
funcAfterAssertion: async (pageA) => {
// We've navigated to `urlB` and back again
// (already done within `runBfcacheTest()`).
// After the back navigation, `location` etc. should point to
// `urlPushState` and the state that's pushed.
const urlPushState = location.origin + pushStateExecutorPath +
'?uuid=' + pageA.context_id;
assert_equals(await pageA.execute_script(() => location.href),
urlPushState, 'url');
assert_equals(await pageA.execute_script(() => history.state),
'blue', 'history.state');
if (bfcacheDisabled) {
// When the page is not restored from BFCache, the HTML page is loaded
// from `urlPushState` (not from `urlA`).
assert_true(await pageA.execute_script(() => isLoadedFromPushState),
'document should be loaded from urlPushState');
}
}
}, 'back navigation to pushState()d page (' +
(bfcacheDisabled ? 'not ' : '') + 'in BFCache)');
}
</script>