blob: 0c5e10c5836c7bae1ba209eddbcd6c77f9ed4d6e [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test.js"></script>
<Script src="../../resources/ui-helper.js"></Script>
<script>
window.jsTestIsAsync = true;
let input;
let numberOfCharactersToOverflowFieldWhenCapsLockShown;
let tests = [
// Test for caret selection
// Empty field
testFocusedEmptyFieldIsNotScrolled,
testFieldDidNotScrollAfterCapsLockEnabled,
testFieldDidNotScrollAfterCapsLockDisabled,
// Non-empty field
testFieldDidNotScrollAfterTyping,
testFieldDidScrollAfterCapsLockEnabled,
testFieldDidScrollAfterCapsLockDisabled,
// Test for range selection
// Select the first few characters
testFieldDidNotScrollAfterSelectingPrefix,
testFieldDidNotScrollAfterCapsLockEnabled,
testFieldDidNotScrollAfterCapsLockDisabled,
// Select the last few characters
testFieldDidNotScrollAfterSelectingSuffix,
testFieldDidScrollAfterCapsLockEnabled,
testFieldDidScrollAfterCapsLockDisabled,
];
let currentTest = 0;
function runNextTest()
{
if (currentTest >= tests.length) {
done();
return;
}
tests[currentTest++]();
}
function runTest()
{
runNextTest();
}
function testFocusedEmptyFieldIsNotScrolled()
{
debug("Case 1: Empty field:");
function handleFocus() {
shouldBeZero("document.getElementById('input').scrollLeft");
runNextTest();
}
input.addEventListener("focus", handleFocus, { once: true });
if (window.testRunner)
UIHelper.activateElement(input);
else
input.focus();
}
function testFieldDidNotScrollAfterTyping()
{
function checkFieldFilled(event) {
console.assert(event.target === input);
if (input.value.length < numberOfCharactersToOverflowFieldWhenCapsLockShown)
return;
input.oninput = null;
shouldBeZero("document.getElementById('input').scrollLeft");
runNextTest();
}
input.oninput = checkFieldFilled;
debug("<br>Case 2: After typing into field:");
if (window.testRunner) {
for (let i = 0; i < numberOfCharactersToOverflowFieldWhenCapsLockShown; ++i)
UIHelper.keyDown("a");
}
}
function _toggleCapsLockWithCallbackAndRunNextTest(expectCapsLockEnabled, callback)
{
if (window.internals)
console.assert(internals.capsLockIsOn() != expectCapsLockEnabled);
let newCapsLockStateDisplayName;
let eventToListenFor;
if (expectCapsLockEnabled) {
newCapsLockStateDisplayName = "enabled";
eventToListenFor = "keydown";
} else {
newCapsLockStateDisplayName = "disabled";
eventToListenFor = "keyup";
}
let oldValue = document.getElementById("input").scrollLeft;
function handleCapsLockChange(event) {
console.assert(event.key === "CapsLock");
callback(oldValue, document.getElementById("input").scrollLeft);
runNextTest();
}
input.addEventListener(eventToListenFor, handleCapsLockChange, { once: true });
debug(`<br>After caps lock ${newCapsLockStateDisplayName}:`);
if (window.testRunner)
UIHelper.toggleCapsLock();
}
function testFieldDidScrollAfterCapsLockEnabled()
{
_toggleCapsLockWithCallbackAndRunNextTest(true, (oldValue, newValue) => {
console.assert(oldValue != newValue);
shouldBeNonZero("document.getElementById('input').scrollLeft");
});
}
function testFieldDidScrollAfterCapsLockDisabled()
{
_toggleCapsLockWithCallbackAndRunNextTest(false, (oldValue, newValue) => {
console.assert(oldValue != newValue);
shouldBeZero("document.getElementById('input').scrollLeft");
});
}
function testFieldDidNotScrollAfterCapsLockEnabled()
{
_toggleCapsLockWithCallbackAndRunNextTest(true, (oldValue, newValue) => {
console.assert(oldValue == newValue);
shouldBeZero("document.getElementById('input').scrollLeft");
});
}
function testFieldDidNotScrollAfterCapsLockDisabled()
{
_toggleCapsLockWithCallbackAndRunNextTest(false, (oldValue, newValue) => {
console.assert(oldValue == newValue);
shouldBeZero("document.getElementById('input').scrollLeft");
});
}
function testFieldDidNotScrollAfterSelectingPrefix()
{
let prefixLength = Math.floor(numberOfCharactersToOverflowFieldWhenCapsLockShown / 2);
debug(`<br>Case 3: After selecting the first ${prefixLength} characters:`);
input.setSelectionRange(0, prefixLength);
shouldBeZero("document.getElementById('input').scrollLeft");
runNextTest();
}
function testFieldDidNotScrollAfterSelectingSuffix()
{
let suffixLength = Math.floor(numberOfCharactersToOverflowFieldWhenCapsLockShown / 2);
debug(`<br>Case 4: After selecting the last ${suffixLength} characters:`);
input.setSelectionRange(input.value.length - suffixLength, input.value.length);
shouldBeZero("document.getElementById('input').scrollLeft");
runNextTest();
}
function done()
{
if (window.testRunner)
document.body.removeChild(document.getElementById("input"));
finishJSTest();
}
</script>
</head>
<body onload="runTest()">
<input type="password" id="input" size="5">
<script>
input = document.getElementById("input");
console.assert(input.hasAttribute("size"));
numberOfCharactersToOverflowFieldWhenCapsLockShown = input.size;
// FIXME: Find a way to compute the maximum number of visible characters the field can hold
// in a way that allows for running this test by hand.
let mayBeIOS = window.TouchEvent != undefined;
if (mayBeIOS) {
// The look of the password field on iOS gives less space to the value than on Mac.
--numberOfCharactersToOverflowFieldWhenCapsLockShown;
}
console.assert(numberOfCharactersToOverflowFieldWhenCapsLockShown >= 3);
description("Tests that the password field is scrolled when the caps lock indicator is toggled.");
</script>
</body>
</html>