Add path and args to LoginItemSettings struct

This commit is contained in:
Kevin Sawicki 2017-01-30 14:01:40 -08:00
parent 29d0a30d63
commit e2501a80e4
8 changed files with 67 additions and 51 deletions

View file

@ -12,7 +12,6 @@
#include "atom/browser/api/atom_api_web_contents.h"
#include "atom/browser/atom_browser_context.h"
#include "atom/browser/atom_browser_main_parts.h"
#include "atom/browser/browser.h"
#include "atom/browser/login_handler.h"
#include "atom/browser/relauncher.h"
#include "atom/common/atom_command_line.h"
@ -298,6 +297,8 @@ struct Converter<Browser::LoginItemSettings> {
dict.Get("openAtLogin", &(out->open_at_login));
dict.Get("openAsHidden", &(out->open_as_hidden));
dict.Get("path", &(out->path));
dict.Get("args", &(out->args));
return true;
}
@ -746,6 +747,12 @@ bool App::IsAccessibilitySupportEnabled() {
return ax_state->IsAccessibleBrowser();
}
Browser::LoginItemSettings App::GetLoginItemSettings(mate::Arguments* args) {
Browser::LoginItemSettings options;
args->GetNext(&options);
return Browser::Get()->GetLoginItemSettings(options);
}
#if defined(USE_NSS_CERTS)
void App::ImportCertificate(
const base::DictionaryValue& options,
@ -867,8 +874,7 @@ void App::BuildPrototype(
base::Bind(&Browser::RemoveAsDefaultProtocolClient, browser))
.SetMethod("setBadgeCount", base::Bind(&Browser::SetBadgeCount, browser))
.SetMethod("getBadgeCount", base::Bind(&Browser::GetBadgeCount, browser))
.SetMethod("getLoginItemSettings",
base::Bind(&Browser::GetLoginItemSettings, browser))
.SetMethod("getLoginItemSettings", &App::GetLoginItemSettings)
.SetMethod("setLoginItemSettings",
base::Bind(&Browser::SetLoginItemSettings, browser))
#if defined(OS_MACOSX)

View file

@ -10,6 +10,7 @@
#include "atom/browser/api/event_emitter.h"
#include "atom/browser/atom_browser_client.h"
#include "atom/browser/browser.h"
#include "atom/browser/browser_observer.h"
#include "atom/common/native_mate_converters/callback.h"
#include "chrome/browser/process_singleton.h"
@ -123,6 +124,7 @@ class App : public AtomBrowserClient::Delegate,
bool Relaunch(mate::Arguments* args);
void DisableHardwareAcceleration(mate::Arguments* args);
bool IsAccessibilitySupportEnabled();
Browser::LoginItemSettings GetLoginItemSettings(mate::Arguments* args);
#if defined(USE_NSS_CERTS)
void ImportCertificate(const base::DictionaryValue& options,
const net::CompletionCallback& callback);

View file

@ -98,9 +98,11 @@ class Browser : public WindowListObserver {
bool restore_state = false;
bool opened_at_login = false;
bool opened_as_hidden = false;
base::string16 path;
std::vector<base::string16> args;
};
void SetLoginItemSettings(LoginItemSettings settings, mate::Arguments* args);
LoginItemSettings GetLoginItemSettings(mate::Arguments* args);
void SetLoginItemSettings(LoginItemSettings settings);
LoginItemSettings GetLoginItemSettings(LoginItemSettings options);
#if defined(OS_MACOSX)
// Hide the application.

View file

@ -60,12 +60,11 @@ bool Browser::SetBadgeCount(int count) {
}
}
void Browser::SetLoginItemSettings(LoginItemSettings settings,
mate::Arguments* args) {
void Browser::SetLoginItemSettings(LoginItemSettings settings) {
}
Browser::LoginItemSettings Browser::GetLoginItemSettings(
mate::Arguments* args) {
LoginItemSettings options) {
return LoginItemSettings();
}

View file

@ -152,7 +152,8 @@ bool Browser::ContinueUserActivity(const std::string& type,
return prevent_default;
}
Browser::LoginItemSettings Browser::GetLoginItemSettings(mate::Arguments* args) {
Browser::LoginItemSettings Browser::GetLoginItemSettings(
LoginItemSettings options) {
LoginItemSettings settings;
settings.open_at_login = base::mac::CheckLoginItemStatus(
&settings.open_as_hidden);
@ -162,8 +163,7 @@ Browser::LoginItemSettings Browser::GetLoginItemSettings(mate::Arguments* args)
return settings;
}
void Browser::SetLoginItemSettings(LoginItemSettings settings,
mate::Arguments* args) {
void Browser::SetLoginItemSettings(LoginItemSettings settings) {
if (settings.open_at_login)
base::mac::AddToLoginItems(settings.open_as_hidden);
else

View file

@ -43,11 +43,11 @@ BOOL CALLBACK WindowsEnumerationHandler(HWND hwnd, LPARAM param) {
return TRUE;
}
bool ReadAppCommandLine(mate::Arguments* args,
base::string16* exe,
bool ReadAppCommandLine(base::string16* exe,
const std::vector<base::string16>& launch_args,
bool includeOriginalArg) {
// Executable Path
if (!args->GetNext(exe)) {
if (exe->empty()) {
base::FilePath path;
if (!PathService::Get(base::FILE_EXE, &path)) {
LOG(ERROR) << "Error getting app exe path";
@ -56,21 +56,20 @@ bool ReadAppCommandLine(mate::Arguments* args,
*exe = path.value();
}
// Read in optional args arg
std::vector<base::string16> launch_args;
if (args->GetNext(&launch_args) && !launch_args.empty()) {
if (launch_args.empty()) {
base::string16 formatString = includeOriginalArg ?
L"\"%s\" \"%%1\"" :
L"\"%s\"";
*exe = base::StringPrintf(formatString.c_str(), exe->c_str());
} else {
base::string16 formatString = includeOriginalArg ?
L"\"%s\" %s \"%%1\"" :
L"\"%s\" %s";
*exe = base::StringPrintf(formatString.c_str(),
exe->c_str(),
base::JoinString(launch_args, L" ").c_str());
} else {
base::string16 formatString = includeOriginalArg ?
L"\"%s\" \"%%1\"" :
L"\"%s\"";
*exe = base::StringPrintf(formatString.c_str(), exe->c_str());
}
return true;
}
@ -164,7 +163,10 @@ bool Browser::RemoveAsDefaultProtocolClient(const std::string& protocol,
return true;
base::string16 exe;
if (!ReadAppCommandLine(args, &exe, true))
std::vector<base::string16> launch_args;
args->GetNext(&exe);
args->GetNext(&launch_args);
if (!ReadAppCommandLine(&exe, launch_args, true))
return false;
if (keyVal == exe) {
@ -198,7 +200,10 @@ bool Browser::SetAsDefaultProtocolClient(const std::string& protocol,
return false;
base::string16 exe;
if (!ReadAppCommandLine(args, &exe, true))
std::vector<base::string16> launch_args;
args->GetNext(&exe);
args->GetNext(&launch_args);
if (!ReadAppCommandLine(&exe, launch_args, true))
return false;
// Main Registry Key
@ -228,7 +233,10 @@ bool Browser::IsDefaultProtocolClient(const std::string& protocol,
return false;
base::string16 exe;
if (!ReadAppCommandLine(args, &exe, true))
std::vector<base::string16> launch_args;
args->GetNext(&exe);
args->GetNext(&launch_args);
if (!ReadAppCommandLine(&exe, launch_args, true))
return false;
// Main Registry Key
@ -261,14 +269,13 @@ bool Browser::SetBadgeCount(int count) {
return false;
}
void Browser::SetLoginItemSettings(LoginItemSettings settings,
mate::Arguments* args) {
void Browser::SetLoginItemSettings(LoginItemSettings settings) {
base::string16 keyPath = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
base::win::RegKey key(HKEY_CURRENT_USER, keyPath.c_str(), KEY_ALL_ACCESS);
if (settings.open_at_login) {
base::string16 exe;
if (!ReadAppCommandLine(args, &exe, false)) return;
base::string16 exe = settings.path;
if (!ReadAppCommandLine(&exe, settings.args, false)) return;
key.WriteValue(GetAppUserModelID(), exe.c_str());
} else {
@ -277,15 +284,15 @@ void Browser::SetLoginItemSettings(LoginItemSettings settings,
}
Browser::LoginItemSettings Browser::GetLoginItemSettings(
mate::Arguments* args) {
LoginItemSettings options) {
LoginItemSettings settings;
base::string16 keyPath = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
base::win::RegKey key(HKEY_CURRENT_USER, keyPath.c_str(), KEY_ALL_ACCESS);
base::string16 keyVal;
if (!FAILED(key.ReadValue(GetAppUserModelID(), &keyVal))) {
base::string16 exe;
if (ReadAppCommandLine(args, &exe, false)) {
base::string16 exe = options.path;
if (ReadAppCommandLine(&exe, options.args, false)) {
settings.open_at_login = keyVal == exe;
}
}

View file

@ -758,15 +758,16 @@ Returns `Integer` - The current value displayed in the counter badge.
Returns `Boolean` - Whether the current desktop environment is Unity launcher.
### `app.getLoginItemSettings([path, args])` _macOS_ _Windows_
### `app.getLoginItemSettings([options])` _macOS_ _Windows_
* `path` String (optional) _Windows_ - The executable path to compare against.
Defaults to `process.execPath`.
* `args` String[] (optional) _Windows_ - The command-line arguments to compare
against. Defaults to an empty array.
* `options` Object (optional)
* `path` String (optional) _Windows_ - The executable path to compare against.
Defaults to `process.execPath`.
* `args` String[] (optional) _Windows_ - The command-line arguments to compare
against. Defaults to an empty array.
If you provided arguments to `app.setLoginItemSettings` you need to pass the
same arguments here for `openAtLogin` to be set correctly.
If you provided `path` and `argg` potions to `app.setLoginItemSettings` then you
need to pass the same arguments here for `openAtLogin` to be set correctly.
Returns `Object`:
@ -783,8 +784,7 @@ Returns `Object`:
app should restore the windows that were open the last time the app was
closed. This setting is only supported on macOS.
**Note:** This API has no effect on
[MAS builds][mas-builds].
**Note:** This API has no effect on [MAS builds][mas-builds].
### `app.setLoginItemSettings(settings[, path, args])` _macOS_ _Windows_
@ -796,15 +796,16 @@ Returns `Object`:
`app.getLoginItemStatus().wasOpenedAsHidden` should be checked when the app
is opened to know the current value. This setting is only supported on
macOS.
* `path` String (optional) _Windows_ - The executable to launch at login.
Defaults to `process.execPath`.
* `args` String[] (optional) _Windows_ - The command-line arguments to pass to the
executable. Defaults to an empty array. Take care to wrap paths in quotes.
* `path` String (optional) _Windows_ - The executable to launch at login.
Defaults to `process.execPath`.
* `args` String[] (optional) _Windows_ - The command-line arguments to pass to
the executable. Defaults to an empty array. Take care to wrap paths in
quotes.
Set the app's login item settings.
To work with Electron's `autoUpdater` on Windows, which uses [Squirrel](Squirrel-Windows),
you'll want to set the launch path to Update.exe, and pass arguments that specify your
you'll want to set the launch path to Update.exe, and pass arguments that specify your
application name. For example:
``` javascript
@ -818,8 +819,7 @@ app.setLoginItemSettings({openAtLogin: true}, updateExe, [
])
```
**Note:** This API has no effect on
[MAS builds][mas-builds].
**Note:** This API has no effect on [MAS builds][mas-builds].
### `app.isAccessibilitySupportEnabled()` _macOS_ _Windows_

View file

@ -362,10 +362,10 @@ describe('app module', function () {
'--process-start-args', `"--hidden"`
]
app.setLoginItemSettings({openAtLogin: true}, updateExe, processStartArgs)
app.setLoginItemSettings({openAtLogin: true, path: updateExe, args: processStartArgs})
assert(!app.getLoginItemSettings().openAtLogin)
assert(app.getLoginItemSettings(updateExe, processStartArgs))
assert.equal(app.getLoginItemSettings().openAtLogin, false)
assert.equal(app.getLoginItemSettings({path: updateExe, args: processStartArgs}).openAtLogin, true)
})
})