diff --git a/atom/browser/browser.h b/atom/browser/browser.h index f01ece367b52..0f16c67ba8b9 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -171,7 +171,7 @@ class Browser : public WindowListObserver { // Hide/Show dock. void DockHide(); - void DockShow(); + v8::Local DockShow(v8::Isolate* isolate); bool DockIsVisible(); // Set docks' menu. diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index 2d64a9b52585..b6ef1213187d 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -11,6 +11,7 @@ #include "atom/browser/window_list.h" #include "atom/common/application_info.h" #include "atom/common/platform_util.h" +#include "atom/common/promise_util.h" #include "base/mac/bundle_locations.h" #include "base/mac/foundation_util.h" #include "base/mac/mac_util.h" @@ -338,7 +339,8 @@ bool Browser::DockIsVisible() { NSApplicationActivationPolicyRegular); } -void Browser::DockShow() { +v8::Local Browser::DockShow(v8::Isolate* isolate) { + scoped_refptr promise = new util::Promise(isolate); BOOL active = [[NSRunningApplication currentApplication] isActive]; ProcessSerialNumber psn = {0, kCurrentProcess}; if (active) { @@ -357,11 +359,14 @@ void Browser::DockShow() { dispatch_after(one_ms, dispatch_get_main_queue(), ^{ [[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps]; + promise->Resolve(); }); }); } else { TransformProcessType(&psn, kProcessTransformToForegroundApplication); + promise->Resolve(); } + return promise->GetHandle(); } void Browser::DockSetMenu(AtomMenuModel* model) { diff --git a/docs/api/app.md b/docs/api/app.md index 6adab2642475..b30a9efb93bc 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -1295,13 +1295,11 @@ Hides the dock icon. ### `app.dock.show()` _macOS_ -Shows the dock icon. +Returns `Promise` - Resolves when the dock icon is shown. ### `app.dock.isVisible()` _macOS_ Returns `Boolean` - Whether the dock icon is visible. -The `app.dock.show()` call is asynchronous so this method might not -return true immediately after that call. ### `app.dock.setMenu(menu)` _macOS_ diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index c27f35c3a632..bdc0688d482a 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -1110,17 +1110,29 @@ describe('app module', () => { }) }) - describe('dock.setMenu', () => { - before(function () { - if (process.platform !== 'darwin') { - this.skip() - } + describe('dock APIs', () => { + describe('dock.setMenu()', () => { + it('keeps references to the menu', function () { + if (process.platform !== 'darwin') this.skip() + + app.dock.setMenu(new Menu()) + const v8Util = process.atomBinding('v8_util') + v8Util.requestGarbageCollectionForTesting() + }) }) - it('keeps references to the menu', () => { - app.dock.setMenu(new Menu()) - const v8Util = process.atomBinding('v8_util') - v8Util.requestGarbageCollectionForTesting() + describe('dock.show()', () => { + before(function () { + if (process.platform !== 'darwin') this.skip() + }) + + it('returns a Promise', () => { + expect(app.dock.show()).to.be.a('promise') + }) + + it('eventually fulfills', () => { + expect(app.dock.show()).to.be.eventually.fulfilled() + }) }) }) @@ -1131,7 +1143,7 @@ describe('app module', () => { it('becomes fulfilled if the app is already ready', () => { expect(app.isReady()).to.be.true() - return expect(app.whenReady()).to.be.eventually.fulfilled + expect(app.whenReady()).to.be.eventually.fulfilled() }) })