Index: third_party/WebKit/LayoutTests/fast/events/inputevents/inputevent-cut-paste.html |
diff --git a/third_party/WebKit/LayoutTests/fast/events/inputevents/inputevent-cut-paste.html b/third_party/WebKit/LayoutTests/fast/events/inputevents/inputevent-cut-paste.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f9f12bb34976081a387ffd927c558cbf42651a9a |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/fast/events/inputevents/inputevent-cut-paste.html |
@@ -0,0 +1,93 @@ |
+<!DOCTYPE html> |
+<html> |
+<head> |
+<title>InputEvent: beforeinput for Cut and Paste</title> |
+<script src="../../../resources/testharness.js"></script> |
+<script src="../../../resources/testharnessreport.js"></script> |
+</head> |
+<body> |
+<p id="editable" contenteditable></p> |
+<script> |
+test(function() { |
+ assert_not_equals(window.eventSender, undefined, 'This test requires eventSender.'); |
+ |
+ var editable = document.getElementById('editable'); |
+ var eventOrderRecorder = []; |
+ editable.addEventListener('beforeinput', () => eventOrderRecorder.push('beforeinput')); |
+ editable.addEventListener('input', () => eventOrderRecorder.push('input')); |
+ ['cut', 'paste'].forEach(eventType => editable.addEventListener( |
+ eventType, () => eventOrderRecorder.push(eventType))); |
+ |
+ function testClipboardEventOrder(command, expectedOrder) { |
+ eventOrderRecorder = []; |
+ eventSender.keyDown(command); |
+ assert_array_equals(eventOrderRecorder, expectedOrder, `Testing ${command} event orders`); |
+ } |
+ |
+ // Test Cut and Paste. |
+ editable.innerHTML = 'abc'; |
+ var selection = window.getSelection(); |
+ selection.collapse(editable, 0); |
+ selection.extend(editable, 1); |
+ testClipboardEventOrder('Cut', ['cut', 'beforeinput', 'input']); |
+ testClipboardEventOrder('Paste', ['paste', 'beforeinput', 'input']); |
+}, 'Testing Cut and Paste ordering'); |
+ |
+test(function() { |
+ assert_not_equals(window.eventSender, undefined, 'This test requires eventSender.'); |
+ var editable = document.getElementById('editable'); |
+ |
+ var lastPlainTextData = ""; |
+ var lastHTMLData = ""; |
+ editable.addEventListener('beforeinput', event => { |
+ lastPlainTextData = event.dataTransfer ? event.dataTransfer.getData('text/plain') : null; |
+ lastHTMLData = event.dataTransfer ? event.dataTransfer.getData('text/html') : null; |
+ }); |
+ function testClipboardDataTransfer(command, expectedPlainText, expectedHTML) { |
+ lastPlainTextData = ""; |
+ lastHTMLData = ""; |
+ eventSender.keyDown(command); |
+ assert_equals(lastPlainTextData, expectedPlainText, `Testing ${command} getData('text/plain')`); |
+ if (expectedHTML && expectedHTML.test) { |
+ assert_regexp_match(lastHTMLData, expectedHTML, `Testing ${command} getData('text/html')`); |
+ } else { |
+ assert_equals(lastHTMLData, expectedHTML, `Testing ${command} getData('text/html')`); |
+ } |
+ } |
+ |
+ // Test Cut and Paste. |
+ editable.innerHTML = '<b>abc</b>'; |
+ var selection = window.getSelection(); |
+ selection.collapse(editable, 0); |
+ selection.extend(editable, 1); |
+ // Cut has null |dataTransfer|. |
+ testClipboardDataTransfer('Cut', null, null); |
+ // Paste has |dataTransfer| with additional inline styles. |
+ testClipboardDataTransfer('Paste', 'abc', /^<b.*>abc<\/b>$/); |
+}, 'Testing Cut and Paste dataTransfer'); |
+ |
+test(function() { |
+ assert_not_equals(window.eventSender, undefined, 'This test requires eventSender.'); |
+ var editable = document.getElementById('editable'); |
+ |
+ editable.addEventListener('beforeinput', event => { |
+ if (event.inputType == 'deleteByCut') { |
+ // Prevents text deletion but not Clipboard update. |
+ event.preventDefault(); |
+ } |
+ }); |
+ |
+ // Test Cut and Paste. |
+ editable.innerHTML = 'abc'; |
+ var selection = window.getSelection(); |
+ selection.collapse(editable, 0); |
+ selection.extend(editable, 1); |
+ // The text won't be removed but should still update Clipboard. |
+ eventSender.keyDown('Cut'); |
+ selection.collapse(editable, 0); |
+ eventSender.keyDown('Paste'); |
+ assert_equals(editable.innerHTML, 'abcabc', 'Testing Cut.preventDefault() and Paste.') |
+}, 'Testing Cut and Paste preventDefault()'); |
+</script> |
+</body> |
+</html> |