<!doctype html>
<meta charset="utf-8">
<title>Async Clipboard web custom format write validation tests</title>
<link rel="help" href="https://w3c.github.io/clipboard-apis/#async-clipboard-api">
<body>Body needed for test_driver.click()</body>
<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>
<script src="resources/user-activation.js"></script>
<script>
'use strict';

promise_test(async t => {
  await tryGrantWritePermission();

  const customFormatArray = [];
  const customFormatMap = {};
  for (let i = 0; i <= 100; i++) {
    customFormatArray.push("web text/CustomFormat" + i);
    const blobInput = new Blob(['input data'], {type: customFormatArray[i]});
    customFormatMap[customFormatArray[i]] = blobInput;
  }
  const clipboardItemInput = new ClipboardItem(customFormatMap);
  await waitForUserActivation();
  await promise_rejects_dom(t, 'NotAllowedError',
      navigator.clipboard.write([clipboardItemInput]));
}, 'navigator.clipboard.write() fails for more than 100 custom formats');

promise_test(async t => {
  await tryGrantWritePermission();

  const format1 = 'application/x-custom-format-clipboard-test-format-1';
  const format2 = 'application/x-custom-format-clipboard-test-format-2';
  const blobInput1 = new Blob(['input data 1'], {type: format1});
  const blobInput2 = new Blob(['input data 2'], {type: format2});
  const clipboardItemInput = new ClipboardItem(
      {[format1]: blobInput1, [format2]: blobInput2});
  await waitForUserActivation();
  await promise_rejects_dom(t, 'NotAllowedError',
      navigator.clipboard.write([clipboardItemInput]));
}, 'navigator.clipboard.write() fails for custom formats without web prefix');

promise_test(async t => {
  await tryGrantWritePermission();

  const format1 = 'web ';
  const format2 = 'web a';
  const blobInput1 = new Blob(['input data 1'], {type: format1});
  const blobInput2 = new Blob(['input data 2'], {type: format2});
  const clipboardItemInput = new ClipboardItem(
      {[format1]: blobInput1, [format2]: blobInput2});
  await waitForUserActivation();
  await promise_rejects_dom(t, 'NotAllowedError',
      navigator.clipboard.write([clipboardItemInput]));
}, 'navigator.clipboard.write() fails for custom formats with web prefix, but invalid MIME types');

promise_test(async t => {
  await tryGrantWritePermission();

  const format1 = 'web text/plain';
  const format2 = 'text/custom';
  const blobInput1 = new Blob(['input data 1'], {type: format2});
  const clipboardItemInput = new ClipboardItem(
      {[format1]: blobInput1});
  await waitForUserActivation();
  await promise_rejects_dom(t, 'NotAllowedError',
      navigator.clipboard.write([clipboardItemInput]));
}, 'navigator.clipboard.write() fails for custom format with web prefix, but different Blob type');

promise_test(async t => {
  await tryGrantWritePermission();

  const format1 = 'web Text/plain';
  const format2 = 'text/plain';
  const blobInput1 = new Blob(['input data 1'], {type: format2});
  const clipboardItemInput = new ClipboardItem(
      {[format1]: blobInput1});
      await waitForUserActivation();
  await promise_rejects_dom(t, 'NotAllowedError',
      navigator.clipboard.write([clipboardItemInput]));
}, 'navigator.clipboard.write() fails for custom format with different case than the Blob type');

promise_test(async t => {
  await tryGrantWritePermission();

  const format1 = 'web text/plain';
  const format2 = 'Text/plain';
  const blobInput1 = new Blob(['input data 1'], {type: format1});
  const clipboardItemInput = new ClipboardItem(
      {[format2]: blobInput1});
  await waitForUserActivation();
  await promise_rejects_dom(t, 'NotAllowedError',
      navigator.clipboard.write([clipboardItemInput]));
}, 'navigator.clipboard.write() fails for invalid mime type that is different than the Blob type');

promise_test(async t => {
  await tryGrantWritePermission();

  const format1 = 'web Text/plain';
  const format2 = 'web text/plain';
  const blobInput1 = new Blob(['input data 1'], {type: format2});
  const clipboardItemInput = new ClipboardItem(
      {[format1]: blobInput1});
      await waitForUserActivation();
  await promise_rejects_dom(t, 'NotAllowedError',
      navigator.clipboard.write([clipboardItemInput]));
}, 'navigator.clipboard.write() fails for invalid mime type with web prefix and the Blob type');

promise_test(async t => {
  await tryGrantWritePermission();

  const format1 = 'Text/plain';
  const format2 = 'text/plain';
  const blobInput1 = new Blob(['input data 1'], {type: format2});
  const clipboardItemInput = new ClipboardItem(
      {[format1]: blobInput1});
  await waitForUserActivation();
  await promise_rejects_dom(t, 'NotAllowedError',
      navigator.clipboard.write([clipboardItemInput]));
}, 'navigator.clipboard.write() fails for custom format and Blob type with different case');

</script>
