<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>WebShare Test: is disabled by permissions policy cross-origin</title>
    <link
      rel="help"
      href="https://w3c.github.io/web-share/#permissions-policy"
    />
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body></body>
  <script>
    const crossOrigin = "https://{{hosts[alt][]}}:{{ports[https][0]}}";
    const sameOriginPath = "/web-share/resources/post-message.html";
    const crossOriginSrc = `${crossOrigin}${sameOriginPath}`;
    const shareData = {
      title: "WebShare Test",
      text: "This is a test of the Web Share API",
      url: "https://example.com/",
    };

    function waitForMessage(message) {
      return new Promise((resolve) => {
        window.addEventListener("message", function listener(event) {
          if (event.data.action !== message) return;
          window.removeEventListener("message", listener);
          resolve(event.data);
        });
      });
    }

    async function loadIframe(t, src, allowList) {
      const iframe = document.createElement("iframe");
      if (allowList !== null) iframe.allow = allowList;
      t.add_cleanup(() => {
        iframe.remove();
      });
      await new Promise((resolve) => {
        iframe.src = src;
        document.body.appendChild(iframe);
        iframe.onload = resolve;
      });
      await waitForMessage("loaded");
      return iframe;
    }

    promise_test(async (t) => {
      assert_true("share" in navigator, "navigator.share is exposed");
      const iframe = await loadIframe(t, crossOriginSrc);
      const iframeWindow = iframe.contentWindow;
      iframeWindow.postMessage({ action: "share", data: shareData }, "*");
      const data = await waitForMessage("share");
      assert_equals(data.result, "error");
      assert_equals(data.error, "NotAllowedError");
    }, "share() is disabled by default 'self' by permissions policy for cross-origin iframes");

    promise_test(async (t) => {
      assert_true("share" in navigator, "navigator.share is exposed");
      const iframe = await loadIframe(t, crossOriginSrc, "web-share=()");
      const iframeWindow = iframe.contentWindow;
      iframeWindow.postMessage({ action: "share", data: shareData }, "*");
      const data = await waitForMessage("share");
      assert_equals(data.result, "error");
      assert_equals(data.error, "NotAllowedError");
    }, "share() is disabled explicitly by permissions policy for cross-origin iframe");

    promise_test(async (t) => {
      assert_true("share" in navigator, "navigator.share is exposed");
      const iframe = await loadIframe(t, crossOriginSrc, "web-share=(self)");
      const iframeWindow = iframe.contentWindow;
      iframeWindow.postMessage({ action: "share", data: shareData }, "*");
      const data = await waitForMessage("share");
      assert_equals(data.result, "error");
      assert_equals(data.error, "NotAllowedError");
    }, "share() not allowed, as only allowed to share with self");

    promise_test(async (t) => {
      assert_true("canShare" in navigator, "navigator.canShare is exposed");
      const iframe = await loadIframe(t, crossOriginSrc);
      const iframeWindow = iframe.contentWindow;
      iframeWindow.postMessage({ action: "canShare", data: shareData }, "*");
      const data = await waitForMessage("canShare");
      assert_equals(data.result, false, "Expected false, as it can't share.");
    }, "canShare() not allowed to share by default permissions policy cross-origin");

    promise_test(async (t) => {
      assert_true("canShare" in navigator, "navigator.canShare is exposed");
      const iframe = await loadIframe(
        t,
        crossOriginSrc,
        `web-share ${crossOrigin}`
      );
      iframe.contentWindow.postMessage(
        { action: "canShare", data: shareData },
        "*"
      );
      const data = await waitForMessage("canShare");
      assert_equals(
        data.result,
        true,
        `Expected true, is it can now share on ${origin}.`
      );
    }, "canShare() is allowed by permissions policy to share cross-origin on a particular origin");

    promise_test(async (t) => {
      assert_true("canShare" in navigator, "navigator.canShare is exposed");
      const iframe = await loadIframe(t, sameOriginPath, "web-share=(self)");
      iframe.contentWindow.postMessage(
        { action: "canShare", data: shareData },
        "*"
      );
      const data = await waitForMessage("canShare");
      assert_equals(
        data.result,
        true,
        "Expected true, at it can share with self."
      );
    }, "canShare() with self");
  </script>
</html>
