diff --git a/src/measurement/position_measurement.js b/src/measurement/position_measurement.js
index 10334443fb9c3d8e84922a06d603f8d18e7dbc69..4d24cdf57c7f5e0e03fa7aeb8f014e8c1554d467 100644
--- a/src/measurement/position_measurement.js
+++ b/src/measurement/position_measurement.js
@@ -424,6 +424,14 @@ export function coordsChar(cm, x, y) {
   }
 }
 
+function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
+  let measure = ch => intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, ch), "line")
+  let end = lineObj.text.length - 1
+  let begin = findFirst(ch => measure(ch).bottom < y, end, 0) + 1
+  end = findFirst(ch => measure(ch).top > y, begin, end + 1) - 1
+  return {begin, end}
+}
+
 function coordsCharInner(cm, lineObj, lineNo, x, y) {
   y -= heightAtLine(lineObj)
   let begin = 0, end = lineObj.text.length - 1
@@ -432,9 +440,7 @@ function coordsCharInner(cm, lineObj, lineNo, x, y) {
   let order = getOrder(lineObj)
   if (order) {
     if (cm.options.lineWrapping) {
-      let measure = ch => intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, ch), "line")
-      begin = findFirst(ch => measure(ch).bottom < y, end, begin - 1) + 1
-      end = findFirst(ch => measure(ch).top > y, begin, end + 1) - 1
+      ;({begin, end} = wrappedLineExtent(cm, lineObj, preparedMeasure, y))
     }
     if (end == lineObj.text.length - 1) ++end
     pos = new Pos(lineNo, begin)