diff --git a/package.json b/package.json index 8ad12571e..0ffc69221 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "line-ending-selector": "0.3.0", "link": "0.31.0", "markdown-preview": "0.156.2", - "metrics": "0.53.0", + "metrics": "0.53.1", "notifications": "0.62.1", "open-on-github": "0.40.0", "package-generator": "0.41.0", diff --git a/spec/atom-environment-spec.coffee b/spec/atom-environment-spec.coffee index 3e6536681..fd43a9616 100644 --- a/spec/atom-environment-spec.coffee +++ b/spec/atom-environment-spec.coffee @@ -45,9 +45,11 @@ describe "AtomEnvironment", -> expect(atom.config.get('editor.showInvisibles')).toBe false describe "window onerror handler", -> + devToolsPromise = null beforeEach -> - spyOn atom, 'openDevTools' - spyOn atom, 'executeJavaScriptInDevTools' + devToolsPromise = Promise.resolve() + spyOn(atom, 'openDevTools').andReturn(devToolsPromise) + spyOn(atom, 'executeJavaScriptInDevTools') it "will open the dev tools when an error is triggered", -> try @@ -55,8 +57,10 @@ describe "AtomEnvironment", -> catch e window.onerror.call(window, e.toString(), 'abc', 2, 3, e) - expect(atom.openDevTools).toHaveBeenCalled() - expect(atom.executeJavaScriptInDevTools).toHaveBeenCalled() + waitsForPromise -> devToolsPromise + runs -> + expect(atom.openDevTools).toHaveBeenCalled() + expect(atom.executeJavaScriptInDevTools).toHaveBeenCalled() describe "::onWillThrowError", -> willThrowSpy = null diff --git a/src/application-delegate.coffee b/src/application-delegate.coffee index 1e05b3dbb..d6937f2d3 100644 --- a/src/application-delegate.coffee +++ b/src/application-delegate.coffee @@ -66,13 +66,42 @@ class ApplicationDelegate ipc.send("call-window-method", "setFullScreen", fullScreen) openWindowDevTools: -> - remote.getCurrentWindow().openDevTools() + new Promise (resolve) -> + # Defer DevTools interaction to the next tick, because using them during + # event handling causes some wrong input events to be triggered on + # `TextEditorComponent` (Ref.: https://github.com/atom/atom/issues/9697). + process.nextTick -> + if remote.getCurrentWindow().isDevToolsOpened() + resolve() + else + remote.getCurrentWindow().once("devtools-opened", -> resolve()) + ipc.send("call-window-method", "openDevTools") + + closeWindowDevTools: -> + new Promise (resolve) -> + # Defer DevTools interaction to the next tick, because using them during + # event handling causes some wrong input events to be triggered on + # `TextEditorComponent` (Ref.: https://github.com/atom/atom/issues/9697). + process.nextTick -> + unless remote.getCurrentWindow().isDevToolsOpened() + resolve() + else + remote.getCurrentWindow().once("devtools-closed", -> resolve()) + ipc.send("call-window-method", "closeDevTools") toggleWindowDevTools: -> - remote.getCurrentWindow().toggleDevTools() + new Promise (resolve) => + # Defer DevTools interaction to the next tick, because using them during + # event handling causes some wrong input events to be triggered on + # `TextEditorComponent` (Ref.: https://github.com/atom/atom/issues/9697). + process.nextTick => + if remote.getCurrentWindow().isDevToolsOpened() + @closeWindowDevTools().then(resolve) + else + @openWindowDevTools().then(resolve) executeJavaScriptInWindowDevTools: (code) -> - remote.getCurrentWindow().executeJavaScriptInDevTools(code) + ipc.send("call-window-method", "executeJavaScriptInDevTools", code) setWindowDocumentEdited: (edited) -> ipc.send("call-window-method", "setDocumentEdited", edited) diff --git a/src/atom-environment.coffee b/src/atom-environment.coffee index ac76daf04..125d0310e 100644 --- a/src/atom-environment.coffee +++ b/src/atom-environment.coffee @@ -670,8 +670,7 @@ class AtomEnvironment extends Model @emitter.emit 'will-throw-error', eventObject if openDevTools - @openDevTools() - @executeJavaScriptInDevTools('DevToolsAPI.showConsole()') + @openDevTools().then => @executeJavaScriptInDevTools('DevToolsAPI.showConsole()') @emitter.emit 'did-throw-error', {message, url, line, column, originalError} @@ -721,10 +720,15 @@ class AtomEnvironment extends Model ### # Extended: Open the dev tools for the current window. + # + # Returns a {Promise} that resolves when the DevTools have been opened. openDevTools: -> @applicationDelegate.openWindowDevTools() # Extended: Toggle the visibility of the dev tools for the current window. + # + # Returns a {Promise} that resolves when the DevTools have been opened or + # closed. toggleDevTools: -> @applicationDelegate.toggleWindowDevTools()