mirror of
https://github.com/atom/atom.git
synced 2026-04-28 03:01:47 -04:00
Buffer emits a contents-modified event when it's contents differ from disk.
Including when the Buffer's file is removed via another process.
This commit is contained in:
@@ -744,22 +744,58 @@ describe 'Buffer', ->
|
||||
buffer.setText('\n')
|
||||
expect(buffer.isEmpty()).toBeFalsy()
|
||||
|
||||
describe "stopped-changing event", ->
|
||||
it "fires 'stoppedChangingDelay' ms after the last buffer change", ->
|
||||
delay = buffer.stoppedChangingDelay
|
||||
stoppedChangingHandler = jasmine.createSpy("stoppedChangingHandler")
|
||||
buffer.on 'stopped-changing', stoppedChangingHandler
|
||||
describe "'contents-modified' event", ->
|
||||
describe "when the buffer is deleted", ->
|
||||
it "triggers the contents-modified event", ->
|
||||
delay = buffer.stoppedChangingDelay
|
||||
path = "/tmp/atom-file-to-delete.txt"
|
||||
fs.write(path, 'delete me')
|
||||
bufferToDelete = new Buffer(path)
|
||||
contentsModifiedHandler = jasmine.createSpy("contentsModifiedHandler")
|
||||
bufferToDelete.on 'contents-modified', contentsModifiedHandler
|
||||
|
||||
buffer.insert([0, 0], 'a')
|
||||
expect(stoppedChangingHandler).not.toHaveBeenCalled()
|
||||
expect(bufferToDelete.getPath()).toBe path
|
||||
expect(bufferToDelete.isModified()).toBeFalsy()
|
||||
expect(contentsModifiedHandler).not.toHaveBeenCalled()
|
||||
|
||||
advanceClock(delay / 2)
|
||||
fs.remove(path)
|
||||
waitsFor "file to be removed", (done) ->
|
||||
bufferToDelete.file.one 'remove', done
|
||||
|
||||
buffer.insert([0, 0], 'b')
|
||||
expect(stoppedChangingHandler).not.toHaveBeenCalled()
|
||||
runs ->
|
||||
expect(contentsModifiedHandler).toHaveBeenCalledWith(differsFromDisk:true)
|
||||
bufferToDelete.destroy()
|
||||
|
||||
advanceClock(delay / 2)
|
||||
expect(stoppedChangingHandler).not.toHaveBeenCalled()
|
||||
|
||||
advanceClock(delay / 2)
|
||||
expect(stoppedChangingHandler).toHaveBeenCalled()
|
||||
describe "when the buffer text has been changed", ->
|
||||
it "triggers the contents-modified event 'stoppedChangingDelay' ms after the last buffer change", ->
|
||||
delay = buffer.stoppedChangingDelay
|
||||
contentsModifiedHandler = jasmine.createSpy("contentsModifiedHandler")
|
||||
buffer.on 'contents-modified', contentsModifiedHandler
|
||||
|
||||
buffer.insert([0, 0], 'a')
|
||||
expect(contentsModifiedHandler).not.toHaveBeenCalled()
|
||||
|
||||
advanceClock(delay / 2)
|
||||
|
||||
buffer.insert([0, 0], 'b')
|
||||
expect(contentsModifiedHandler).not.toHaveBeenCalled()
|
||||
|
||||
advanceClock(delay / 2)
|
||||
expect(contentsModifiedHandler).not.toHaveBeenCalled()
|
||||
|
||||
advanceClock(delay / 2)
|
||||
expect(contentsModifiedHandler).toHaveBeenCalled()
|
||||
|
||||
it "triggers the contents-modified event with data about whether its contents differ from the contents on disk", ->
|
||||
delay = buffer.stoppedChangingDelay
|
||||
contentsModifiedHandler = jasmine.createSpy("contentsModifiedHandler")
|
||||
buffer.on 'contents-modified', contentsModifiedHandler
|
||||
|
||||
buffer.insert([0, 0], 'a')
|
||||
advanceClock(delay)
|
||||
expect(contentsModifiedHandler).toHaveBeenCalledWith(differsFromDisk:true)
|
||||
|
||||
buffer.delete([[0, 0], [0, 1]], '')
|
||||
advanceClock(delay)
|
||||
expect(contentsModifiedHandler).toHaveBeenCalledWith(differsFromDisk:false)
|
||||
|
||||
@@ -67,6 +67,7 @@ class Buffer
|
||||
|
||||
@file.on "remove", =>
|
||||
@updateCachedDiskContents()
|
||||
@trigger "contents-modified", {differsFromDisk: true}
|
||||
|
||||
@file.on "move", =>
|
||||
@trigger "path-change", this
|
||||
@@ -384,7 +385,7 @@ class Buffer
|
||||
clearTimeout(@stoppedChangingTimeout) if @stoppedChangingTimeout
|
||||
stoppedChangingCallback = =>
|
||||
@stoppedChangingTimeout = null
|
||||
@trigger 'stopped-changing'
|
||||
@trigger 'contents-modified', {differsFromDisk: @isModified()}
|
||||
@stoppedChangingTimeout = setTimeout(stoppedChangingCallback, @stoppedChangingDelay)
|
||||
|
||||
fileExists: ->
|
||||
|
||||
@@ -42,18 +42,18 @@ class StatusBar extends View
|
||||
subscribeToBuffer: ->
|
||||
@buffer?.off '.status-bar'
|
||||
@buffer = @editor.getBuffer()
|
||||
@buffer.on 'stopped-changing.status-bar', => @updateBufferModifiedText()
|
||||
@buffer.on 'contents-modified.status-bar', (e) => @updateBufferHasModifiedText(e.differsFromDisk)
|
||||
@buffer.on 'after-save.status-bar', => @updateStatusBar()
|
||||
@buffer.on 'git-status-change.status-bar', => @updateStatusBar()
|
||||
@updateStatusBar()
|
||||
|
||||
updateStatusBar: ->
|
||||
@updateBranchText()
|
||||
@updateBufferModifiedText()
|
||||
@updateBufferHasModifiedText(@buffer.isModified())
|
||||
@updateStatusText()
|
||||
|
||||
updateBufferModifiedText: ->
|
||||
if @buffer.isModified()
|
||||
updateBufferHasModifiedText: (differsFromDisk)->
|
||||
if differsFromDisk
|
||||
@bufferModified.text('*') unless @isModified
|
||||
@isModified = true
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user