<!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 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_false(
        document.featurePolicy.allowsFeature('shared-storage'),
        "Shared storage 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.");
  }, []);
}, 'Fenced frames default feature policies are set to not allow anything.');

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