From bc2e6742347c444f3e99cba025e57af269cfe734 Mon Sep 17 00:00:00 2001 From: Drew Noel Date: Fri, 26 Feb 2016 12:32:55 -0500 Subject: [PATCH 01/10] :arrow_up: Electron --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index be1bb2f51..98afe224f 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "url": "https://github.com/atom/atom/issues" }, "license": "MIT", - "electronVersion": "0.36.8", + "electronVersion": "0.36.9", "dependencies": { "async": "0.2.6", "atom-keymap": "6.3.2", From 81d0874fa5433c033ed276c02d7a3bcb2c7fed7e Mon Sep 17 00:00:00 2001 From: Drew Noel Date: Sat, 12 Mar 2016 23:57:24 -0500 Subject: [PATCH 02/10] :arrow_up: electron v0.36.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 98afe224f..89b79fc45 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "url": "https://github.com/atom/atom/issues" }, "license": "MIT", - "electronVersion": "0.36.9", + "electronVersion": "0.36.11", "dependencies": { "async": "0.2.6", "atom-keymap": "6.3.2", From fb5bfe1b3a30a0643cf020aa1daee7700d780fbc Mon Sep 17 00:00:00 2001 From: Drew Noel Date: Sun, 13 Mar 2016 13:25:27 -0400 Subject: [PATCH 03/10] Fix old electron require syntax in specs --- spec/atom-environment-spec.coffee | 2 +- spec/window-event-handler-spec.coffee | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/atom-environment-spec.coffee b/spec/atom-environment-spec.coffee index 5fd4b11f1..2d431cc26 100644 --- a/spec/atom-environment-spec.coffee +++ b/spec/atom-environment-spec.coffee @@ -365,7 +365,7 @@ describe "AtomEnvironment", -> updateAvailableHandler = jasmine.createSpy("update-available-handler") subscription = atom.onUpdateAvailable updateAvailableHandler - autoUpdater = require('remote').require('auto-updater') + autoUpdater = require('electron').remote.require('auto-updater') autoUpdater.emit 'update-downloaded', null, "notes", "version" waitsFor -> diff --git a/spec/window-event-handler-spec.coffee b/spec/window-event-handler-spec.coffee index bb7e1665b..22f43c90f 100644 --- a/spec/window-event-handler-spec.coffee +++ b/spec/window-event-handler-spec.coffee @@ -75,7 +75,7 @@ describe "WindowEventHandler", -> describe "when a link is clicked", -> it "opens the http/https links in an external application", -> - shell = require 'shell' + {shell} = require 'electron' spyOn(shell, 'openExternal') link = document.createElement('a') From 8694ea3c94225dda985e50c69804a916da76bd14 Mon Sep 17 00:00:00 2001 From: Wliu Date: Fri, 1 Apr 2016 22:21:39 -0400 Subject: [PATCH 04/10] Update require paths for deprecated Electron syntax --- src/module-cache.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/module-cache.coffee b/src/module-cache.coffee index a2840a864..c8e3b9105 100644 --- a/src/module-cache.coffee +++ b/src/module-cache.coffee @@ -202,12 +202,12 @@ registerBuiltins = (devMode) -> atomShellRoot = path.join(process.resourcesPath, 'atom.asar') - commonRoot = path.join(atomShellRoot, 'common', 'api', 'lib') + commonRoot = path.join(atomShellRoot, 'lib', 'common', 'api') commonBuiltins = ['callbacks-registry', 'clipboard', 'crash-reporter', 'screen', 'shell'] for builtin in commonBuiltins cache.builtins[builtin] = path.join(commonRoot, "#{builtin}.js") - rendererRoot = path.join(atomShellRoot, 'renderer', 'api', 'lib') + rendererRoot = path.join(atomShellRoot, 'lib', 'renderer', 'api') rendererBuiltins = ['ipc-renderer', 'remote'] for builtin in rendererBuiltins cache.builtins[builtin] = path.join(rendererRoot, "#{builtin}.js") From 37ea3c913f4acbc7af875bb7b64ec4e7aff93b94 Mon Sep 17 00:00:00 2001 From: Wliu <50Wliu@users.noreply.github.com> Date: Sat, 2 Apr 2016 10:21:52 -0400 Subject: [PATCH 05/10] :arrow_up: electron@0.36.12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 89b79fc45..e23ab4b54 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "url": "https://github.com/atom/atom/issues" }, "license": "MIT", - "electronVersion": "0.36.11", + "electronVersion": "0.36.12", "dependencies": { "async": "0.2.6", "atom-keymap": "6.3.2", From 2a9bc0fa1281bdb7027fdcfbff967ef47dcfd309 Mon Sep 17 00:00:00 2001 From: Wliu Date: Tue, 12 Apr 2016 17:08:01 -0400 Subject: [PATCH 06/10] Actually fix require paths --- src/module-cache.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/module-cache.coffee b/src/module-cache.coffee index c8e3b9105..a84251a93 100644 --- a/src/module-cache.coffee +++ b/src/module-cache.coffee @@ -202,12 +202,12 @@ registerBuiltins = (devMode) -> atomShellRoot = path.join(process.resourcesPath, 'atom.asar') - commonRoot = path.join(atomShellRoot, 'lib', 'common', 'api') + commonRoot = path.join(atomShellRoot, 'common', 'api') commonBuiltins = ['callbacks-registry', 'clipboard', 'crash-reporter', 'screen', 'shell'] for builtin in commonBuiltins cache.builtins[builtin] = path.join(commonRoot, "#{builtin}.js") - rendererRoot = path.join(atomShellRoot, 'lib', 'renderer', 'api') + rendererRoot = path.join(atomShellRoot, 'renderer', 'api') rendererBuiltins = ['ipc-renderer', 'remote'] for builtin in rendererBuiltins cache.builtins[builtin] = path.join(rendererRoot, "#{builtin}.js") From 09b88cd1d5bf6da90e572741788e344f8cbfd7e1 Mon Sep 17 00:00:00 2001 From: Wliu Date: Thu, 14 Apr 2016 14:11:25 +0000 Subject: [PATCH 07/10] Fix defective spec and associate 'screen' as a renderer module --- spec/module-cache-spec.coffee | 2 +- src/module-cache.coffee | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/module-cache-spec.coffee b/spec/module-cache-spec.coffee index 3a995aec7..e70257103 100644 --- a/spec/module-cache-spec.coffee +++ b/spec/module-cache-spec.coffee @@ -14,7 +14,7 @@ describe 'ModuleCache', -> for builtinName, builtinPath of builtins expect(require.resolve(builtinName)).toBe builtinPath - expect(fs.isFileSync(require.resolve(builtinName))) + expect(fs.isFileSync(require.resolve(builtinName))).toBeTruthy() expect(Module._findPath.callCount).toBe 0 diff --git a/src/module-cache.coffee b/src/module-cache.coffee index a84251a93..9a2961bf6 100644 --- a/src/module-cache.coffee +++ b/src/module-cache.coffee @@ -203,12 +203,12 @@ registerBuiltins = (devMode) -> atomShellRoot = path.join(process.resourcesPath, 'atom.asar') commonRoot = path.join(atomShellRoot, 'common', 'api') - commonBuiltins = ['callbacks-registry', 'clipboard', 'crash-reporter', 'screen', 'shell'] + commonBuiltins = ['callbacks-registry', 'clipboard', 'crash-reporter', 'shell'] for builtin in commonBuiltins cache.builtins[builtin] = path.join(commonRoot, "#{builtin}.js") rendererRoot = path.join(atomShellRoot, 'renderer', 'api') - rendererBuiltins = ['ipc-renderer', 'remote'] + rendererBuiltins = ['ipc-renderer', 'remote', 'screen'] for builtin in rendererBuiltins cache.builtins[builtin] = path.join(rendererRoot, "#{builtin}.js") From 58f029e92d9434f52bf2353b598c831962bb60b0 Mon Sep 17 00:00:00 2001 From: Wliu Date: Thu, 14 Apr 2016 14:19:09 +0000 Subject: [PATCH 08/10] :memo: --- spec/module-cache-spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/module-cache-spec.coffee b/spec/module-cache-spec.coffee index e70257103..4c0a549aa 100644 --- a/spec/module-cache-spec.coffee +++ b/spec/module-cache-spec.coffee @@ -8,7 +8,7 @@ describe 'ModuleCache', -> beforeEach -> spyOn(Module, '_findPath').andCallThrough() - it 'resolves atom shell module paths without hitting the filesystem', -> + it 'resolves Electron module paths without hitting the filesystem', -> builtins = ModuleCache.cache.builtins expect(Object.keys(builtins).length).toBeGreaterThan 0 From c5a76d4a7d9b7de9c78a534091a1b775bc5e9c9a Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 29 Apr 2016 14:41:34 +0200 Subject: [PATCH 09/10] Persist the entire state on reload This fixes an annoying problem that prevented the state of marker layers from being saved when the window was reloaded either via `Cmd+R` in DevTools or via `Ctrl+Option+Cmd+L` in Atom. The issue was that we were *always* scheduling `saveState` on an idle callback: `window.onbeforeunload`, however, doesn't wait for that event before closing the window, and thus that state was never saved in those situations. The solution is to use idle callbacks only during the critical code path (i.e. on mousedown and keydown), but save it synchronously otherwise. Saving something to IndexedDB is actually asynchronous too, but it seems like Chrome fulfills `put` requests that get executed right during `onbeforeunload`. --- spec/atom-environment-spec.coffee | 29 ++++++++++++++++++++++++----- src/atom-environment.coffee | 31 ++++++++++++++++--------------- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/spec/atom-environment-spec.coffee b/spec/atom-environment-spec.coffee index 846083b0e..a78190ab7 100644 --- a/spec/atom-environment-spec.coffee +++ b/spec/atom-environment-spec.coffee @@ -208,12 +208,15 @@ describe "AtomEnvironment", -> waitsForPromise -> atom.loadState().then (state) -> expect(state).toEqual(serializedState) - it "saves state on keydown, mousedown, and when the editor window unloads", -> + it "saves state when the CPU is idle after a keydown or mousedown event", -> spyOn(atom, 'saveState') + idleCallbacks = [] + spyOn(window, 'requestIdleCallback').andCallFake (callback) -> idleCallbacks.push(callback) keydown = new KeyboardEvent('keydown') atom.document.dispatchEvent(keydown) advanceClock atom.saveStateDebounceInterval + idleCallbacks.shift()() expect(atom.saveState).toHaveBeenCalledWith({isUnloading: false}) expect(atom.saveState).not.toHaveBeenCalledWith({isUnloading: true}) @@ -221,17 +224,33 @@ describe "AtomEnvironment", -> mousedown = new MouseEvent('mousedown') atom.document.dispatchEvent(mousedown) advanceClock atom.saveStateDebounceInterval + idleCallbacks.shift()() expect(atom.saveState).toHaveBeenCalledWith({isUnloading: false}) expect(atom.saveState).not.toHaveBeenCalledWith({isUnloading: true}) - atom.saveState.reset() + it "saves state immediately when unloading the editor window, ignoring pending and successive mousedown/keydown events", -> + spyOn(atom, 'saveState') + idleCallbacks = [] + spyOn(window, 'requestIdleCallback').andCallFake (callback) -> idleCallbacks.push(callback) + + mousedown = new MouseEvent('mousedown') + atom.document.dispatchEvent(mousedown) atom.unloadEditorWindow() - mousedown = new MouseEvent('mousedown') - atom.document.dispatchEvent(mousedown) - advanceClock atom.saveStateDebounceInterval expect(atom.saveState).toHaveBeenCalledWith({isUnloading: true}) expect(atom.saveState).not.toHaveBeenCalledWith({isUnloading: false}) + atom.saveState.reset() + advanceClock atom.saveStateDebounceInterval + idleCallbacks.shift()() + expect(atom.saveState).not.toHaveBeenCalled() + + atom.saveState.reset() + mousedown = new MouseEvent('mousedown') + atom.document.dispatchEvent(mousedown) + advanceClock atom.saveStateDebounceInterval + idleCallbacks.shift()() + expect(atom.saveState).not.toHaveBeenCalled() + it "serializes the project state with all the options supplied in saveState", -> spyOn(atom.project, 'serialize').andReturn({foo: 42}) diff --git a/src/atom-environment.coffee b/src/atom-environment.coffee index f50ae9d5b..da3e989f2 100644 --- a/src/atom-environment.coffee +++ b/src/atom-environment.coffee @@ -234,13 +234,14 @@ class AtomEnvironment extends Model checkPortableHomeWritable() attachSaveStateListeners: -> - saveState = => @saveState({isUnloading: false}) unless @unloaded - debouncedSaveState = _.debounce(saveState, @saveStateDebounceInterval) - @document.addEventListener('mousedown', debouncedSaveState, true) - @document.addEventListener('keydown', debouncedSaveState, true) + saveState = _.debounce((=> + window.requestIdleCallback => @saveState({isUnloading: false}) unless @unloaded + ), @saveStateDebounceInterval) + @document.addEventListener('mousedown', saveState, true) + @document.addEventListener('keydown', saveState, true) @disposables.add new Disposable => - @document.removeEventListener('mousedown', debouncedSaveState, true) - @document.removeEventListener('keydown', debouncedSaveState, true) + @document.removeEventListener('mousedown', saveState, true) + @document.removeEventListener('keydown', saveState, true) setConfigSchema: -> @config.setSchema null, {type: 'object', properties: _.clone(require('./config-schema'))} @@ -655,6 +656,7 @@ class AtomEnvironment extends Model # Call this method when establishing a real application window. startEditorWindow: -> + @unloaded = false @loadState().then (state) => @windowDimensions = state?.windowDimensions @displayWindow().then => @@ -842,16 +844,15 @@ class AtomEnvironment extends Model return Promise.resolve() unless @enablePersistence new Promise (resolve, reject) => - window.requestIdleCallback => - return if not @project + return if not @project - state = @serialize(options) - savePromise = - if storageKey = @getStateKey(@project?.getPaths()) - @stateStore.save(storageKey, state) - else - @applicationDelegate.setTemporaryWindowState(state) - savePromise.catch(reject).then(resolve) + state = @serialize(options) + savePromise = + if storageKey = @getStateKey(@project?.getPaths()) + @stateStore.save(storageKey, state) + else + @applicationDelegate.setTemporaryWindowState(state) + savePromise.catch(reject).then(resolve) loadState: -> if @enablePersistence From 539fc4090bbdb1269dfdd56633d8ba7b4365975b Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 30 Apr 2016 01:34:49 +0200 Subject: [PATCH 10/10] :arrow_up: bookmarks --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8aad494e4..8142a3e5f 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "autoflow": "0.27.0", "autosave": "0.23.1", "background-tips": "0.26.0", - "bookmarks": "0.39.0", + "bookmarks": "0.41.0", "bracket-matcher": "0.82.0", "command-palette": "0.38.0", "deprecation-cop": "0.54.1",