@@ -504,8 +504,8 @@ public void testToString() throws Exception {
504504 + " log(r.toString());\n "
505505 + "</script></body></html>" ;
506506 loadPageVerifyTitle2 (html );
507-
508507 }
508+
509509 /**
510510 * Test getClientRects for a range over a text node (setStart/setEnd on a text node with char offsets).
511511 *
@@ -620,4 +620,89 @@ public void getClientRectsOnTextNodeMidString() throws Exception {
620620 + "</script></body></html>" ;
621621 loadPageVerifyTitle2 (html );
622622 }
623+
624+ /**
625+ * Tests all six boundary-point setters: setStart, setStartBefore, setStartAfter,
626+ * setEnd, setEndBefore, setEndAfter.
627+ * Verifies that each method sets the correct boundary (start vs end) and the
628+ * correct container/offset. In particular, setEndBefore was bugged: it called
629+ * internSetStartContainer/internSetStartOffset instead of the End variants.
630+ * @throws Exception if an error occurs
631+ */
632+ @ Test
633+ @ Alerts ({
634+ // setStart(b, 1) -> startContainer=DIV, startOffset=1
635+ "setStart: DIV 1 DIV 4" ,
636+ // setStartBefore(b) -> startContainer=DIV, startOffset=1 (b is at index 1)
637+ "setStartBefore: DIV 1 DIV 4" ,
638+ // setStartAfter(b) -> startContainer=DIV, startOffset=2 (after b = index 2)
639+ "setStartAfter: DIV 2 DIV 4" ,
640+ // setEnd(c, 2) -> endContainer=DIV, endOffset=2
641+ "setEnd: DIV 0 DIV 2" ,
642+ // setEndBefore(c) -> endContainer=DIV, endOffset=2 (c is at index 2)
643+ "setEndBefore: DIV 0 DIV 2" ,
644+ // setEndAfter(c) -> endContainer=DIV, endOffset=3 (after c = index 3)
645+ "setEndAfter: DIV 0 DIV 3"
646+ })
647+ public void setBoundaryPoints () throws Exception {
648+ final String html = DOCTYPE_HTML
649+ + "<html><body>\n "
650+ + " <div id='d'>"
651+ + "<span id='a'>a</span>"
652+ + "<span id='b'>b</span>"
653+ + "<span id='c'>c</span>"
654+ + "<span id='e'>e</span>"
655+ + "</div>\n "
656+ + "<script>\n "
657+ + LOG_TITLE_FUNCTION
658+ + "function rangeInfo(label, r) {\n "
659+ + " var sc = r.startContainer.nodeName;\n "
660+ + " var ec = r.endContainer.nodeName;\n "
661+ + " log(label + ': ' + sc + ' ' + r.startOffset + ' ' + ec + ' ' + r.endOffset);\n "
662+ + "}\n "
663+ + "var d = document.getElementById('d');\n "
664+ + "var a = document.getElementById('a');\n "
665+ + "var b = document.getElementById('b');\n "
666+ + "var c = document.getElementById('c');\n "
667+
668+ // setStart: sets startContainer=d, startOffset=1; end untouched (stays at d,3 after selectNodeContents)
669+ + "var r = document.createRange();\n "
670+ + "r.selectNodeContents(d);\n " // start=d/0, end=d/4
671+ + "r.setStart(d, 1);\n "
672+ + "rangeInfo('setStart', r);\n "
673+
674+ // setStartBefore(b): b is child index 1 of d -> startContainer=d, startOffset=1
675+ + "r = document.createRange();\n "
676+ + "r.selectNodeContents(d);\n "
677+ + "r.setStartBefore(b);\n "
678+ + "rangeInfo('setStartBefore', r);\n "
679+
680+ // setStartAfter(b): b is child index 1, so after = offset 2 -> startContainer=d, startOffset=2
681+ + "r = document.createRange();\n "
682+ + "r.selectNodeContents(d);\n "
683+ + "r.setStartAfter(b);\n "
684+ + "rangeInfo('setStartAfter', r);\n "
685+
686+ // setEnd: sets endContainer=d, endOffset=2; start untouched (stays at d,0)
687+ + "r = document.createRange();\n "
688+ + "r.selectNodeContents(d);\n "
689+ + "r.setEnd(d, 2);\n "
690+ + "rangeInfo('setEnd', r);\n "
691+
692+ // setEndBefore(c): c is child index 2 -> endContainer=d, endOffset=2; start must stay at d,0
693+ // BUG: setEndBefore was calling internSetStartContainer instead of internSetEndContainer
694+ + "r = document.createRange();\n "
695+ + "r.selectNodeContents(d);\n "
696+ + "r.setEndBefore(c);\n "
697+ + "rangeInfo('setEndBefore', r);\n "
698+
699+ // setEndAfter(c): c is child index 2, so after = offset 3 -> endContainer=d, endOffset=3; start stays at d,0
700+ + "r = document.createRange();\n "
701+ + "r.selectNodeContents(d);\n "
702+ + "r.setEndAfter(c);\n "
703+ + "rangeInfo('setEndAfter', r);\n "
704+
705+ + "</script></body></html>" ;
706+ loadPageVerifyTitle2 (html );
707+ }
623708}
0 commit comments