<!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.featurePolicy.allowsFeature('shared-storage'),
        "Shared storage should be allowed in the fenced frame.");
    assert_true(
        document.featurePolicy.allowsFeature('private-aggregation'),
        "Private aggregation should be allowed in the fenced frame.");
    assert_false(
        document.featurePolicy.allowsFeature('attribution-reporting'),
        "Attribution reporting should be disallowed in the fenced frame.");
    assert_false(
        document.featurePolicy.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.featurePolicy.allowsFeature('shared-storage'),
        "Shared storage should be disallowed in the fenced frame.");
    assert_false(
        document.featurePolicy.allowsFeature('private-aggregation'),
        "Private aggregation should be disallowed in the fenced frame.");
    assert_false(
        document.featurePolicy.allowsFeature('attribution-reporting'),
        "Attribution reporting should be disallowed in the fenced frame.");
    assert_false(
        document.featurePolicy.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>
