[Local Fonts] Implement permission policy for Local Font Access API.

https://wicg.github.io/local-font-access/#permissions-policy

Bug: 1312579
Change-Id: I1d7867e38ca56407ca4829efd9fa9712cf0c63c8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3595320
Reviewed-by: Mike West <mkwst@chromium.org>
Reviewed-by: Balazs Engedy <engedy@chromium.org>
Commit-Queue: Daseul Lee <dslee@chromium.org>
Cr-Commit-Position: refs/heads/main@{#995830}
diff --git a/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy-attribute-redirect-on-load.https.sub.html b/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy-attribute-redirect-on-load.https.sub.html
new file mode 100644
index 0000000..d829cc4
--- /dev/null
+++ b/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy-attribute-redirect-on-load.https.sub.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<body>
+  <script src=/font-access/resources/font-test-utils.js></script>
+  <script src=/resources/testdriver.js></script>
+  <script src=/resources/testdriver-vendor.js></script>
+  <script src=/resources/testharness.js></script>
+  <script src=/resources/testharnessreport.js></script>
+  <script src=/permissions-policy/resources/permissions-policy.js></script>
+  <script>
+    'use strict';
+    const relative_path = '/permissions-policy/resources/permissions-policy-local-fonts.html';
+    const base_src = '/permissions-policy/resources/redirect-on-load.html#';
+    const same_origin_src = base_src + relative_path;
+    const cross_origin_src =
+      base_src + 'https://{{domains[www]}}:{{ports[https][0]}}' + relative_path;
+    const header = 'permissions policy allow="local-fonts"';
+
+    async_test(t => {
+      test_feature_availability('local-fonts', t, same_origin_src,
+          expect_feature_available_default, 'local-fonts');
+    }, header + ' allows same-origin navigation in an iframe.');
+
+    async_test(t => {
+      test_feature_availability('local-fonts', t, cross_origin_src,
+          expect_feature_unavailable_default, 'local-fonts');
+    }, header + ' disallows cross-origin navigation in an iframe.');
+  </script>
+</body>
\ No newline at end of file
diff --git a/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy-attribute.https.sub.html b/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy-attribute.https.sub.html
new file mode 100644
index 0000000..ba80260
--- /dev/null
+++ b/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy-attribute.https.sub.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<body>
+  <script src=/font-access/resources/font-test-utils.js></script>
+  <script src=/resources/testharness.js></script>
+  <script src=/resources/testharnessreport.js></script>
+  <script src=/resources/testdriver.js></script>
+  <script src=/resources/testdriver-vendor.js></script>
+  <script src=/permissions-policy/resources/permissions-policy.js></script>
+  <script>
+    'use strict';
+    const same_origin_src = '/permissions-policy/resources/permissions-policy-local-fonts.html';
+    const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+      same_origin_src;
+    const feature_name = 'permissions policy "local-fonts"';
+    const header = 'allow="local-fonts" attribute';
+
+    async_test(t => {
+      test_feature_availability('local-fonts', t, same_origin_src,
+          expect_feature_available_default, 'local-fonts');
+    }, feature_name + ' can be enabled in same-origin iframe using ' + header);
+
+    async_test(t => {
+      test_feature_availability('local-fonts', t, cross_origin_src,
+          expect_feature_available_default, 'local-fonts');
+    }, feature_name + ' can be enabled in cross-origin iframe using ' + header);
+  </script>
+</body>
\ No newline at end of file
diff --git a/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy.https.sub.html b/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy.https.sub.html
new file mode 100644
index 0000000..ed3538f
--- /dev/null
+++ b/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy.https.sub.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<body>
+  <script src=/font-access/resources/font-test-utils.js></script>
+  <script src=/resources/testharness.js></script>
+  <script src=/resources/testharnessreport.js></script>
+  <script src=/resources/testdriver.js></script>
+  <script src=/resources/testdriver-vendor.js></script>
+  <script src=/permissions-policy/resources/permissions-policy.js></script>
+  <script>
+    'use strict';
+    const same_origin_src = '/permissions-policy/resources/permissions-policy-local-fonts.html';
+    const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+      same_origin_src;
+    const header = 'permissions policy header: local-fonts *';
+
+    font_access_test(async t => {
+      try {
+        await self.queryLocalFonts();
+      } catch (error) {
+        assert_unreached(error);
+      }
+    }, header + ' allows the top-level document.');
+
+    async_test(t => {
+      test_feature_availability('local-fonts', t, same_origin_src,
+          expect_feature_available_default);
+    }, header + ' allows same-origin iframes.');
+
+    async_test(t => {
+      test_feature_availability('local-fonts', t, cross_origin_src,
+          expect_feature_unavailable_default);
+    }, header + ' disallows cross-origin iframes.');
+  </script>
+</body>
\ No newline at end of file
diff --git a/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy.https.sub.html.headers b/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy.https.sub.html.headers
new file mode 100644
index 0000000..d88db12
--- /dev/null
+++ b/font-access/permissions-policy/local-fonts-allowed-by-permissions-policy.https.sub.html.headers
@@ -0,0 +1 @@
+Permissions-Policy: local-fonts=*
\ No newline at end of file
diff --git a/font-access/permissions-policy/local-fonts-default-permissions-policy.https.sub.html b/font-access/permissions-policy/local-fonts-default-permissions-policy.https.sub.html
new file mode 100644
index 0000000..ce166b6
--- /dev/null
+++ b/font-access/permissions-policy/local-fonts-default-permissions-policy.https.sub.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<body>
+  <script src=/font-access/resources/font-test-utils.js></script>
+  <script src=/resources/testharness.js></script>
+  <script src=/resources/testharnessreport.js></script>
+  <script src=/resources/testdriver.js></script>
+  <script src=/resources/testdriver-vendor.js></script>
+  <script src=/permissions-policy/resources/permissions-policy.js></script>
+  <script>
+    'use strict';
+    const same_origin_src = '/permissions-policy/resources/permissions-policy-local-fonts.html';
+    const cross_origin_src =
+      'https://{{domains[www]}}:{{ports[https][0]}}' + same_origin_src;
+    const header = 'Default "local-fonts" permissions policy ["self"]';
+
+    font_access_test(async t => {
+      try {
+        await self.queryLocalFonts();
+      } catch (error) {
+        assert_unreached(error);
+      }
+    }, header + ' allows the top-level document.');
+
+    async_test(t => {
+      test_feature_availability('local-fonts', t, same_origin_src,
+          expect_feature_available_default);
+    }, header + ' allows same-origin iframes.');
+
+    async_test(t => {
+      test_feature_availability('local-fonts', t, cross_origin_src,
+          expect_feature_unavailable_default);
+    }, header + ' disallows cross-origin iframes.');
+  </script>
+</body>
\ No newline at end of file
diff --git a/font-access/permissions-policy/local-fonts-disabled-by-permissions-policy.https.sub.html b/font-access/permissions-policy/local-fonts-disabled-by-permissions-policy.https.sub.html
new file mode 100644
index 0000000..fed6151
--- /dev/null
+++ b/font-access/permissions-policy/local-fonts-disabled-by-permissions-policy.https.sub.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<body>
+  <script src=/font-access/resources/font-test-utils.js></script>
+  <script src=/resources/testharness.js></script>
+  <script src=/resources/testharnessreport.js></script>
+  <script src=/resources/testdriver.js></script>
+  <script src=/resources/testdriver-vendor.js></script>
+  <script src=/permissions-policy/resources/permissions-policy.js></script>
+  <script>
+    'use strict';
+    const same_origin_src = '/permissions-policy/resources/permissions-policy-local-fonts.html';
+    const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+      same_origin_src;
+    const header = 'permissions policy header: "local-fonts=()"';
+
+    font_access_test(async t => {
+      await promise_rejects_dom(t, 'SecurityError', self.queryLocalFonts(),
+          'queryLocalFonts() throws security error when disallowed by ' +
+          'permission policy');
+    }, header + ' disallows the top-level document.');
+
+    async_test(t => {
+      test_feature_availability('local-fonts', t, same_origin_src,
+          expect_feature_unavailable_default);
+    }, header + ' disallows same-origin iframes.');
+
+    async_test(t => {
+      test_feature_availability('local-fonts', t, cross_origin_src,
+          expect_feature_unavailable_default);
+    }, header + ' disallows cross-origin iframes.');
+  </script>
+</body>
\ No newline at end of file
diff --git a/font-access/permissions-policy/local-fonts-disabled-by-permissions-policy.https.sub.html.headers b/font-access/permissions-policy/local-fonts-disabled-by-permissions-policy.https.sub.html.headers
new file mode 100644
index 0000000..f52d4e0
--- /dev/null
+++ b/font-access/permissions-policy/local-fonts-disabled-by-permissions-policy.https.sub.html.headers
@@ -0,0 +1 @@
+Permissions-Policy: local-fonts=()
\ No newline at end of file
diff --git a/font-access/permissions-policy/local-fonts-supported-by-permissions-policy.html b/font-access/permissions-policy/local-fonts-supported-by-permissions-policy.html
new file mode 100644
index 0000000..671c0fa
--- /dev/null
+++ b/font-access/permissions-policy/local-fonts-supported-by-permissions-policy.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>Test that local fonts is advertised in the feature list</title>
+<link rel="help" href="https://w3c.github.io/webappsec-permissions-policy/#dom-permissions-policy-features">
+<link rel="help" href="https://wicg.github.io/local-fonts/#permissions-policy">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  test(() => {
+      assert_in_array('local-fonts', document.featurePolicy.features());
+  }, 'document.featurePolicy.features should advertise local-fonts.');
+</script>
\ No newline at end of file
diff --git a/permissions-policy/resources/permissions-policy-local-fonts.html b/permissions-policy/resources/permissions-policy-local-fonts.html
new file mode 100644
index 0000000..1b965d9
--- /dev/null
+++ b/permissions-policy/resources/permissions-policy-local-fonts.html
@@ -0,0 +1,11 @@
+<script>
+'use strict';
+
+window.onload = function() {
+  self.queryLocalFonts().then(() => {
+    parent.postMessage({ type: 'availability-result', enabled: true }, '*');
+  }, error => {
+    parent.postMessage({ type: 'availability-result', enabled: false }, '*');
+  });
+}
+</script>
\ No newline at end of file