<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<input value="Hello, World">
<script>
let input = document.querySelector('input');
// Note: Do not upstream this to web platform tests.
// - beforecopy / beforecut events are not standardized.
// - document.execCommand() is not guaranteed to generate events on
// non-Blink engines because it is not clearly specified in the standards.
// - For Blink, document.execCommand() only guaranteed to generate clipboard
// events on user gestures or layout tests.
async_test((test) => {
assert_true(window.testRunner instanceof Object,
'This test must run where window.testRunner is available.');
input.value = "Hello, World";
input.selectionStart = 0;
input.selectionEnd = 10;
let beforecopy_done = false;
document.addEventListener('beforecopy', test.step_func((e) => {
assert_true(e.isTrusted, 'beforecopy event should be trusted');
assert_true(e.composed, 'beforecopy event should be composed');
beforecopy_done = true;
}));
document.addEventListener('copy', test.step_func_done((e) => {
assert_true(beforecopy_done);
assert_true(e.isTrusted, 'copy event should be trusted');
assert_true(e.composed, 'copy event should be composed');
}));
document.execCommand('copy');
}, 'beforecopy/copy event is composed.');
async_test((test) => {
assert_true(window.testRunner instanceof Object,
'This test must run where window.testRunner is available.');
input.value = "Hello, World";
input.selectionStart = 0;
input.selectionEnd = 10;
let beforecut_done = false;
document.addEventListener('beforecut', test.step_func((e) => {
assert_true(e.isTrusted, 'beforecut event should be trusted');
assert_true(e.composed, 'beforecut event should be composed');
beforecut_done = true;
}));
document.addEventListener('cut', test.step_func_done((e) => {
assert_true(beforecut_done);
assert_true(e.isTrusted, 'cut event should be trusted');
assert_true(e.composed, 'cut event should be composed');
}));
document.execCommand('cut');
}, 'beforecut/cut event is composed.');
async_test((test) => {
assert_true(window.testRunner instanceof Object,
'This test must run where window.testRunner is available.');
input.value = "";
input.selectionStart = 0;
input.selectionEnd = 0;
// Blink doesn't implement beforepaste event.
document.addEventListener('paste', test.step_func_done((e) => {
assert_true(e.isTrusted, 'paste event should be trusted');
assert_true(e.composed, 'paste event should be composed');
}));
document.execCommand('paste');
}, 'paste event is composed.');
</script>