Bug 1646221 [wpt PR 24175] - Clipboard API: Implement the HTML clipboard reader and writer., a=testonly

Automatic update from web-platform-tests
Clipboard API: Implement the HTML clipboard reader and writer.

This CL adds two subclasses: ClipboardHTMLReader and
ClipboardHTMLWriter. When HTML is read and written it is "sanitized"
which means that all script objects are removed from the html. They
are both entirely synchronous because it is impossible to use HTML
DOM nodes off of the main thread.

Design Doc: https://docs.google.com/document/d/1tzjfckWUKAAxEbKcUjg21uz7LFDMQ7ZDzfTTj3Lp93Y/edit

Bug: 931839
Change-Id: I29b26f1c721102005bcbb5911549a9546aed3006
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2243532
Commit-Queue: Dylan Sleeper <dsleeps@google.com>
Reviewed-by: Jarryd Goodman <jarrydg@chromium.org>
Reviewed-by: Darwin Huang <huangdarwin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#787862}

--

wpt-commits: f1d19687599024a2219d35a6ab0fecb4128891ad
wpt-pr: 24175
This commit is contained in:
Dylan Sleeper 2020-07-17 11:16:19 +00:00 коммит произвёл moz-wptsync-bot
Родитель 7e36789034
Коммит b41bb687d0
2 изменённых файлов: 114 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,56 @@
<!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>

Просмотреть файл

@ -0,0 +1,58 @@
<!doctype html>
<meta charset="utf-8">
<title>
Async Clipboard write ([text/html ClipboardItem]) -> readHtml 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;
}
async function readWriteTest(textInput) {
await test_driver.set_permission({name: 'clipboard-read'}, 'granted');
await test_driver.set_permission({name: 'clipboard-write'}, 'granted');
const blobInput = new Blob([textInput], {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(textInput);
assert_equals(outputHtml, inputHtml);
}
const testCases = [`<!doctype html> <html> <head> <title>Title of the
document</title> </head> <body> <p>Hello World</p>
</body> </html>`,
'<title>Title of the document</title> <p>Hello World</p>'];
promise_test(async t => {
for (const testCase of testCases) {
await readWriteTest(testCase);
}
}, 'Verify read and write of some text/html content');
</script>