diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index c02f334c6..d460aa5b9 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -532,6 +532,13 @@ describe "DisplayBuffer", -> buffer.delete([[6, 0], [6, 65]]) expect(displayBuffer.getMaxLineLength()).toBe 62 + describe ".destroy()", -> + it "unsubscribes all display buffer markers from their underlying buffer marker (regression)", -> + marker = displayBuffer.markBufferPosition([12, 2]) + displayBuffer.destroy() + expect(marker.bufferMarker.subscriptionCount()).toBe 0 + expect( -> buffer.insert([12, 2], '\n')).not.toThrow() + describe "markers", -> beforeEach -> displayBuffer.createFold(4, 7) diff --git a/src/app/display-buffer-marker.coffee b/src/app/display-buffer-marker.coffee index 02b8996f5..4fd3f9689 100644 --- a/src/app/display-buffer-marker.coffee +++ b/src/app/display-buffer-marker.coffee @@ -1,6 +1,7 @@ Range = require 'range' _ = require 'underscore' EventEmitter = require 'event-emitter' +Subscriber = require 'subscriber' module.exports = class DisplayBufferMarker @@ -131,6 +132,7 @@ class DisplayBufferMarker # Destroys the marker destroy: -> @bufferMarker.destroy() + @unsubscribe() # Returns a {String} representation of the marker inspect: -> @@ -143,11 +145,11 @@ class DisplayBufferMarker @trigger 'destroyed' observeBufferMarker: -> - @bufferMarker.on 'destroyed', => @destroyed() + @subscribe @bufferMarker, 'destroyed', => @destroyed() @getHeadScreenPosition() # memoize current value @getTailScreenPosition() # memoize current value - @bufferMarker.on 'changed', ({oldHeadPosition, newHeadPosition, oldTailPosition, newTailPosition, bufferChanged, valid}) => + @subscribe @bufferMarker, 'changed', ({oldHeadPosition, newHeadPosition, oldTailPosition, newTailPosition, bufferChanged, valid}) => @notifyObservers oldHeadBufferPosition: oldHeadPosition newHeadBufferPosition: newHeadPosition @@ -192,3 +194,4 @@ class DisplayBufferMarker } _.extend DisplayBufferMarker.prototype, EventEmitter +_.extend DisplayBufferMarker.prototype, Subscriber diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index 9d2fae945..0a1d98da1 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -393,9 +393,12 @@ class DisplayBuffer # # Returns the {DisplayBufferMarker} (if it exists). getMarker: (id) -> - @markers[id] ?= do => + marker = @markers[id] + unless marker? if bufferMarker = @buffer.getMarker(id) - new DisplayBufferMarker({bufferMarker, displayBuffer: this}) + marker = new DisplayBufferMarker({bufferMarker, displayBuffer: this}) + @markers[id] = marker + marker # Retrieves the active markers in the buffer. # @@ -492,6 +495,7 @@ class DisplayBuffer marker.notifyObservers(bufferChanged: false) destroy: -> + marker.unsubscribe() for marker in @getMarkers() @tokenizedBuffer.destroy() @unsubscribe()