From 1a22fc3c6893c570e4773811569b8c0fd6939afc Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 8 Jul 2014 14:17:39 -0600 Subject: [PATCH] Streamline character width remeasurement to hopefully avoid exceptions Previously, I was just remeasuring characters whenever the stylesheets changed. I think there were situations in which the model changed, then I remeasured characters prior to updating the view to match the model, causing DOM exceptions. This switches the approach to only ever measure characters after an update, ensuring the view always matches the model. --- src/editor-component.coffee | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/editor-component.coffee b/src/editor-component.coffee index 7fd3c8fbb..9c13be9a6 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -28,7 +28,6 @@ EditorComponent = React.createClass updateRequested: false updatesPaused: false updateRequestedWhilePaused: false - characterWidthRemeasurementRequested: false cursorsMoved: false selectionChanged: false selectionAdded: false @@ -43,7 +42,7 @@ EditorComponent = React.createClass scrollSensitivity: 0.4 scrollViewMeasurementRequested: false measureLineHeightAndDefaultCharWidthWhenShown: false - remeasureCharacterWidthsWhenShown: false + remeasureCharacterWidthsIfVisibleAfterNextUpdate: false inputEnabled: true scrollViewMeasurementInterval: 100 scopedCharacterWidthsChangeCount: null @@ -655,7 +654,8 @@ EditorComponent = React.createClass onStylesheetsChanged: (stylesheet) -> @refreshScrollbars() if @containsScrollbarSelector(stylesheet) - @requestCharacterWidthRemeasurement() + @remeasureCharacterWidthsIfVisibleAfterNextUpdate = true + @requestUpdate() if @state.visible onScreenLinesChanged: (change) -> {editor} = @props @@ -792,22 +792,12 @@ EditorComponent = React.createClass if @state.visible @remeasureCharacterWidths() else - @remeasureCharacterWidthsWhenShown = true - else if @remeasureCharacterWidthsWhenShown and @state.visible and not prevState.visible + @remeasureCharacterWidthsIfVisibleAfterNextUpdate = true + else if @remeasureCharacterWidthsIfVisibleAfterNextUpdate and @state.visible + @remeasureCharacterWidthsIfVisibleAfterNextUpdate = false @remeasureCharacterWidths() - requestCharacterWidthRemeasurement: -> - unless @characterWidthRemeasurementRequested - @characterWidthRemeasurementRequested = true - setImmediate => - @characterWidthRemeasurementRequested = false - if @state.visible - @remeasureCharacterWidths() - else - @remeasureCharacterWidthsWhenShown = true - remeasureCharacterWidths: -> - @remeasureCharacterWidthsWhenShown = false @refs.lines.remeasureCharacterWidths() onGutterWidthChanged: (@gutterWidth) ->