<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>WebShare Test: Share no known fields</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="resources/manual-helper.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("web share", () => {
          return promise_rejects_js(t, TypeError, navigator.share());
        });
      }, "share with no arguments (same as empty dictionary)");

      promise_test(async t => {
        await test_driver.bless("web share", () => {
          return promise_rejects_js(t, TypeError, navigator.share({}));
        });
      }, "share with an empty dictionary");

      promise_test(async t => {
        await test_driver.bless("web share", () => {
          return promise_rejects_js(t, TypeError, navigator.share(undefined));
        });
      }, "share with a undefined argument (same as empty dictionary)");

      promise_test(async t => {
        await test_driver.bless("web share", () => {
          return promise_rejects_js(t, TypeError, navigator.share(null));
        });
      }, "share with a null argument (same as empty dictionary)");

      promise_test(async t => {
        await test_driver.bless("web share", () => {
          return promise_rejects_js(
            t,
            TypeError,
            navigator.share({ unused: "unexpected field" })
          );
        });
      }, "share with a dictionary containing only surplus fields");
    </script>
  </body>
</html>
