diff --git a/spec/text-editor-component-spec.coffee b/spec/text-editor-component-spec.coffee index 2baa90ac7..b19116bd2 100644 --- a/spec/text-editor-component-spec.coffee +++ b/spec/text-editor-component-spec.coffee @@ -219,6 +219,54 @@ describe "TextEditorComponent", -> expectTileContainsRow(tilesNodes[2], 7, top: 1 * lineHeightInPixels) expectTileContainsRow(tilesNodes[2], 8, top: 2 * lineHeightInPixels) + fffit "renders the longest screen row even when it's not visible", -> + wrapperNode.style.height = 2 * lineHeightInPixels + 'px' + component.measureDimensions() + nextAnimationFrame() + + tileNodes = component.tileNodesForLines() + expect(tileNodes.length).toBe(3) + + expect(getComputedStyle(tileNodes[0]).visibility).toBe("visible") + expect(tileNodes[0].querySelectorAll(".line").length).toBe(3) + + expect(getComputedStyle(tileNodes[1]).visibility).toBe("visible") + expect(tileNodes[1].querySelectorAll(".line").length).toBe(3) + + # tile with the longest screen row + expect(getComputedStyle(tileNodes[2]).visibility).toBe("hidden") + expect(tileNodes[2].querySelectorAll(".line").length).toBe(1) + + verticalScrollbarNode.scrollTop = 4 * lineHeightInPixels + verticalScrollbarNode.dispatchEvent(new UIEvent('scroll')) + nextAnimationFrame() + + tileNodes = component.tileNodesForLines() + expect(tileNodes.length).toBe(2) # don't render an extra tile if the longest screen row is already visible + + expect(getComputedStyle(tileNodes[0]).visibility).toBe("visible") + expect(tileNodes[0].querySelectorAll(".line").length).toBe(3) + + expect(getComputedStyle(tileNodes[1]).visibility).toBe("visible") + expect(tileNodes[1].querySelectorAll(".line").length).toBe(3) + + verticalScrollbarNode.scrollTop = 0 * lineHeightInPixels + verticalScrollbarNode.dispatchEvent(new UIEvent('scroll')) + nextAnimationFrame() + + tileNodes = component.tileNodesForLines() + expect(tileNodes.length).toBe(3) + + expect(getComputedStyle(tileNodes[0]).visibility).toBe("visible") + expect(tileNodes[0].querySelectorAll(".line").length).toBe(3) + + expect(getComputedStyle(tileNodes[1]).visibility).toBe("visible") + expect(tileNodes[1].querySelectorAll(".line").length).toBe(3) + + # tile with the longest screen row + expect(getComputedStyle(tileNodes[2]).visibility).toBe("hidden") + expect(tileNodes[2].querySelectorAll(".line").length).toBe(1) + it "updates the lines when lines are inserted or removed above the rendered row range", -> wrapperNode.style.height = 4.5 * lineHeightInPixels + 'px' component.measureDimensions() @@ -2986,7 +3034,7 @@ describe "TextEditorComponent", -> atom.views.performDocumentPoll() nextAnimationFrame() - expect(componentNode.querySelectorAll('.line')).toHaveLength(6) + expect(componentNode.querySelectorAll('.line')).toHaveLength(7) # visible rows + the longest screen row gutterWidth = componentNode.querySelector('.gutter').offsetWidth componentNode.style.width = gutterWidth + 14 * charWidth + editor.getVerticalScrollbarWidth() + 'px' diff --git a/src/lines-tile-component.coffee b/src/lines-tile-component.coffee index 7f6de6397..51d11f814 100644 --- a/src/lines-tile-component.coffee +++ b/src/lines-tile-component.coffee @@ -47,6 +47,10 @@ class LinesTileComponent @domNode.style.zIndex = @newTileState.zIndex @oldTileState.zIndex = @newTileState.zIndex + if @newTileState.visibility isnt @oldTileState.visibility + @domNode.style.visibility = @newTileState.visibility + @oldTileState.visibility = @newTileState.visibility + if @newTileState.display isnt @oldTileState.display @domNode.style.display = @newTileState.display @oldTileState.display = @newTileState.display