<!doctype html>
<meta charset="utf-8">
<title>
  Async Clipboard write ([text/html ClipboardItem]) -> readHtml (and remove scripts) tests
</title>
<link rel="help" href="https://w3c.github.io/clipboard-apis/#async-clipboard-api">
<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>
'use strict';
// This function removes extra spaces between tags in html. For example, the
// following html: "<p> Hello </p>   <body> World </body>" would turn into this
//           html: "<p> Hello </p> <body> World </body>"
// We remove the extra spaces because in html they are considered equivalent,
// but when we are comparing for equality the spaces make a difference.
function reformatHtml(html) {
  const parser = new DOMParser();
  const htmlString =
    parser.parseFromString(html, 'text/html').documentElement.innerHTML;
  const reformattedString = htmlString.replace(/\>\s*\</g, '> <');
  return reformattedString;
}

// The string must be concatenated in this way because the html parser
// will recognize a script tag even in quotes as a real script tag. By
// splitting it up in this way we avoid that error.
const html_with_script =
  '<title>Title of the document</title> <script>const a = 5;</scr'
  + 'ipt> <p>Hello World</p>';
const html_without_script =
  '<title>Title of the document</title> <p>Hello World</p>';
promise_test(async t => {
  await test_driver.set_permission({name: 'clipboard-read'}, 'granted');
  await test_driver.set_permission({name: 'clipboard-write'}, 'granted');
  const blobInput = new Blob([html_with_script], {type: 'text/html'});
  const clipboardItem = new ClipboardItem({'text/html': blobInput});
  await navigator.clipboard.write([clipboardItem]);
  const clipboardItems = await navigator.clipboard.read({type: 'text/html'});

  const html = clipboardItems[0];
  assert_equals(html.types.length, 1);
  assert_equals(html.types[0], 'text/html');

  const blobOutput = await html.getType('text/html');
  assert_equals(blobOutput.type, 'text/html');

  const blobText = await (new Response(blobOutput)).text();

  const outputHtml = reformatHtml(blobText);
  const inputHtml = reformatHtml(html_without_script);
  assert_equals(outputHtml, inputHtml);
}, 'Verify write and read clipboard with scripts removed given text/html: '
    + html_with_script);
</script>
