<!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>
