Skip to content

Commit e60f4b7

Browse files
committed
Don't trust bounding client rects for characters
In some cases, on wrapping points, they span the whole line Issue codemirror#4097
1 parent a3d9a31 commit e60f4b7

File tree

1 file changed

+13
-10
lines changed

1 file changed

+13
-10
lines changed

lib/codemirror.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2688,6 +2688,16 @@
26882688
return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd};
26892689
}
26902690

2691+
function getUsefulRect(rects, bias) {
2692+
var rect = nullRect
2693+
if (bias == "left") for (var i = 0; i < rects.length; i++) {
2694+
if ((rect = rects[i]).left != rect.right) break
2695+
} else for (var i = rects.length - 1; i >= 0; i--) {
2696+
if ((rect = rects[i]).left != rect.right) break
2697+
}
2698+
return rect
2699+
}
2700+
26912701
function measureCharInner(cm, prepared, ch, bias) {
26922702
var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
26932703
var node = place.node, start = place.start, end = place.end, collapse = place.collapse;
@@ -2697,17 +2707,10 @@
26972707
for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned
26982708
while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start;
26992709
while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end;
2700-
if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) {
2710+
if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)
27012711
rect = node.parentNode.getBoundingClientRect();
2702-
} else if (ie && cm.options.lineWrapping) {
2703-
var rects = range(node, start, end).getClientRects();
2704-
if (rects.length)
2705-
rect = rects[bias == "right" ? rects.length - 1 : 0];
2706-
else
2707-
rect = nullRect;
2708-
} else {
2709-
rect = range(node, start, end).getBoundingClientRect() || nullRect;
2710-
}
2712+
else
2713+
rect = getUsefulRect(range(node, start, end).getClientRects(), bias)
27112714
if (rect.left || rect.right || start == 0) break;
27122715
end = start;
27132716
start = start - 1;

0 commit comments

Comments
 (0)