From 303ca1084638c4236bb6b7b5cd1817ff25934b86 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 5 Feb 2020 19:12:25 +0000 Subject: [PATCH] feat: allow macOS apps to set activation policies (#21983) --- docs/api/app.md | 11 +++++++++++ shell/browser/api/electron_api_app.cc | 1 + shell/browser/api/electron_api_app.h | 2 ++ shell/browser/api/electron_api_app_mac.mm | 20 ++++++++++++++++++++ spec-main/api-app-spec.ts | 8 ++++++++ 5 files changed, 42 insertions(+) diff --git a/docs/api/app.md b/docs/api/app.md index 7c701add7a45..3dcceafcc360 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -994,6 +994,17 @@ Updates the current activity if its type matches `type`, merging the entries fro Changes the [Application User Model ID][app-user-model-id] to `id`. +### `app.setActivationPolicy(policy)` _macOS_ + +* `policy` String - Can be 'regular', 'accessory', or 'prohibited'. + +Sets the activation policy for a given app. + +Activation policy types: +* 'regular' - The application is an ordinary app that appears in the Dock and may have a user interface. +* 'accessory' - The application doesn’t appear in the Dock and doesn’t have a menu bar, but it may be activated programmatically or by clicking on one of its windows. +* 'prohibited' - The application doesn’t appear in the Dock and may not create windows or be activated. + ### `app.importCertificate(options, callback)` _Linux_ * `options` Object diff --git a/shell/browser/api/electron_api_app.cc b/shell/browser/api/electron_api_app.cc index 1a1e49b6d9fa..f915a7329c52 100644 --- a/shell/browser/api/electron_api_app.cc +++ b/shell/browser/api/electron_api_app.cc @@ -1459,6 +1459,7 @@ void App::BuildPrototype(v8::Isolate* isolate, base::BindRepeating(&Browser::UpdateCurrentActivity, browser)) .SetMethod("moveToApplicationsFolder", &App::MoveToApplicationsFolder) .SetMethod("isInApplicationsFolder", &App::IsInApplicationsFolder) + .SetMethod("setActivationPolicy", &App::SetActivationPolicy) #endif .SetMethod("setAboutPanelOptions", base::BindRepeating(&Browser::SetAboutPanelOptions, browser)) diff --git a/shell/browser/api/electron_api_app.h b/shell/browser/api/electron_api_app.h index 44bf2f8fb229..436d47f81739 100644 --- a/shell/browser/api/electron_api_app.h +++ b/shell/browser/api/electron_api_app.h @@ -201,6 +201,8 @@ class App : public ElectronBrowserClient::Delegate, bool CanBrowserClientUseCustomSiteInstance(); #if defined(OS_MACOSX) + void SetActivationPolicy(gin_helper::ErrorThrower thrower, + const std::string& policy); bool MoveToApplicationsFolder(gin_helper::ErrorThrower, gin::Arguments* args); bool IsInApplicationsFolder(); v8::Local GetDockAPI(v8::Isolate* isolate); diff --git a/shell/browser/api/electron_api_app_mac.mm b/shell/browser/api/electron_api_app_mac.mm index f8595513cf9b..2678153acd98 100644 --- a/shell/browser/api/electron_api_app_mac.mm +++ b/shell/browser/api/electron_api_app_mac.mm @@ -2,6 +2,8 @@ // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. +#include + #include "base/path_service.h" #include "shell/browser/api/electron_api_app.h" #include "shell/browser/electron_paths.h" @@ -32,6 +34,24 @@ void App::SetAppLogsPath(gin_helper::ErrorThrower thrower, } } +void App::SetActivationPolicy(gin_helper::ErrorThrower thrower, + const std::string& policy) { + NSApplicationActivationPolicy activation_policy; + if (policy == "accessory") { + activation_policy = NSApplicationActivationPolicyAccessory; + } else if (policy == "prohibited") { + activation_policy = NSApplicationActivationPolicyProhibited; + } else if (policy == "regular") { + activation_policy = NSApplicationActivationPolicyRegular; + } else { + thrower.ThrowError("Invalid activation policy: must be one of 'regular', " + "'accessory', or 'prohibited'"); + return; + } + + [NSApp setActivationPolicy:activation_policy]; +} + } // namespace api } // namespace electron diff --git a/spec-main/api-app-spec.ts b/spec-main/api-app-spec.ts index 68ad3b059c82..ea9b07fe203d 100644 --- a/spec-main/api-app-spec.ts +++ b/spec-main/api-app-spec.ts @@ -202,6 +202,14 @@ describe('app module', () => { }) }) + ifdescribe(process.platform === 'darwin')('app.setActivationPolicy', () => { + it('throws an error on invalid application policies', () => { + expect(() => { + app.setActivationPolicy('terrible' as any) + }).to.throw(/Invalid activation policy: must be one of 'regular', 'accessory', or 'prohibited'/) + }) + }) + describe('app.requestSingleInstanceLock', () => { it('prevents the second launch of app', function (done) { this.timeout(120000)