<!DOCTYPE html>
<title>Test history.length in outermost document</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/utils.js"></script>
<script src="/common/utils.js"></script>
<body>
<script>
promise_test(async () => {
const kInnerAssertion = "Navigations inside of a fenced frame are always " +
"replacement navigations and never increase " +
"`history.length` inside the fence: ";
const kOuterAssertion = "Navigations inside of a fenced frame never " +
"contribute to joint session history, or increase " +
"`history.length` outside the fence: ";
// This is used by
// `resources/history-length-fenced-navigations-replace-do-not-contribute-to-joint-inner.html`
// to let us know once a navigation is complete inside the fence. The inner
// page will test its `history.length` and report to us "PASS <frame type>" or
// "FAIL <frame type>" (the history length should be unaffected by the
// navigation). If the inner test passes, then we will check our
// `history.length` and ensure that the inner fenced navigation did not
// contribute to the joint session history.
const fenced_navigation_complete_key = token();
// This is sent by us to the inner page to let it know that we're finished
// observing the effects of the last navigation, and that it should perform
// the next one for us to observe.
const outer_page_ready_for_next_fenced_navigation_key = token();
const level = "top-level-fenced-frame";
attachFencedFrame(generateURL(
"resources/history-length-fenced-navigations-replace-do-" +
"not-contribute-to-joint-inner.html",
[fenced_navigation_complete_key,
outer_page_ready_for_next_fenced_navigation_key,
level]));
const tests = ["top-level-fenced-frame", "nested-fenced-frame", "nested-iframe"];
for (test_type of tests) {
// Wait for the fenced navigations to complete, and then see if they
// observable via the outermost `history.length`.
let result = await nextValueFromServer(fenced_navigation_complete_key);
assert_equals(result, "PASS > " + test_type, kInnerAssertion + test_type);
assert_equals(history.length, 1, kOuterAssertion + test_type);
// Acknowledge the results, and let the fenced frame know that we're ready
// to observe more fenced navigations.
writeValueToServer(outer_page_ready_for_next_fenced_navigation_key, "READY");
}
}, "All fenced navigations should be replace-only and not contribute to joint " +
"session history");
</script>
</body>