blob: ef57ec3d8ef93c52080cf3170bf56e514a1dc663 [file] [log] [blame]
<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<textarea dir="auto" style="font-size: 20px; width: 20ex"></textarea>
<script>
// Tests various scenarios for caret position when direction is auto.
// Since Hebrew letters are not covered by Ahem font, we can't test the caret
// positions at exact pixels. We test their relative ordering instead.
const textarea = document.querySelector('textarea');
textarea.value = '\u05d0!\nhello\u05d1\u05d2bye ';
textarea.focus();
// <textarea> looks like:
// +-----------------+
// | !A|
// |helloCBbye_ |
// +-----------------+
const length = textarea.value.length;
const caretPositions = [];
test(() => {
assert_not_equals(
window.internals, undefined, 'This test requires textInputController');
for (let i = 0; i <= length; ++i) {
textarea.setSelectionRange(i, i);
caretPositions.push(internals.absoluteCaretBounds());
}
}, '0. Get all caret positions');
test(() => {
assert_equals(caretPositions.length, 15);
const firstLineY = caretPositions[0].y;
const secondLineY = caretPositions[3].y;
assert_less_than(firstLineY, secondLineY);
assert_equals(caretPositions[0].y, firstLineY, '1-0');
assert_equals(caretPositions[1].y, firstLineY, '1-1');
assert_equals(caretPositions[2].y, firstLineY, '1-2');
assert_equals(caretPositions[3].y, secondLineY, '1-3');
assert_equals(caretPositions[4].y, secondLineY, '1-4');
assert_equals(caretPositions[5].y, secondLineY, '1-5');
assert_equals(caretPositions[6].y, secondLineY, '1-6');
assert_equals(caretPositions[7].y, secondLineY, '1-7');
assert_equals(caretPositions[8].y, secondLineY, '1-8');
assert_equals(caretPositions[9].y, secondLineY, '1-9');
assert_equals(caretPositions[10].y, secondLineY, '1-10');
assert_equals(caretPositions[11].y, secondLineY, '1-11');
assert_equals(caretPositions[12].y, secondLineY, '1-12');
assert_equals(caretPositions[13].y, secondLineY, '1-13');
assert_equals(caretPositions[14].y, secondLineY, '1-14');
}, '1. Caret positions are in the correct lines');
test(() => {
assert_equals(caretPositions.length, 15);
const firstLineLeftmostX = caretPositions[2].x;
// caretPositions[2] is at the left side of '!' in the first line
// before the line break, illustrated as below:
// +-----------------+
// | |!A|
// |helloCBbye_ |
// +-----------------+
assert_greater_than(caretPositions[0].x, firstLineLeftmostX, '2-0');
assert_greater_than(caretPositions[1].x, firstLineLeftmostX, '2-1');
assert_less_than(caretPositions[3].x, firstLineLeftmostX, '2-3');
assert_less_than(caretPositions[4].x, firstLineLeftmostX, '2-4');
assert_less_than(caretPositions[5].x, firstLineLeftmostX, '2-5');
assert_less_than(caretPositions[6].x, firstLineLeftmostX, '2-6');
assert_less_than(caretPositions[7].x, firstLineLeftmostX, '2-7');
assert_less_than(caretPositions[8].x, firstLineLeftmostX, '2-8');
assert_less_than(caretPositions[9].x, firstLineLeftmostX, '2-9');
assert_less_than(caretPositions[10].x, firstLineLeftmostX, '2-10');
assert_less_than(caretPositions[11].x, firstLineLeftmostX, '2-11');
assert_less_than(caretPositions[12].x, firstLineLeftmostX, '2-12');
assert_less_than(caretPositions[13].x, firstLineLeftmostX, '2-13');
assert_less_than(caretPositions[14].x, firstLineLeftmostX, '2-14');
}, '2. LTR line caret positions are to the left of RTL line caret positions');
test(() => {
assert_equals(caretPositions.length, 15);
assert_greater_than(caretPositions[0].x, caretPositions[1].x, '3-1');
assert_greater_than(caretPositions[1].x, caretPositions[2].x, '3-2');
}, '3. First line caret position ordering');
test(() => {
assert_equals(caretPositions.length, 15);
assert_less_than(caretPositions[3].x, caretPositions[4].x, '4-3');
assert_less_than(caretPositions[4].x, caretPositions[5].x, '4-4');
assert_less_than(caretPositions[5].x, caretPositions[6].x, '4-5');
assert_less_than(caretPositions[6].x, caretPositions[7].x, '4-6');
if (!internals.runtimeFlags.bidiCaretAffinityEnabled) {
assert_less_than(caretPositions[7].x, caretPositions[8].x, '4-7');
assert_less_than(caretPositions[8].x, caretPositions[9].x, '4-8');
assert_less_than(caretPositions[9].x, caretPositions[10].x, '4-9');
} else {
// The downstream caret positions are at:
// h e l l o C B b y e _
// 3 4 5 6 7 X 9 8&10 11 12 13
assert_less_than(caretPositions[7].x, caretPositions[9].x, '4-7');
assert_less_than(caretPositions[9].x, caretPositions[8].x, '4-9');
assert_less_than_equal(caretPositions[8].x, caretPositions[10].x, '4-8');
}
assert_less_than(caretPositions[10].x, caretPositions[11].x, '4-10');
assert_less_than(caretPositions[11].x, caretPositions[12].x, '4-11');
assert_less_than(caretPositions[12].x, caretPositions[13].x, '4-12');
assert_less_than(caretPositions[13].x, caretPositions[14].x, '4-13');
}, '4. Second line caret position ordering');
</script>