From b4dec8ccbb071a7d4ad3296feb42f53d78177af8 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 10 May 2013 12:55:44 -0600 Subject: [PATCH] In Editor.updateRenderedLines, cap renderFrom to the last screen row If we remove a large number of screen lines when we are scrolled down, the current @firstRenderedScreenRow may end up being larger than the number of screen rows we now have. Setting renderFrom to the @firstRenderedScreenRow in this case was causing the renderFrom to be larger than the renderTo, which was causing problems downstream with the new mapping code. --- spec/app/editor-spec.coffee | 9 +++++++++ src/app/editor.coffee | 9 +++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 1b2d4ff11..073cee8c6 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -1388,6 +1388,15 @@ describe "Editor", -> expect(editor.renderedLines.find('.line').length).toBe 1 expect(editor.renderedLines.find('.line').text()).toBe buffer.lineForRow(0) + describe "when folding leaves fewer screen lines than the first rendered screen line (regression)", -> + it "clears all screen lines and does not throw any exceptions", -> + editor.lineOverdraw = 1 + editor.attachToDom(heightInLines: 5) + editor.scrollToBottom() + editor.activeEditSession.foldBufferRow(0) + expect(editor.renderedLines.find('.line').length).toBe 1 + expect(editor.renderedLines.find('.line').text()).toBe buffer.lineForRow(0) + describe "when autoscrolling at the end of the document", -> it "renders lines properly", -> editor.edit(project.buildEditSession('two-hundred.txt')) diff --git a/src/app/editor.coffee b/src/app/editor.coffee index dc512d31b..42888db14 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -1149,13 +1149,14 @@ class Editor extends View updateRenderedLines: -> firstVisibleScreenRow = @getFirstVisibleScreenRow() lastVisibleScreenRow = @getLastVisibleScreenRow() + lastScreenRow = @getLastScreenRow() if @firstRenderedScreenRow? and firstVisibleScreenRow >= @firstRenderedScreenRow and lastVisibleScreenRow <= @lastRenderedScreenRow - renderFrom = @firstRenderedScreenRow - renderTo = Math.min(@getLastScreenRow(), @lastRenderedScreenRow) + renderFrom = Math.min(lastScreenRow, @firstRenderedScreenRow) + renderTo = Math.min(lastScreenRow, @lastRenderedScreenRow) else - renderFrom = Math.max(0, firstVisibleScreenRow - @lineOverdraw) - renderTo = Math.min(@getLastScreenRow(), lastVisibleScreenRow + @lineOverdraw) + renderFrom = Math.min(lastScreenRow, Math.max(0, firstVisibleScreenRow - @lineOverdraw)) + renderTo = Math.min(lastScreenRow, lastVisibleScreenRow + @lineOverdraw) if @pendingChanges.length == 0 and @firstRenderedScreenRow and @firstRenderedScreenRow <= renderFrom and renderTo <= @lastRenderedScreenRow return