Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: third_party/WebKit/LayoutTests/fast/forms/textfield-change-event.html

Issue 2796853002: Update text field 'change' event logic to match to Firefox. (Closed)
Patch Set: . Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/html/HTMLInputElement.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <body> 2 <body>
3 <script src="../../resources/testharness.js"></script> 3 <script src="../../resources/testharness.js"></script>
4 <script src="../../resources/testharnessreport.js"></script> 4 <script src="../../resources/testharnessreport.js"></script>
5 5
6 <input id="input" type="text" onchange="changeHandler()"> 6 <input id="input" type="text" onchange="changeHandler()">
7 <input id="number" type="number" onchange="changeHandler()"> 7 <input id="number" type="number" onchange="changeHandler()">
8 <textarea id="textarea" onchange="changeHandler()"></textarea> 8 <textarea id="textarea" onchange="changeHandler()"></textarea>
9 9
10 <script> 10 <script>
11 var changeEventCounter = 0; 11 var changeEventCounter = 0;
12 function changeHandler() { 12 function changeHandler() {
13 changeEventCounter++; 13 changeEventCounter++;
14 element.value = ''; 14 element.value = '';
15 } 15 }
16 16
17 function elementDesc(element) { 17 function elementDesc(element) {
18 if (element.tagName == 'TEXTAREA') 18 if (element.tagName == 'TEXTAREA')
19 return 'TEXTAREA'; 19 return 'TEXTAREA';
20 return 'INPUT[type=' + element.type + ']'; 20 return 'INPUT[type=' + element.type + ']';
21 } 21 }
22 22
23 function escape(str) {
24 if (str === null || str === undefined)
25 return 'null';
26 var result ='\x22';
27 for (var i = 0; i < str.length; ++i) {
28 if (str[i] == '\b')
29 result += '\\b';
30 else if (str[i] == '\x22')
31 result += '\\\x22';
32 else
33 result += str[i];
34 }
35 return result + '\x22';
36 }
37
38 function typeAsUser(userInput) {
39 if (!userInput)
40 return;
41 if (userInput.indexOf('\b') < 0) {
42 document.execCommand('InsertText', false, userInput);
43 return;
44 }
45 for (var i = 0; i < userInput.length; ++i) {
46 if (userInput[i] == '\b')
47 document.execCommand('Delete', false, '');
48 else
49 document.execCommand('InsertText', false, userInput[i]);
50 }
51 }
52
23 function testValueUpdateOnChange(element, userInput) { 53 function testValueUpdateOnChange(element, userInput) {
24 test(() => { 54 test(() => {
25 changeEventCounter = 0; 55 changeEventCounter = 0;
26 element.focus(); 56 element.focus();
27 document.execCommand('InsertText', false, userInput); 57 document.execCommand('InsertText', false, userInput);
28 assert_equals(element.value, userInput); 58 assert_equals(element.value, userInput);
29 element.blur(); 59 element.blur();
30 assert_equals(changeEventCounter, 1); 60 assert_equals(changeEventCounter, 1);
31 assert_equals(element.value, ''); 61 assert_equals(element.value, '');
32 62
33 element.focus(); 63 element.focus();
34 document.execCommand('InsertText', false, userInput); 64 document.execCommand('InsertText', false, userInput);
35 assert_equals(element.value, userInput); 65 assert_equals(element.value, userInput);
36 element.blur(); 66 element.blur();
37 assert_equals(changeEventCounter, 2); 67 assert_equals(changeEventCounter, 2);
38 }, elementDesc(element) + ': Updating value in a CHANGE event handler'); 68 }, elementDesc(element) + ': Updating value in a CHANGE event handler');
39 } 69 }
40 70
41 function testValueUpdateWithoutUserEdit(element, jsInput) { 71 function testUserEditSetValueUserEdit(element, initial, userInput1, jsInput, use rInput2, expectation) {
42 test(() => { 72 test(() => {
43 changeEventCounter = 0; 73 changeEventCounter = 0;
44 element.value = ''; 74 element.value = initial;
45 element.focus(); 75 element.focus();
76 typeAsUser(userInput1);
46 element.value = jsInput; 77 element.value = jsInput;
78 typeAsUser(userInput2);
47 element.blur(); 79 element.blur();
48 assert_equals(changeEventCounter, 0); 80 assert_equals(changeEventCounter, expectation ? 1 : 0);
49 }, elementDesc(element) + ': Updating value while element is focused'); 81 }, `${elementDesc(element)}: Sequence of User-edit ${escape(userInput1)}, elem ent.value=${escape(jsInput)}, User-edit ${escape(userInput2)} should dispatch ${ expectation ? 'a' : 'no'} CHANGE event.`);
50 }
51
52 function testValueUpdateAfterUserEdit(element, userInput, jsInput) {
53 test(() => {
54 changeEventCounter = 0;
55 element.value = '0';
56 element.focus();
57 document.execCommand('InsertText', false, userInput);
58 element.value = jsInput;
59 element.blur();
60 assert_equals(changeEventCounter, 1);
61 }, elementDesc(element) + ': Updating value after a user edit');
62 } 82 }
63 83
64 var element = document.getElementById('input'); 84 var element = document.getElementById('input');
65 testValueUpdateOnChange(element, 'foo bar'); 85 testValueUpdateOnChange(element, 'foo bar');
66 testValueUpdateWithoutUserEdit(element, 'FOO BAR'); 86 testUserEditSetValueUserEdit(element, '', null, 'FOO BAR', null, false);
67 testValueUpdateAfterUserEdit(element, 'foo bar', 'FOO BAR'); 87 testUserEditSetValueUserEdit(element, '0', 'foo bar', 'FOO BAR', null, true);
88 testUserEditSetValueUserEdit(element, '', null, 'hello', '\b\b\b\b\b', true);
89 testUserEditSetValueUserEdit(element, '', null, 'hello', 'abc\b\b\b', false);
90 testUserEditSetValueUserEdit(element, '', 'foo', 'hello', null, true);
91 testUserEditSetValueUserEdit(element, '', 'hello', 'hello', null, true);
92 testUserEditSetValueUserEdit(element, '', 'foo', 'hello', '\b\b\b\b\b', false);
93 testUserEditSetValueUserEdit(element, '', 'foo\b\b\b', 'hello', null, false);
94 testUserEditSetValueUserEdit(element, '', 'foo', '', null, false);
95 testUserEditSetValueUserEdit(element, '0', 'foo', '', '0', false);
68 96
69 element = document.getElementById('number'); 97 element = document.getElementById('number');
70 testValueUpdateOnChange(element, '123'); 98 testValueUpdateOnChange(element, '123');
71 testValueUpdateWithoutUserEdit(element, '999'); 99 testUserEditSetValueUserEdit(element, '', null, '999', null, false);
72 testValueUpdateAfterUserEdit(element, '123', '999'); 100 testUserEditSetValueUserEdit(element, '0', '123', '999', null, true);
101 testUserEditSetValueUserEdit(element, '', null, '234', '\b\b\b', true);
102 testUserEditSetValueUserEdit(element, '', null, '234', '56\b\b', false);
103 testUserEditSetValueUserEdit(element, '', '1', '234', null, true);
104 testUserEditSetValueUserEdit(element, '', '234', '234', null, true);
105 testUserEditSetValueUserEdit(element, '', '1', '234', '\b\b\b', false);
106 testUserEditSetValueUserEdit(element, '', '1\b', '234', null, false);
107 testUserEditSetValueUserEdit(element, '', '1', '', null, false);
108 testUserEditSetValueUserEdit(element, '0', '1', '', '0', false);
73 109
74 element = document.getElementById('textarea'); 110 element = document.getElementById('textarea');
75 testValueUpdateOnChange(element, 'foo bar'); 111 testValueUpdateOnChange(element, 'foo bar');
76 testValueUpdateWithoutUserEdit(element, 'FOO BAR'); 112 testUserEditSetValueUserEdit(element, '', null, 'FOO BAR', null, false);
77 testValueUpdateAfterUserEdit(element, 'foo bar', 'FOO BAR'); 113 testUserEditSetValueUserEdit(element, '0', 'foo bar', 'FOO BAR', null, true);
114 testUserEditSetValueUserEdit(element, '', null, 'hello', '\b\b\b\b\b', true);
115 testUserEditSetValueUserEdit(element, '', null, 'hello', 'abc\b\b\b', false);
116 testUserEditSetValueUserEdit(element, '', 'foo', 'hello', null, true);
117 testUserEditSetValueUserEdit(element, '', 'hello', 'hello', null, true);
118 testUserEditSetValueUserEdit(element, '', 'foo', 'hello', '\b\b\b\b\b', false);
119 testUserEditSetValueUserEdit(element, '', 'foo\b\b\b', 'hello', null, false);
120 testUserEditSetValueUserEdit(element, '', 'foo', '', null, false);
121 testUserEditSetValueUserEdit(element, '0', 'foo', '', '0', false);
78 </script> 122 </script>
79 </body> 123 </body>
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/html/HTMLInputElement.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698