mirror of
https://github.com/atom/atom.git
synced 2026-01-22 21:38:10 -05:00
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:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user