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
This commit is contained in:
Kevin Sawicki
2013-06-19 09:53:41 -07:00
parent 264ddbe183
commit 1764677b7d
3 changed files with 18 additions and 4 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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()