mirror of
https://github.com/atom/atom.git
synced 2026-01-24 14:28:14 -05:00
Guard against IndexSizeError when measuring lines
Refs #7464 #7465 #5997 This will ask the user for the content of the offending line, but only once so as not to be annoying. Hopefully this and the other data we’re collecting will help us solve the problem. Signed-off-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
This commit is contained in:
committed by
Max Brunsfeld
parent
54549f916a
commit
08fe81844c
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user