From c1003007641bb5cb2438e47a5da5ef71f5b47357 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 16:29:09 -0700 Subject: [PATCH] Update API to get/setLoginItemSettings --- atom/browser/api/atom_api_app.cc | 37 ++++++++++++++++++++++++----- atom/browser/browser.h | 19 +++++++++------ atom/browser/browser_mac.mm | 33 +++++++++++--------------- spec/api-app-spec.js | 40 ++++++++++++++++++++++---------- 4 files changed, 85 insertions(+), 44 deletions(-) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index f8a7077a12..b0a842d4ca 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -71,6 +71,33 @@ struct Converter { }; #endif +#if defined(OS_MACOSX) +template<> +struct Converter { + static bool FromV8(v8::Isolate* isolate, v8::Local val, + Browser::LoginItemSettings* out) { + mate::Dictionary dict; + if (!ConvertFromV8(isolate, val, &dict)) + return false; + + dict.Get("openAtLogin", &(out->open_at_login)); + dict.Get("openAsHidden", &(out->open_as_hidden)); + return true; + } + + static v8::Local ToV8(v8::Isolate* isolate, + Browser::LoginItemSettings val) { + mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate); + dict.Set("openAtLogin", val.open_at_login); + dict.Set("openAsHidden", val.open_as_hidden); + dict.Set("restoreState", val.restore_state); + dict.Set("openedAtLogin", val.opened_at_login); + dict.Set("openedAsHidden", val.opened_as_hidden); + return dict.GetHandle(); + } +}; +#endif + } // namespace mate @@ -529,12 +556,10 @@ void App::BuildPrototype( base::Bind(&Browser::SetUserActivity, browser)) .SetMethod("getCurrentActivityType", base::Bind(&Browser::GetCurrentActivityType, browser)) - .SetMethod("getLoginItemStatus", - base::Bind(&Browser::GetLoginItemStatus, browser)) - .SetMethod("setAsLoginItem", - base::Bind(&Browser::SetAsLoginItem, browser)) - .SetMethod("removeAsLoginItem", - base::Bind(&Browser::RemoveAsLoginItem, browser)) + .SetMethod("getLoginItemSettings", + base::Bind(&Browser::GetLoginItemSettings, browser)) + .SetMethod("setLoginItemSettings", + base::Bind(&Browser::SetLoginItemSettings, browser)) #endif #if defined(OS_WIN) .SetMethod("setUserTasks", base::Bind(&Browser::SetUserTasks, browser)) diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 6aeb6ed092..be51d7ec00 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -92,6 +92,14 @@ class Browser : public WindowListObserver { int GetBadgeCount(); #if defined(OS_MACOSX) + struct LoginItemSettings { + bool open_at_login = false; + bool open_as_hidden = false; + bool restore_state = false; + bool opened_at_login = false; + bool opened_as_hidden = false; + }; + // Hide the application. void Hide(); @@ -135,14 +143,11 @@ class Browser : public WindowListObserver { // Set docks' icon. void DockSetIcon(const gfx::Image& image); - // Get login item status of app - v8::Local GetLoginItemStatus(mate::Arguments* args); + // Get login item settings of app + LoginItemSettings GetLoginItemSettings(); - // Set app as a login item - void SetAsLoginItem(mate::Arguments* args); - - // Remove app as a login item - void RemoveAsLoginItem(); + // Set login item settings of app + void SetLoginItemSettings(LoginItemSettings settings); #endif // defined(OS_MACOSX) #if defined(OS_WIN) diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index 6207a221e6..4dfa3aa963 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -15,7 +15,6 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/sys_string_conversions.h" #include "brightray/common/application_info.h" -#include "native_mate/dictionary.h" #include "net/base/mac/url_conversions.h" #include "url/gurl.h" @@ -150,26 +149,22 @@ bool Browser::ContinueUserActivity(const std::string& type, return prevent_default; } -v8::Local Browser::GetLoginItemStatus(mate::Arguments* args) { - bool hidden = false; - mate::Dictionary dict = mate::Dictionary::CreateEmpty(args->isolate()); - dict.Set("openAtLogin", base::mac::CheckLoginItemStatus(&hidden)); - dict.Set("openAsHidden", hidden); - dict.Set("restoreState", base::mac::WasLaunchedAsLoginItemRestoreState()); - dict.Set("openedAtLogin", base::mac::WasLaunchedAsLoginOrResumeItem()); - dict.Set("openedAsHidden", base::mac::WasLaunchedAsHiddenLoginItem()); - - return dict.GetHandle(); +Browser::LoginItemSettings Browser::GetLoginItemSettings() { + LoginItemSettings settings; + settings.open_at_login = base::mac::CheckLoginItemStatus( + &settings.open_as_hidden); + settings.restore_state = base::mac::WasLaunchedAsLoginItemRestoreState(); + settings.opened_at_login = base::mac::WasLaunchedAsLoginOrResumeItem(); + settings.opened_as_hidden = base::mac::WasLaunchedAsHiddenLoginItem(); + return settings; } -void Browser::SetAsLoginItem(mate::Arguments* args) { - bool hidden = false; - args->GetNext(&hidden); - base::mac::AddToLoginItems(hidden); -} - -void Browser::RemoveAsLoginItem() { - base::mac::RemoveFromLoginItems(); +void Browser::SetLoginItemSettings(LoginItemSettings settings) { + if (settings.open_at_login) { + base::mac::AddToLoginItems(settings.open_as_hidden); + } else { + base::mac::RemoveFromLoginItems(); + } } std::string Browser::GetExecutableFileVersion() const { diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index af6a7c7e68..de58235855 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -299,28 +299,44 @@ describe('app module', function () { }) }) - describe('app.getLoginItemStatus API', function () { + describe('app.get/setLoginItemSettings API', function () { if (process.platform !== 'darwin') return beforeEach(function () { - assert.equal(app.getLoginItemStatus().openedAtLogin, false) - assert.equal(app.getLoginItemStatus().openedAsHidden, false) - assert.equal(app.getLoginItemStatus().restoreState, false) + app.setLoginItemSettings({openAtLogin: false}) }) afterEach(function () { - app.removeAsLoginItem() - assert.equal(app.getLoginItemStatus().openAtLogin, false) + app.setLoginItemSettings({openAtLogin: false}) }) it('returns the login item status of the app', function () { - app.setAsLoginItem(true) - assert.equal(app.getLoginItemStatus().openAtLogin, true) - assert.equal(app.getLoginItemStatus().openAsHidden, true) + app.setLoginItemSettings({openAtLogin: true}) + assert.deepEqual(app.getLoginItemSettings(), { + openAtLogin: true, + openAsHidden: false, + openedAtLogin: false, + openedAsHidden: false, + restoreState: false + }) - app.setAsLoginItem(false) - assert.equal(app.getLoginItemStatus().openAtLogin, true) - assert.equal(app.getLoginItemStatus().openAsHidden, false) + app.setLoginItemSettings({openAtLogin: true, openAsHidden: true}) + assert.deepEqual(app.getLoginItemSettings(), { + openAtLogin: true, + openAsHidden: true, + openedAtLogin: false, + openedAsHidden: false, + restoreState: false + }) + + app.setLoginItemSettings({}) + assert.deepEqual(app.getLoginItemSettings(), { + openAtLogin: false, + openAsHidden: false, + openedAtLogin: false, + openedAsHidden: false, + restoreState: false + }) }) }) })