<!DOCTYPE html>
<title>Test default permission policy features with allow="" attribute</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>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/default-enabled-features-helper.js"></script>

<body>
<script>
promise_test(async(t) => {
  await runDefaultEnabledFeaturesTest(t, /*should_load=*/true,
      get_host_info().ORIGIN,
      generator_api="fledge",
      allow="shared-storage *; attribution-reporting *");
  await runDefaultEnabledFeaturesTest(t, /*should_load=*/true,
      get_host_info().ORIGIN,
      generator_api="sharedstorage",
      allow="shared-storage *; attribution-reporting *");
}, 'Same-origin fenced frame with allow attribute enabling required features');

promise_test(async(t) => {
  await runDefaultEnabledFeaturesTest(t, /*should_load=*/true,
      get_host_info().REMOTE_ORIGIN,
      generator_api="fledge",
      allow="shared-storage *; attribution-reporting *");
  await runDefaultEnabledFeaturesTest(t, /*should_load=*/true,
      get_host_info().REMOTE_ORIGIN,
      generator_api="sharedstorage",
      allow="shared-storage *; attribution-reporting *");
}, 'Cross-origin fenced frame with allow attribute enabling required features');

promise_test(async(t) => {
  const fencedframe = await attachFencedFrameContext({
        generator_api: "fledge",
        headers: [["Permissions-Policy", "attribution-reporting=()"]],
        origin: get_host_info().ORIGIN});

  await fencedframe.execute(async () => {
    assert_false(document.permissionsPolicy.allowsFeature('attribution-reporting'),
        "Attribution reporting should NOT be allowed in the fenced frame.");
  }, []);
}, 'Delivered policies can further restrict permissions of a fixed ' +
   'permissions fenced frame');

promise_test(async(t) => {
  const fencedframe = await attachFencedFrameContext({
      headers: [["Permissions-Policy", "shared-storage=()"]],
      origin: get_host_info().ORIGIN});

  await fencedframe.execute(async () => {
    assert_false(
        document.permissionsPolicy.allowsFeature('shared-storage'),
        "Shared storage should not be allowed in the fenced frame.");
    assert_true(
        document.permissionsPolicy.allowsFeature('private-aggregation'),
        "Private aggregation should be allowed in the fenced frame.");
    assert_false(
        document.permissionsPolicy.allowsFeature('attribution-reporting'),
        "Attribution reporting should be disallowed in the fenced frame.");
    assert_false(
        document.permissionsPolicy.allowsFeature('sync-xhr'),
        "USB access should be disallowed in the fenced frame.");
  }, []);
}, 'Delivered policies can further restrict permissions of a non-opaque ' +
   'fenced frame');

</script>
</body>
</html>
