Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<title>
navigateEvent.deferPageSwap: deferring method should complete before
committing
</title>
<body>
<script>
switch (new URLSearchParams(location.search).get("phase") || "test") {
case "test":
promise_test(async (t) => {
window.step_timeout = t.step_timeout;
const done = Promise.withResolvers();
window.did_load = done.resolve;
const popup = window.open("?phase=initial");
const events = await done.promise;
assert_array_equals(events, [
"navigate",
"handler",
"preview",
"abort",
"navigateerror",
"restore",
]);
});
break;

case "initial":
const events = [];
navigation.addEventListener("navigateerror", () => {
events.push("navigateerror");
});
navigation.addEventListener(
"navigate",
(navigate_event) => {
navigate_event.signal.addEventListener("abort", () => {
events.push("abort");
});
events.push("navigate");
navigate_event.deferPageSwap({
handler: async (controller) => {
const {resolve, promise} = Promise.withResolvers();
events.push("handler");
controller.addRestoreCallback(() => {
events.push("restore");
window.opener.did_load(events);
});
window.step_timeout(() => {
events.push("preview");
window.stop();
resolve();
}, 10);
await promise;
}
});
},
{ once: true }
);

navigation.navigate("?next");
break;
}
</script>
</body>
57 changes: 57 additions & 0 deletions navigation-api/navigate-event/defer/restore-after-bfcache.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<!DOCTYPE html>
<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="/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js"></script>
<script src="resources/is_uuid.js"></script>

<script>
// This test:
// * Does a fragment navigation, then goes back (same-document).
// * Navigates away, then back via bfcache.
// When navigating away, navigation.entries()[1] will be overwritten.
// When returning after bfcache restore, navigation.entries()[1] should represent
// pageB, and the original navigation.entries()[1] should have been disposed.
runBfcacheTest(
{
targetOrigin: originSameOrigin,
funcBeforeNavigation: async () => {
window.events = [];
await navigation.navigate("#1").finished;
await navigation.back();
window.originalEntry1 = navigation.entries()[1];
window.originalEntry1.ondispose = () => events.push("dispose");
window.onpageshow = () => events.push("pageshow");
navigation.addEventListener("navigate", (e) => {
e.deferPageSwap({
handler: (controller) => {
events.push("handler");
controller.addRestoreCallback(() => {
events.push("restore");
});
},
});
});
},
async funcAfterAssertion(pageA, pageB) {
assert_equals(
await pageA.execute_script(() => navigation.entries().length),
2
);
assert_false(
await pageA.execute_script(
() => window.originalEntry1 === navigation.entries[1]
)
);
assert_array_equals(await pageA.execute_script(() => window.events), [
"handler",
"restore",
"pageshow",
"dispose",
]);
},
},
"entries() must contain the forward-history page after navigating back to a bfcached page"
);
</script>