<!DOCTYPE html>
<body>
  <script src=/resources/testharness.js></script>
  <script src=/resources/testharnessreport.js></script>
  <script src=/permissions-policy/resources/permissions-policy.js></script>
  <!-- Permissions-Policy: fullscreen=cross_origin https://www.example.com; -->
  <script>
  'use strict';
  var same_origin = 'https://{{domains[]}}:{{ports[https][0]}}';
  var cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}';
  var cross_origin1 = 'https://{{domains[www1]}}:{{ports[https][0]}}';
  var same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html';
  var cross_origin_src = cross_origin + same_origin_src;
  var cross_origin_src1 = cross_origin1 + same_origin_src;
  var header_policy = `Permissions-Policy: fullscreen=(self "${cross_origin}" "https://www.example.com"`;

  // Test that fullscreen's allowlist is [same_origin, cross_origin, 'https://www.example.com']
  test(function() {
    assert_array_equals(
      document.featurePolicy.getAllowlistForFeature('fullscreen'),
      [cross_origin, 'https://www.example.com'].sort());
  }, header_policy + ' -- test allowlist is [cross_origin, https://www.example.com]');

  // Test that fullscreen is everywhere.
  test_disallowed_feature_for_subframe(
    header_policy + ' -- test fullscreen is disallowed on same-origin subframe',
    'fullscreen',
    same_origin_src);
  test_disallowed_feature_for_subframe(
    header_policy + ' -- test fullscreen is disallowed on cross-origin ' + cross_origin_src + ' subframe',
    'fullscreen',
    cross_origin_src);
  test_disallowed_feature_for_subframe(
    header_policy + ' -- test fullscreen is disallowed on cross-origin ' + cross_origin_src1 + ' subframe',
    'fullscreen',
    cross_origin_src1);

  // dynamically update sub frame's container policy to none
  var disallow = "fullscreen 'none';"
  test_disallowed_feature_for_subframe(
    header_policy + ', iframe.allow = ' + disallow + ' -- test fullscreen is disallowed on same-origin subframe',
    'fullscreen',
    same_origin_src,
    disallow);
  test_disallowed_feature_for_subframe(
    header_policy + 'iframe.allow = ' + disallow + ' -- test fullscreen is disallowed on specific cross-origin subframe',
    'fullscreen',
    cross_origin_src,
    disallow);
  test_disallowed_feature_for_subframe(
    header_policy + 'iframe.allow = ' + disallow + ' -- test fullscreen is disallowed on another cross-origin subframe',
    'fullscreen',
    cross_origin_src1,
    disallow);

  // dynamically update sub frame's container policy to cross_origin
  var allow = "fullscreen " + cross_origin;
  test_disallowed_feature_for_subframe(
    header_policy + ', iframe.allow = ' + allow + ' -- test fullscreen is disallowed on same-origin subframe',
    'fullscreen',
    same_origin_src,
    allow);
  test_disallowed_feature_for_subframe(
    header_policy + 'iframe.allow = ' + allow + ' -- test fullscreen is disallowed on specific cross-origin subframe',
    'fullscreen',
    cross_origin_src,
    allow);
  test_disallowed_feature_for_subframe(
    header_policy + 'iframe.allow = ' + allow + ' -- test fullscreen is disallowed on another cross-origin subframe',
    'fullscreen',
    cross_origin_src1,
    allow);
  </script>
</body>
