From 9655d8184e3e6beb5c556a02741443e0f1790e50 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 24 Nov 2015 11:43:09 +0100 Subject: [PATCH 1/7] Interact with DevTools asynchronously --- src/application-delegate.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/application-delegate.coffee b/src/application-delegate.coffee index 1e05b3dbb..e76183957 100644 --- a/src/application-delegate.coffee +++ b/src/application-delegate.coffee @@ -66,13 +66,13 @@ class ApplicationDelegate ipc.send("call-window-method", "setFullScreen", fullScreen) openWindowDevTools: -> - remote.getCurrentWindow().openDevTools() + ipc.send("call-window-method", "openDevTools") toggleWindowDevTools: -> - remote.getCurrentWindow().toggleDevTools() + ipc.send("call-window-method", "toggleDevTools") executeJavaScriptInWindowDevTools: (code) -> - remote.getCurrentWindow().executeJavaScriptInDevTools(code) + ipc.send("call-window-method", "executeJavaScriptInDevTools", code) setWindowDocumentEdited: (edited) -> ipc.send("call-window-method", "setDocumentEdited", edited) From 9e931b15c31969070396bb50ef156023acb0577b Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 24 Nov 2015 12:21:16 +0100 Subject: [PATCH 2/7] Switch to a Promise-based version of DevTools interaction --- src/application-delegate.coffee | 20 ++++++++++++++++++-- src/atom-environment.coffee | 8 ++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/application-delegate.coffee b/src/application-delegate.coffee index e76183957..04fa5d2a9 100644 --- a/src/application-delegate.coffee +++ b/src/application-delegate.coffee @@ -66,10 +66,26 @@ class ApplicationDelegate ipc.send("call-window-method", "setFullScreen", fullScreen) openWindowDevTools: -> - ipc.send("call-window-method", "openDevTools") + if remote.getCurrentWindow().isDevToolsOpened() + Promise.resolve() + else + new Promise (resolve) -> + remote.getCurrentWindow().once("devtools-opened", -> resolve()) + ipc.send("call-window-method", "openDevTools") + + closeWindowDevTools: -> + unless remote.getCurrentWindow().isDevToolsOpened() + Promise.resolve() + else + new Promise (resolve) -> + remote.getCurrentWindow().once("devtools-closed", -> resolve()) + ipc.send("call-window-method", "closeDevTools") toggleWindowDevTools: -> - ipc.send("call-window-method", "toggleDevTools") + if remote.getCurrentWindow().isDevToolsOpened() + @closeWindowDevTools() + else + @openWindowDevTools() executeJavaScriptInWindowDevTools: (code) -> ipc.send("call-window-method", "executeJavaScriptInDevTools", code) 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() From 93767389189c9d3be08ee7451bd9a44610345b06 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 24 Nov 2015 12:28:31 +0100 Subject: [PATCH 3/7] Make spec async because of Promise-based API --- spec/atom-environment-spec.coffee | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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 From 6b5ef9a0aa98bd52b01144981ea1cb971ddb001e Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 24 Nov 2015 12:43:30 +0100 Subject: [PATCH 4/7] :fire: --- src/application-delegate.coffee | 13 +------------ src/atom-environment.coffee | 3 --- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/application-delegate.coffee b/src/application-delegate.coffee index 04fa5d2a9..ee3c636da 100644 --- a/src/application-delegate.coffee +++ b/src/application-delegate.coffee @@ -73,19 +73,8 @@ class ApplicationDelegate remote.getCurrentWindow().once("devtools-opened", -> resolve()) ipc.send("call-window-method", "openDevTools") - closeWindowDevTools: -> - unless remote.getCurrentWindow().isDevToolsOpened() - Promise.resolve() - else - new Promise (resolve) -> - remote.getCurrentWindow().once("devtools-closed", -> resolve()) - ipc.send("call-window-method", "closeDevTools") - toggleWindowDevTools: -> - if remote.getCurrentWindow().isDevToolsOpened() - @closeWindowDevTools() - else - @openWindowDevTools() + ipc.send("call-window-method", "toggleDevTools") executeJavaScriptInWindowDevTools: (code) -> ipc.send("call-window-method", "executeJavaScriptInDevTools", code) diff --git a/src/atom-environment.coffee b/src/atom-environment.coffee index 125d0310e..c14e95420 100644 --- a/src/atom-environment.coffee +++ b/src/atom-environment.coffee @@ -726,9 +726,6 @@ class AtomEnvironment extends Model @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() From b3738cfc3434e06f246868ef1f324dcbdf3e14d6 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 24 Nov 2015 12:47:45 +0100 Subject: [PATCH 5/7] Interact with DevTools on process.nextTick Using any of the DevTools synchronous methods causes the bad character input issue. --- src/application-delegate.coffee | 29 ++++++++++++++++++++++------- src/atom-environment.coffee | 3 +++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/application-delegate.coffee b/src/application-delegate.coffee index ee3c636da..52e08e648 100644 --- a/src/application-delegate.coffee +++ b/src/application-delegate.coffee @@ -66,15 +66,30 @@ class ApplicationDelegate ipc.send("call-window-method", "setFullScreen", fullScreen) openWindowDevTools: -> - if remote.getCurrentWindow().isDevToolsOpened() - Promise.resolve() - else - new Promise (resolve) -> - remote.getCurrentWindow().once("devtools-opened", -> resolve()) - ipc.send("call-window-method", "openDevTools") + new Promise (resolve) -> + process.nextTick -> + if remote.getCurrentWindow().isDevToolsOpened() + resolve() + else + remote.getCurrentWindow().once("devtools-opened", -> resolve()) + ipc.send("call-window-method", "openDevTools") + + closeWindowDevTools: -> + new Promise (resolve) -> + process.nextTick -> + unless remote.getCurrentWindow().isDevToolsOpened() + resolve() + else + remote.getCurrentWindow().once("devtools-closed", -> resolve()) + ipc.send("call-window-method", "closeDevTools") toggleWindowDevTools: -> - ipc.send("call-window-method", "toggleDevTools") + new Promise (resolve) => + process.nextTick => + if remote.getCurrentWindow().isDevToolsOpened() + @closeWindowDevTools().then(resolve) + else + @openWindowDevTools().then(resolve) executeJavaScriptInWindowDevTools: (code) -> ipc.send("call-window-method", "executeJavaScriptInDevTools", code) diff --git a/src/atom-environment.coffee b/src/atom-environment.coffee index c14e95420..125d0310e 100644 --- a/src/atom-environment.coffee +++ b/src/atom-environment.coffee @@ -726,6 +726,9 @@ class AtomEnvironment extends Model @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() From 972d483dc2d76fdc6c9d49204fda1eb29db1ce63 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 24 Nov 2015 13:53:36 +0100 Subject: [PATCH 6/7] :arrow_up: metrics --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 62a02b011..2399aef75 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", From 7bd62790d2ea80ad9d06c67717fdc0da896fadad Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 24 Nov 2015 14:02:34 +0100 Subject: [PATCH 7/7] :memo: --- src/application-delegate.coffee | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/application-delegate.coffee b/src/application-delegate.coffee index 52e08e648..d6937f2d3 100644 --- a/src/application-delegate.coffee +++ b/src/application-delegate.coffee @@ -67,6 +67,9 @@ class ApplicationDelegate openWindowDevTools: -> 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() @@ -76,6 +79,9 @@ class ApplicationDelegate 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() @@ -85,6 +91,9 @@ class ApplicationDelegate toggleWindowDevTools: -> 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)