mirror of
https://github.com/servo/servo
synced 2026-05-13 10:27:03 +02:00
150 lines
5.8 KiB
HTML
150 lines
5.8 KiB
HTML
<!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");
|
|
|
|
// TODO(http://crbug.com/1220992): Test whether calling history.back()
|
|
// 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>
|