Source code
Revision control
Copy as Markdown
Other Tools
<!DOCTYPE html>
<!--
"Activation" suffix in these test names communicates to the test harness that
this part of the test is run post-activation.
-->
<script src="/speculation-rules/prerender/resources/utils.js"></script>
<script src="session-history-harness.js"></script>
<script src="session-history-test-util.js"></script>
<body>
<script>
function testHistoryPushStateInPrerender() {
assert(history.length == 1, "Initial history length");
assert(!history.state, "Initial history state");
history.pushState("teststate", null, null);
assert(history.length == 1, "History length unchanged");
assert(history.state == "teststate", "Update state");
}
function testHistoryReplaceStateInPrerender() {
assert(history.length == 1, "Initial history length");
assert(!history.state, "Initial history state");
history.replaceState("teststate", null, null);
assert(history.length == 1, "History length unchanged");
assert(history.state == "teststate", "Update state");
}
function testLocationAssignInPrerender() {
assert(history.length == 1, "Initial history length");
const initialLocation = location.href;
location.assign("#test");
assert(history.length == 1, "History length unchanged");
assert(location.href != initialLocation, "Update location");
}
function testLocationReplaceInPrerender() {
assert(history.length == 1, "Initial history length");
const initialLocation = location.href;
location.replace("#test");
assert(history.length == 1, "History length unchanged");
assert(location.href != initialLocation, "Update location");
}
function testSetLocationHrefInPrerender() {
assert(history.length == 1, "Initial history length");
const initialLocation = location.href;
location.href = "#test";
assert(history.length == 1, "History length unchanged");
assert(location.href != initialLocation, "Update location");
}
function testSyntheticAnchorClickInPrerender() {
assert(history.length == 1, "Initial history length");
const initialLocation = location.href;
const anchor = document.createElement("a");
anchor.href = "#test";
document.body.appendChild(anchor);
anchor.click();
assert(history.length == 1, "History length unchanged");
assert(location.href != initialLocation, "Update location");
}
function testHistoryLengthInPrerender() {
assert(history.length == 1, "Initial history length");
}
function testHistoryLengthInPrerenderActivation() {
assert(history.length == 2, "History length after activation");
// after activation should go back to the initiator page correctly.
// We might need a non-trivial refactoring to test this scenario correctly.
}
// This test runs testSubfrarmeNavigationInPrerenderInSubframe() in a
// subframe, and waits for a message from a navigated subframe.
async function testSubframeNavigationInPrerender() {
assert(window.parent == window, "not the top frame");
const params = new URLSearchParams(window.location.search);
const testName = params.get("testName");
const uid = params.get("uid");
const resultPromise = waitChannelMessage(
`prerender-channel-${testName}InSubframeAfterNavigation`, uid);
params.set("testName", testName + "InSubframe");
const frame = document.createElement("iframe");
const url = location.pathname + "?" + params.toString();
frame.src = url;
document.body.appendChild(frame);
const result = await resultPromise;
assert(result == "Passed", result);
}
function testSubframeNavigationInPrerenderInSubframe() {
assert(window.parent != window, "not in a subframe");
assert(window.parent == window.top, "the direct parent isn't the top");
assert(history.length == 1, "Initial history length");
const params = new URLSearchParams(window.location.search);
const testName = params.get("testName");
params.set("testName", testName + "AfterNavigation");
location.href = location.pathname + "?" + params.toString();
}
function testSubframeNavigationInPrerenderInSubframeAfterNavigation() {
assert(window.parent != window, "not in a subframe");
assert(window.parent == window.top, "the direct parent isn't the top");
assert(history.length == 1, "History length after subframe navigation");
}
// This test runs testSubframeReloadInPrerenderInSubframe() in a
// subframe, and waits for a message from a navigated subframe.
async function testSubframeReloadInPrerender() {
assert(window.parent == window, "not the top frame");
const params = new URLSearchParams(window.location.search);
const testName = params.get("testName");
const uid = params.get("uid");
const resultPromise = waitChannelMessage(
`prerender-channel-${testName}InSubframe`, uid);
params.set("testName", testName + "InSubframe");
const frame = document.createElement("iframe");
const url = location.pathname + "?" + params.toString();
frame.src = url;
document.body.appendChild(frame);
const result = await resultPromise;
assert(result == "Passed", result);
const second_result = await waitChannelMessage(
`prerender-channel-${testName}InSubframe`, uid);
assert(second_result == "Passed", second_result);
}
function testSubframeReloadInPrerenderInSubframe() {
assert(window.parent != window, "not in a subframe");
assert(window.parent == window.top, "the direct parent isn't the top");
assert(history.length == 1, "Initial history length");
window.location.reload();
}
</script>
</body>