blob: 7e6a59769d04717e70dbd2c736c874bda69e6583 [file] [log] [blame]
Chong Zhang2bbabd72017-09-15 19:19:001<!DOCTYPE html>
2<meta charset="utf-8">
3<title>InputEvent.getTargetRanges() behavior</title>
4<script src="/resources/testharness.js"></script>
5<script src="/resources/testharnessreport.js"></script>
6<p>To manually run this test, please follow the steps below:<br/>
71. Place caret at the end of 'hel<i>lo wo</i><b>rld</b>'.<br/>
82. Press Ctrl-Backspace (Alt-Backspace on macOS) to delete word backwards.<br/>
93. Place caret at the end of 'test2' => Press 'a' key.<br/>
104. Select 'test2a' => Press 'b' key.<br/>
115. Select 'b' => Bold text through context menu or Command-b on macOS.<br/>
126. Place caret at the end of 'test3' => Press 'a' key => Press Backspace key.<br/>
13<br/>
14If a "PASS" result appears the test passes, otherwise it fails</p>
15<p id="test1_editable" contenteditable>hel<i>lo wo</i><b>rld</b></p>
16<p id="test2_editable" contenteditable>test2</p>
17<textarea id="test3_plain">test3</textarea>
18<script>
19async_test(t => {
20 const test1_editable = document.getElementById('test1_editable');
21 let lastBeforeInput;
22 test1_editable.addEventListener('beforeinput', t.step_func(event => {
23 assert_equals(event.inputType, 'deleteWordBackward');
24 const ranges = event.getTargetRanges();
25 assert_equals(ranges.length, 1);
26 const range = ranges[0];
27 assert_true(range instanceof StaticRange);
28 assert_equals(range.startOffset, 3);
29 assert_equals(range.startContainer.textContent, 'lo wo');
30 assert_equals(range.endOffset, 3);
31 assert_equals(range.endContainer.textContent, 'rld');
32 assert_equals(test1_editable.innerHTML, 'hel<i>lo wo</i><b>rld</b>');
33 lastBeforeInput = event;
34 }));
35
36 test1_editable.addEventListener('input', t.step_func(event => {
37 assert_equals(event.inputType, 'deleteWordBackward');
38 assert_equals(test1_editable.innerHTML, 'hel<i>lo&nbsp;</i>');
39 assert_equals(lastBeforeInput.inputType, 'deleteWordBackward');
40 assert_equals(lastBeforeInput.getTargetRanges().length, 0,
41 'getTargetRanges() should be empty after the event has finished dispatching.');
42 t.done();
43 }));
44}, 'getTargetRanges() returns correct range and cleared after dispatch.');
45
46async_test(t => {
47 const expectedEventLog = ['test2-5-test2-5', 'test2a-0-test2a-6', 'b-0-b-1'];
48 const actualEventLog = [];
49
50 const test2_editable = document.getElementById('test2_editable');
51 test2_editable.addEventListener('beforeinput', t.step_func(event => {
52 const ranges = event.getTargetRanges();
53 assert_equals(ranges.length, 1);
54 const range = ranges[0];
55 actualEventLog.push(
56 `${range.startContainer.textContent}-${range.startOffset}-${range.endContainer.textContent}-${range.endOffset}`);
57
58 if (actualEventLog.length == expectedEventLog.length) {
59 assert_array_equals(actualEventLog, expectedEventLog,
60 `Expected: ${expectedEventLog}; Actual: ${actualEventLog}.`);
61 t.done();
62 }
63 }));
64}, 'Actions other than deletion should have current selection as target ranges.');
65
66async_test(t => {
67 const test3_plain = document.getElementById('test3_plain');
68 test3_plain.addEventListener('beforeinput', t.step_func(event => {
69 assert_equals(event.getTargetRanges().length, 0,
70 'getTargetRanges() should return empty array on textarea.');
71
72 if (event.inputType === 'deleteContentBackward')
73 t.done();
74 }));
75}, 'Textarea should have empty target range.');
76</script>