Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!doctype html>
<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m">
<title>Test that typing lots of characters inside vertical text inputs doesn't cause scroll position changes</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<style>
.spacer {
height: 100vh;
}
input {
font-family: monospace;
/* Use an explicit whole-number-of-pixels height, to avoid tripping
Mozilla bug 1851066, regarding fractional scroll positions
triggering an async 1px adjustment to scrollTop. We can remove this
once that bug is fixed.
(Without this hack, the input element may end up with a height
that's a fractional number of pixels, depending on the font.
And then this test's call to 'scrollIntoView' puts us at a
fractional scroll-position, to bottom-align the input element. And
that's sufficient to trigger bug 1851066 and get an asynchronous 1px
adjustment to scrollTop, which this test doesn't expect.
*/
height: 200px;
}
</style>
<div class="spacer"></div>
<input id="testInput">
<div class="spacer"></div>
<script>
for (const inputType of ["text", "password", "search", "number"]) {
testInput.type = inputType;
for (const writingMode of ["vertical-lr", "vertical-rl", "sideways-lr", "sideways-rl"]) {
if (!CSS.supports("writing-mode", writingMode))
continue;
promise_test(async t => {
assert_true(
document.documentElement.scrollHeight > document.documentElement.clientHeight,
"Page is scrollable"
);
testInput.style.writingMode = writingMode;
document.documentElement.scrollTop = 0;
t.add_cleanup(() => {
document.documentElement.scrollTop = 0;
testInput.value = "";
});
// Align input to the bottom edge
testInput.scrollIntoView({block: "end", inline: "nearest"});
assert_true(
document.documentElement.scrollTop > 0,
"Successfully scrolled"
);
const oldScrollTop = document.documentElement.scrollTop;
const numCharsToOverflow = document.documentElement.clientHeight / parseInt(getComputedStyle(testInput).fontSize);
const value = "1".repeat(numCharsToOverflow);
testInput.focus({ preventScroll: true });
await test_driver.send_keys(testInput, value);
assert_equals(
document.documentElement.scrollTop,
oldScrollTop,
"Typing lots of characters in input did not cause scrolling"
);
}, `input[type=${inputType}] in ${writingMode}: typing characters in input should not cause the page to scroll`);
}
}
</script>