<!doctype html>
<meta charset="utf-8">
<title>
  Async Clipboard write blobs -> read blobs 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>
async function loadBlob(fileName) {
  const fetched = await fetch(fileName);
  return await fetched.blob();
}

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

  const blobText = new Blob(['test text'], {type: 'text/plain'});
  const blobImage = await loadBlob('resources/greenbox.png');

  assert_equals(blobText.type, 'text/plain');
  assert_equals(blobImage.type, 'image/png');

  const clipboardItemInput = new ClipboardItem(
        {'text/plain' : blobText, 'image/png' : blobImage});

  await waitForUserActivation();
  await navigator.clipboard.write([clipboardItemInput]);
  await waitForUserActivation();
  const clipboardItems = await navigator.clipboard.read();

  assert_equals(clipboardItems.length, 1);
  const clipboardItem = clipboardItems[0];
  assert_true(clipboardItem instanceof ClipboardItem);

  assert_equals(clipboardItem.types.length, 2);
  const blobTextOutput = await clipboardItem.getType('text/plain');
  const blobImageOutput = await clipboardItem.getType('image/png');
  assert_equals(blobTextOutput.type, 'text/plain');
  assert_equals(blobImageOutput.type, 'image/png');
}, 'Verify write and read clipboard (multiple types)');

promise_test(async () => {
  await tryGrantReadPermission();
  await tryGrantWritePermission();
  const text_blob = new Blob(['hello'], {type: 'text/plain'});
  const html_blob = new Blob(undefined, {type: 'text/html'});
  const item = new ClipboardItem({'text/plain': text_blob, 'text/html': html_blob});

  await waitForUserActivation();
  await navigator.clipboard.write([item]);
  await waitForUserActivation();
  const [clipboardItem] = await navigator.clipboard.read();
}, 'navigator.clipboard.read() does not crash if clipboard data has null values');

</script>
