<!DOCTYPE html>
<title>Test default permission policy features gating (self)</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, false, get_host_info().ORIGIN);
  await runDefaultEnabledFeaturesTest(t, false, get_host_info().ORIGIN,
      generator_api="sharedstorage");
}, 'Same-origin fenced frame does not load when feature policies are self');

promise_test(async(t) => {
  await runDefaultEnabledFeaturesTest(t, false, get_host_info().REMOTE_ORIGIN);
  await runDefaultEnabledFeaturesTest(t, false, get_host_info().REMOTE_ORIGIN,
      generator_api="sharedstorage");
}, 'Cross-origin fenced frame does not load when feature policies are self');

promise_test(async(t) => {
  const fencedframe = await attachFencedFrameContext({
        origin: get_host_info().ORIGIN});

  await fencedframe.execute(async () => {
    assert_true(
        document.permissionsPolicy.allowsFeature('shared-storage'),
        "Shared storage should 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.");
  }, []);
}, 'Fenced frames default feature policies should inherit from parent.');

promise_test(async(t) => {
  const fencedframe = await attachFencedFrameContext({
        origin: get_host_info().REMOTE_ORIGIN});

  await fencedframe.execute(async () => {
    assert_false(
        document.permissionsPolicy.allowsFeature('shared-storage'),
        "Shared storage should be disallowed in the fenced frame.");
    assert_false(
        document.permissionsPolicy.allowsFeature('private-aggregation'),
        "Private aggregation should be disallowed 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.");
  }, []);
}, 'Cross-origin fenced frames default feature policies follow inheritance rules.');

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