<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>WebShare Test: canShare method tests</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <script>
      test(() => {
        assert_false(
          navigator.canShare(),
          "no arguments (uses default argument value, which is empty dictionary)"
        );

        assert_false(navigator.canShare({}), "empty dictionary not allowed");

        assert_false(navigator.canShare(undefined), "empty dictionary not allowed");

        assert_false(navigator.canShare(null), "empty dictionary not allowed");

        assert_false(
          navigator.canShare({ unused: "unexpected field" }),
          "results in empty dictionary, which is not allowed"
        );
      }, "canShare() empty and default dictionary");

      test(() => {
        assert_true(navigator.canShare({ url: "http://a.b" }), "http URL is ok");

        assert_true(navigator.canShare({ url: "https://a.b" }), "https URL is ok");

        assert_false(
          navigator.canShare({ url: "http://a.b:65536" }),
          "URL is invalid"
        );

        assert_false(
          navigator.canShare({ url: "data:the url" }),
          "data URL is not allowed"
        );

        assert_false(
          navigator.canShare({ url: "file:///usr/" }),
          "file URL is not allowed"
        );

        assert_true(
          navigator.canShare({
            url: "https://a.b/path?query#fragment",
          }),
          "canShare with URL"
        );

        assert_true(
          navigator.canShare({
            url: {
              toString() {
                return "https://a.b/";
              },
            },
          }),
          "canShare URL as with object with stringifier"
        );

        assert_true(
          navigator.canShare(
            { url: "" },
            "canShare with empty URL, which resolves as the doc's base URL"
          )
        );

        assert_true(
          navigator.canShare({
            url: "//a.b/path?query#fragment",
          }),
          "canShare with URL having no scheme"
        );

        assert_true(
          navigator.canShare({
            url: "relative",
          }),
          "canShare relative URL, resolved against API base URL"
        );
      }, "canShare() url member");

      test(() => {
        assert_false(
          navigator.canShare({ title: undefined }),
          "canShare with attribute undefined is equivalent to omitting the attribute"
        );

        assert_true(navigator.canShare({ title: "subject" }), "canShare with title");

        assert_true(navigator.canShare({ title: null }), "stringified null");
      }, "canShare() title member");

      test(() => {
        assert_true(navigator.canShare({ text: "" }), "ok to share empty text");

        assert_true(
          navigator.canShare({ text: "some text ðŸ¤”" }),
          "ok to share unicode"
        );

        assert_true(navigator.canShare({ text: 123 }), "number is stringified");
      }, "canShare() text member");

      test(() => {
        const file = new File(["hello"], "file", { type: "text/plain" });
        const file2 = new File([], "file2");

        assert_false(navigator.canShare({ files: [] }), "empty list is not allowed");

        assert_false(
          navigator.canShare({
            url: "https://a.b:800000",
            files: [file, file2],
          }),
          "invalid URL invalidates the share"
        );

        assert_true(
          navigator.canShare({ files: [file] }),
          "single file is ok to share"
        );

        assert_true(
          navigator.canShare({ files: [file, file2, file] }),
          "repeated files is ok to share"
        );

        assert_true(
          navigator.canShare({
            files: [file, file2],
            text: "some texts",
            url: "https://example.com/",
          }),
          "is ok to share files, text, and url together"
        );
      }, "canShare() files member");

      test(() => {
        assert_true(
          navigator.canShare({
            title: "subject",
            text: "body",
            url: "https://a.b/",
            files: [new File([], "file")],
            unused: "unexpected field",
          }),
          "canShare with unexpected field"
        );
      }, "canShare() multiple members");
    </script>
  </body>
</html>
