<!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">
<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';
// 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_script =
  '<script>const a = 5;</scr'
  + 'ipt>';
promise_test(async t => {
  await tryGrantReadPermission();
  await tryGrantWritePermission();
  const blobInput = new Blob([html_with_script], {type: 'text/html'});
  const clipboardItem = new ClipboardItem({'text/html': blobInput});
  await waitForUserActivation();
  await navigator.clipboard.write([clipboardItem]);
  await waitForUserActivation();
  const clipboardItems = await navigator.clipboard.read();

  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 html_script_no_spaces = reformatHtml(html_script);
  assert_true(!outputHtml.includes(html_script_no_spaces));
}, 'Verify write and read clipboard with scripts removed given text/html. The string "' + html_script + '" has been removed.');
</script>
