<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>WebShare Test: Share with an invalid URL</title>
    <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>
      promise_test(async t => {
        await test_driver.bless();
        const promise = navigator.share({ url: "http://a.com:65536" });
        return promise_rejects_js(t, TypeError, promise);
      }, "share() rejects when URL is invalid");

      promise_test(async t => {
        await test_driver.bless();
        const promise = navigator.share({ url: "file:///etc/passwd" });
        return promise_rejects_js(t, TypeError, promise);
      }, "share() rejects file:// URLs");

      promise_test(async t => {
        await test_driver.bless();
        const promise = navigator.share({ url: "wss://a.com/" });
        return promise_rejects_js(t, TypeError, promise);
      }, "share() rejects wss: URLs");

      promise_test(async t => {
        await test_driver.bless();
        const promise = navigator.share({ url: "about:config" });
        return promise_rejects_js(t, TypeError, promise);
      }, "share() rejects about: URLs");

      promise_test(async t => {
        await test_driver.bless();
        const promise = navigator.share({ url: "chrome://about" });
        return promise_rejects_js(t, TypeError, promise);
      }, "share() rejects chrome: URLs");

      promise_test(async t => {
        await test_driver.bless();
        const promise = navigator.share({ url: "javascript:window.alert('error')" });
        return promise_rejects_js(t, TypeError, promise);
      }, "share() rejects javascript: URLs");

      promise_test(async t => {
        await test_driver.bless();
        const file = new File([], "text/plain");
        const promise = navigator.share({ url: URL.createObjectURL(file) });
        return promise_rejects_js(t, TypeError, promise);
      }, "share() rejects blob: URLs");

      promise_test(async t => {
        const encoder = new TextEncoder();
        const encoded = encoder.encode(
          `<meta http-equiv="refresh" content="1;url=http://example.com/">`
        );
        const file = new File(encoded, "text/html");
        const url = URL.createObjectURL(file);
        const reader = new FileReader();
        reader.readAsDataURL(file);
        const dataURL = await new Promise(resolve => {
          reader.addEventListener("load", () => {
            resolve(reader.result);
          });
        });
        await test_driver.bless();
        const promise = navigator.share({ url: dataURL });
        return promise_rejects_js(t, TypeError, promise);
      }, "share() rejects data: URLs");
    </script>
  </body>
</html>
