<!DOCTYPE html>
<title>Test the 'src' attribute set in fenced frames.</title>
<meta name=variant content="?type=fencedframe">
<meta name=variant content="?type=iframe">
<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>
<script src="/common/media.js"></script>
<script src="/common/get-host-info.sub.js"></script>

<body></body>
<script>
frame_builder = () => {
  const params = new URLSearchParams(location.search);
  if (params.get('type') === "fencedframe") {
    return attachFencedFrameContext({
      attributes: [["allow", "shared-storage"]]
    });
  } else {
    return attachIFrameContext({
      generator_api: "fledge",
      attributes: [["allow", "shared-storage"]]
    });
  }
}

promise_test(async () => {
  // Not specifying an allowlist for a permissions policy will default the
  // allowlist to 'src', which is an allowlist unique to iframes/fencedframes
  // that matches either the URL of the 'src' attribute, the mapped URL of the
  // URN in the 'src' attribute, or the mapped URL of the config in the 'config'
  // attribute.
  const frame = await frame_builder();
  await frame.execute(async () => {
    assert_true(document.featurePolicy.allowsFeature("shared-storage"));
  });
}, 'Src permissions policy in allow attribute.');

promise_test(async () => {
  const frame = await frame_builder();
  await navigateFrameContext(frame, {
    origin: get_host_info().HTTPS_ORIGIN,
  });
  // When the fenced frame navigates itself to a same-origin page, the resulting
  // document should still allow "shared-storage" since it is still same-origin to the
  // original mapped URL (i.e. what 'src' is considered to be).
  await frame.execute(async () => {
    assert_true(document.featurePolicy.allowsFeature("shared-storage"));
  });
}, 'Src permissions policy after same-origin navigation.');

promise_test(async () => {
  const frame = await frame_builder();
  await navigateFrameContext(frame, {
    origin: get_host_info().HTTPS_REMOTE_ORIGIN,
  });
  // When the fenced frame navigates itself to a cross-origin page, the
  // resulting document should not allow "shared-storage" since it is now cross-origin
  // to the original mapped URL (i.e. what 'src' is considered to be).
  await frame.execute(async () => {
    assert_false(document.featurePolicy.allowsFeature("shared-storage"));
  });
}, 'Src permissions policy after cross-origin navigation.');

promise_test(async () => {
  const frame = await frame_builder();
  await frame.execute(async () => {
    const child_frame = await attachIFrameContext();
    await child_frame.execute(() => {
      assert_true(document.featurePolicy.allowsFeature("shared-storage"));
    })
  });
}, 'Src permissions policy in child iframe inheritance works properly.');
</script>
