From 3150785db227bfb507b7ef20b2c615a07a5f1d91 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 2 Apr 2013 15:05:26 -0600 Subject: [PATCH] Ensure we never deserialize two instances of the same buffer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We might have two edit sessions pointing to the same buffer, for example if we have a split pane… So when we deserialize a buffer, we always need to check that we don't already have an instance of that buffer on the project. If we do, then we've already deserialized it once so we don't need to worry about the saved text. We still have a problem when deserializing previously unsaved buffers, because we can't use the path to identify them. --- spec/app/text-buffer-spec.coffee | 6 ++++++ src/app/project.coffee | 12 +++++------- src/app/text-buffer.coffee | 7 ++----- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/spec/app/text-buffer-spec.coffee b/spec/app/text-buffer-spec.coffee index 7a23e9326..cb5395933 100644 --- a/spec/app/text-buffer-spec.coffee +++ b/spec/app/text-buffer-spec.coffee @@ -1265,3 +1265,9 @@ describe 'Buffer', -> expect(serializedState.path).toBeUndefined() expect(buffer.getPath()).toBeUndefined() expect(buffer.getText()).toBe("abc") + + it "never deserializes two separate instances of the same buffer", -> + serializedState = buffer.serialize() + buffer.release() + buffer = Buffer.deserialize(serializedState) + expect(Buffer.deserialize(serializedState)).toBe buffer diff --git a/src/app/project.coffee b/src/app/project.coffee index 2e4d718ac..81bf19c76 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -127,19 +127,17 @@ class Project else @on 'buffer-created', (buffer) -> callback(buffer) - bufferForPath: (filePath) -> + bufferForPath: (filePath, text) -> if filePath? filePath = @resolve(filePath) if filePath buffer = _.find @buffers, (buffer) -> buffer.getPath() == filePath - buffer or @buildBuffer(filePath) - else - + buffer or @buildBuffer(filePath, text) else - @buildBuffer() + @buildBuffer(null, text) - buildBuffer: (filePath) -> - buffer = new Buffer(filePath) + buildBuffer: (filePath, text) -> + buffer = new Buffer(filePath, text) @buffers.push buffer @trigger 'buffer-created', buffer buffer diff --git a/src/app/text-buffer.coffee b/src/app/text-buffer.coffee index ab49c47e1..3ebfda88e 100644 --- a/src/app/text-buffer.coffee +++ b/src/app/text-buffer.coffee @@ -25,11 +25,8 @@ class Buffer invalidMarkers: null refcount: 0 - @deserialize: (state) -> - if state && (state.path? || state.text?) - new Buffer(state.path, state.text) - else - new Buffer(null) + @deserialize: ({path, text}) -> + project.bufferForPath(path, text) constructor: (path, initialText) -> @id = @constructor.idCounter++