From 1764677b7d039fbcbd9febef550703b2b9a1c04c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 19 Jun 2013 09:53:41 -0700 Subject: [PATCH] Unsubscribe markers when destroying display buffer Previously the display buffer markers would still fire events even after a display buffer was destroyed since they were not being unsubscribed from their underlying buffer marker which could still fire events in the case of an editor split on the same buffer. Closes #593 --- spec/app/display-buffer-spec.coffee | 7 +++++++ src/app/display-buffer-marker.coffee | 7 +++++-- src/app/display-buffer.coffee | 8 ++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) 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()