diff --git a/src/lines-tile-component.coffee b/src/lines-tile-component.coffee index 5fdadf212..8af408da5 100644 --- a/src/lines-tile-component.coffee +++ b/src/lines-tile-component.coffee @@ -346,17 +346,44 @@ class LinesTileComponent rangeForMeasurement ?= document.createRange() iterator = document.createNodeIterator(lineNode, NodeFilter.SHOW_TEXT, AcceptFilter) textNode = iterator.nextNode() + textNodeLength = textNode.length textNodeIndex = 0 nextTextNodeIndex = textNode.textContent.length while nextTextNodeIndex <= charIndex textNode = iterator.nextNode() + textNodeLength = textNode.length textNodeIndex = nextTextNodeIndex nextTextNodeIndex = textNodeIndex + textNode.textContent.length i = charIndex - textNodeIndex rangeForMeasurement.setStart(textNode, i) - rangeForMeasurement.setEnd(textNode, i + charLength) + + if i + charLength <= textNodeLength + rangeForMeasurement.setEnd(textNode, i + charLength) + else + rangeForMeasurement.setEnd(textNode, textNodeLength) + atom.assert false, "Expected index to be less than the length of text node while measuring", (error) => + editor = @presenter.model + screenRow = tokenizedLine.screenRow + bufferRow = editor.bufferRowForScreenRow(screenRow) + + error.metadata = { + grammarScopeName: editor.getGrammar().scopeName + screenRow: screenRow + bufferRow: bufferRow + softWrapped: editor.isSoftWrapped() + softTabs: editor.getSoftTabs() + i: i + charLength: charLength + textNodeLength: textNode.length + } + error.privateMetadataDescription = "The contents of line #{bufferRow + 1}." + error.privateMetadata = { + lineText: editor.lineTextForBufferRow(bufferRow) + } + error.privateMetadataRequestName = "measured-line-text" + charWidth = rangeForMeasurement.getBoundingClientRect().width @presenter.setScopedCharacterWidth(scopes, char, charWidth)