blob: eedc72b3fc5b539903c6aaf6cac64bb656602792 [file] [edit]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<style>
div::first-letter {
color: red;
}
</style>
</head>
<body>
<div id="test1">Hello</div>
<div id="test2">12</div>
<div id="test3">"Quote</div>
<div id="test4">A</div>
<div id="test5"><span>Nested</span></div>
<div id="test6">First<br>Second</div>
<div id="test7" contenteditable>Editable</div>
<div id="container"></div>
<script>
description("Test that selection works correctly with ::first-letter pseudo-element.");
function selectAll(element) {
var range = document.createRange();
range.selectNodeContents(element);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
function selectRange(node, start, end) {
var range = document.createRange();
range.setStart(node, start);
range.setEnd(node, end);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
// Test 1: Select all text in element with first-letter
selectAll(test1);
shouldBeEqualToString("window.getSelection().toString()", "Hello");
// Test 2: Short text - select all
selectAll(test2);
shouldBeEqualToString("window.getSelection().toString()", "12");
// Test 3: First-letter with punctuation (first-letter includes quote + letter)
selectAll(test3);
shouldBeEqualToString("window.getSelection().toString()", "\"Quote");
// Test 4: Single character text (entire text is first-letter)
selectAll(test4);
shouldBeEqualToString("window.getSelection().toString()", "A");
// Test 5: First-letter with nested inline
selectAll(test5);
shouldBeEqualToString("window.getSelection().toString()", "Nested");
// Test 6: Multi-line - select all should get both lines
selectAll(test6);
shouldBeEqualToString("window.getSelection().toString().replace(/\\n/g, '|')", "First|Second");
// Test 7: Contenteditable with first-letter
selectAll(test7);
shouldBeEqualToString("window.getSelection().toString()", "Editable");
// Test 8: Select only the first-letter portion
selectRange(test2.firstChild, 0, 1);
shouldBeEqualToString("window.getSelection().toString()", "1");
// Test 9: Select only the remaining portion (after first-letter)
selectRange(test2.firstChild, 1, 2);
shouldBeEqualToString("window.getSelection().toString()", "2");
// Test 10: Select range spanning first-letter boundary
selectRange(test1.firstChild, 0, 3);
shouldBeEqualToString("window.getSelection().toString()", "Hel");
// Test 11: Select from middle of first-letter text to end
selectRange(test3.firstChild, 0, 2);
shouldBeEqualToString("window.getSelection().toString()", "\"Q");
// Test 12: Caret at first-letter boundary (offset = first-letter length)
selectRange(test1.firstChild, 1, 1);
shouldBe("window.getSelection().isCollapsed", "true");
shouldBe("window.getSelection().anchorOffset", "1");
// Test 13: Caret at start of text (offset 0, inside first-letter)
selectRange(test1.firstChild, 0, 0);
shouldBe("window.getSelection().isCollapsed", "true");
shouldBe("window.getSelection().anchorOffset", "0");
// Test 14: Select all on single-character first-letter (entire text is first-letter)
selectRange(test4.firstChild, 0, 1);
shouldBeEqualToString("window.getSelection().toString()", "A");
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>