blob: ff2658e9762edbf0c8edaddf18161b73033d675d [file] [log] [blame]
<!DOCTYPE html>
<body>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<input id="input" type="text" onchange="changeHandler()">
<input id="number" type="number" onchange="changeHandler()">
<textarea id="textarea" onchange="changeHandler()"></textarea>
<script>
var changeEventCounter = 0;
function changeHandler() {
changeEventCounter++;
element.value = '';
}
function elementDesc(element) {
if (element.tagName == 'TEXTAREA')
return 'TEXTAREA';
return 'INPUT[type=' + element.type + ']';
}
function escape(str) {
if (str === null || str === undefined)
return 'null';
var result ='\x22';
for (var i = 0; i < str.length; ++i) {
if (str[i] == '\b')
result += '\\b';
else if (str[i] == '\x22')
result += '\\\x22';
else
result += str[i];
}
return result + '\x22';
}
function typeAsUser(userInput) {
if (!userInput)
return;
if (userInput.indexOf('\b') < 0) {
document.execCommand('InsertText', false, userInput);
return;
}
for (var i = 0; i < userInput.length; ++i) {
if (userInput[i] == '\b')
document.execCommand('Delete', false, '');
else
document.execCommand('InsertText', false, userInput[i]);
}
}
function testValueUpdateOnChange(element, userInput) {
test(() => {
changeEventCounter = 0;
element.focus();
document.execCommand('InsertText', false, userInput);
assert_equals(element.value, userInput);
element.blur();
assert_equals(changeEventCounter, 1);
assert_equals(element.value, '');
element.focus();
document.execCommand('InsertText', false, userInput);
assert_equals(element.value, userInput);
element.blur();
assert_equals(changeEventCounter, 2);
}, elementDesc(element) + ': Updating value in a CHANGE event handler');
}
function testUserEditSetValueUserEdit(element, initial, userInput1, jsInput, userInput2, expectation) {
test(() => {
changeEventCounter = 0;
element.value = initial;
element.focus();
typeAsUser(userInput1);
element.value = jsInput;
typeAsUser(userInput2);
element.blur();
assert_equals(changeEventCounter, expectation ? 1 : 0);
}, `${elementDesc(element)}: Sequence of User-edit ${escape(userInput1)}, element.value=${escape(jsInput)}, User-edit ${escape(userInput2)} should dispatch ${expectation ? 'a' : 'no'} CHANGE event.`);
}
var element = document.getElementById('input');
testValueUpdateOnChange(element, 'foo bar');
testUserEditSetValueUserEdit(element, '', null, 'FOO BAR', null, false);
testUserEditSetValueUserEdit(element, '0', 'foo bar', 'FOO BAR', null, true);
testUserEditSetValueUserEdit(element, '', null, 'hello', '\b\b\b\b\b', true);
testUserEditSetValueUserEdit(element, '', null, 'hello', 'abc\b\b\b', false);
testUserEditSetValueUserEdit(element, '', 'foo', 'hello', null, true);
testUserEditSetValueUserEdit(element, '', 'hello', 'hello', null, true);
testUserEditSetValueUserEdit(element, '', 'foo', 'hello', '\b\b\b\b\b', false);
testUserEditSetValueUserEdit(element, '', 'foo\b\b\b', 'hello', null, false);
testUserEditSetValueUserEdit(element, '', 'foo', '', null, false);
testUserEditSetValueUserEdit(element, '0', 'foo', '', '0', false);
element = document.getElementById('number');
testValueUpdateOnChange(element, '123');
testUserEditSetValueUserEdit(element, '', null, '999', null, false);
testUserEditSetValueUserEdit(element, '0', '123', '999', null, true);
testUserEditSetValueUserEdit(element, '', null, '234', '\b\b\b', true);
testUserEditSetValueUserEdit(element, '', null, '234', '56\b\b', false);
testUserEditSetValueUserEdit(element, '', '1', '234', null, true);
testUserEditSetValueUserEdit(element, '', '234', '234', null, true);
testUserEditSetValueUserEdit(element, '', '1', '234', '\b\b\b', false);
testUserEditSetValueUserEdit(element, '', '1\b', '234', null, false);
testUserEditSetValueUserEdit(element, '', '1', '', null, false);
testUserEditSetValueUserEdit(element, '0', '1', '', '0', false);
element = document.getElementById('textarea');
testValueUpdateOnChange(element, 'foo bar');
testUserEditSetValueUserEdit(element, '', null, 'FOO BAR', null, false);
testUserEditSetValueUserEdit(element, '0', 'foo bar', 'FOO BAR', null, true);
testUserEditSetValueUserEdit(element, '', null, 'hello', '\b\b\b\b\b', true);
testUserEditSetValueUserEdit(element, '', null, 'hello', 'abc\b\b\b', false);
testUserEditSetValueUserEdit(element, '', 'foo', 'hello', null, true);
testUserEditSetValueUserEdit(element, '', 'hello', 'hello', null, true);
testUserEditSetValueUserEdit(element, '', 'foo', 'hello', '\b\b\b\b\b', false);
testUserEditSetValueUserEdit(element, '', 'foo\b\b\b', 'hello', null, false);
testUserEditSetValueUserEdit(element, '', 'foo', '', null, false);
testUserEditSetValueUserEdit(element, '0', 'foo', '', '0', false);
</script>
</body>