<!DOCTYPE html>
<title>Test fenced frame in CSPEE</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 iframe = attachIFrameContext({attributes:[["csp", "frame-src *"]]});
  t.step_timeout(() => t.done(), 1000);
  await iframe.execute(async (t) => {
    const fencedframe = attachFencedFrameContext();
    await fencedframe.execute(() => {});
  });
  assert_unreached("fenced frame should not be loaded.");
}, 'fenced frame should not be loaded in CSPEE');

promise_test(async(t) => {
  const iframe_a = attachIFrameContext({attributes:[["csp", "frame-src *"]]});
  t.step_timeout(() => t.done(), 1000);
  await iframe_a.execute(async (t) => {
    const iframe_b = attachIFrameContext();
    await iframe_b.execute(async (t) => {
      const fencedframe = attachFencedFrameContext();
      await fencedframe.execute(() => {});
    });
  });
  assert_unreached("fenced frame should not be loaded.");
}, 'fenced frame should not be loaded if any ancestor has CSPEE');

promise_test(async(t) => {
  const iframe = attachIFrameContext({attributes:[["csp", "frame-src *"]]});
  await iframe.execute(async (t) => {
    assert_false(navigator.canLoadAdAuctionFencedFrame());
  });
}, 'canLoadOpaqueURL considers CSPEE headers');

promise_test(async(t) => {
  const iframe_a = attachIFrameContext({attributes:[["csp", "frame-src *"]]});
  await iframe_a.execute(async (t) => {
    const iframe_b = attachIFrameContext();
    await iframe_b.execute(async (t) => {
      assert_false(navigator.canLoadAdAuctionFencedFrame());
    });
  });
}, 'canLoadOpaqueURL considers CSPEE headers up the ancestor chain');

promise_test(async(t) => {
  const iframe = attachIFrameContext();
  await iframe.execute(async (t) => {
    assert_true(navigator.canLoadAdAuctionFencedFrame());
  });
}, 'canLoadOpaqueURL returns true if no CSPEE headers are present in iframe');
</script>
</body>
