зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
7e36789034
Коммит
b41bb687d0
|
@ -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>
|
Загрузка…
Ссылка в новой задаче