<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>WebShare Test: consume user activation</title>
    <link rel="help" href="https://github.com/w3c/web-share/pull/219" />
    <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>
  </head>
  <body>
    <script>
      async function loadIframe() {
        const iframe = document.createElement("iframe");
        iframe.src = "./resources/blank.html";
        document.body.appendChild(iframe);
        await new Promise((resolve) => {
          iframe.addEventListener("load", resolve);
        });
        return iframe;
      }

      promise_test(async (t) => {
        const iframe = await loadIframe();
        const { contentWindow } = iframe;
        const { navigator, DOMException } = contentWindow;
        const data = { text: "text" };
        iframe.remove();
        await promise_rejects_dom(
          t,
          "InvalidStateError",
          DOMException,
          navigator.share(data),
          "Expected promise rejected with InvalidStateError from .share()"
        );
      }, "calling share() on non-fully active document returns a promise rejected with InvalidStateError");

      promise_test(async (t) => {
        const iframe = await loadIframe();
        const { contentWindow } = iframe;
        const { navigator, DOMException } = contentWindow;
        const data = { text: "text" };

        // Acquire transient activation, but make the iframe non-fully-active
        await test_driver.bless(
          "web share",
          () => {
            iframe.remove();
          },
          contentWindow
        );

        await promise_rejects_dom(
          t,
          "InvalidStateError",
          DOMException,
          navigator.share(data),
          "Expected promise rejected with InvalidStateError from .share()"
        );
      }, "calling share() with transient activation on non-fully active document returns a promise rejected with InvalidStateError");

      promise_test(async (t) => {
        const iframe = await loadIframe();
        const { contentWindow } = iframe;
        const { navigator } = contentWindow;
        const data = { text: "text" };

        assert_true(navigator.canShare(data), "doc is fully active, so true");

        iframe.remove();

        assert_false(navigator.canShare(data), "not fully active, so false");
      }, "calling canShare() on a non-fully active document returns false");
    </script>
  </body>
</html>
