<!DOCTYPE html>
<title>Test window.fence availability in iframes.</title>
<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="resources/utils.js"></script>

<body>
<script>

promise_test(async(t) => {
  const frame = await attachIFrameContext();
  await frame.execute(() => {
    assert_equals(window.fence, null);
  });
}, 'window.fence is unavailable in normal (non-urn) iframes');

promise_test(async(t) => {
  // window.fence works in urn iframes.
  var frame = await attachIFrameContext({generator_api: 'fledge'});
  await frame.execute(() => {
    assert_not_equals(window.fence, null);
  });
  // window.fence works after navigating to a new urn.
  frame = await replaceFrameContext(frame, {generator_api: 'fledge'});
  await frame.execute(() => {
    assert_not_equals(window.fence, null);
  });
  // window.fence still works after embedder-initiated navigations to non-urns,
  // because the concept of "embedder-initiated" navigations is nebulous in
  // iframes.
  frame = await replaceFrameContext(frame);
  await frame.execute(() => {
    assert_not_equals(window.fence, null);
  });
}, 'window.fence is available in urn iframes');

promise_test(async(t) => {
  // window.fence works in urn iframes.
  const frame = await attachIFrameContext({generator_api: 'fledge'});
  await frame.execute(async () => {
    assert_not_equals(window.fence, null);
    const nested_frame = await attachIFrameContext();
    await nested_frame.execute(() => {
      assert_not_equals(window.fence, null);
    });
  });
}, 'window.fence is available in same-origin subframes of urn iframes');

</script>
</body>
