Allow openExternal to open URLs in the background #3224

This commit is contained in:
Ben Gotow 2016-02-02 23:01:00 -08:00 committed by Kevin Sawicki
parent 57f322a818
commit d8679b3899
7 changed files with 33 additions and 9 deletions

View file

@ -26,7 +26,7 @@ bool AtomResourceDispatcherHostDelegate::HandleExternalProtocol(
bool has_user_gesture) {
GURL escaped_url(net::EscapeExternalHandlerValue(url.spec()));
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::Bind(base::IgnoreResult(platform_util::OpenExternal), escaped_url));
base::Bind(base::IgnoreResult(platform_util::OpenExternal), escaped_url, false));
return true;
}

View file

@ -12,12 +12,22 @@
namespace {
bool OpenExternal(const GURL& url, mate::Arguments* args) {
bool without_activation = false;
if (args->Length() == 2) {
mate::Dictionary options;
args->GetNext(&options);
options.Get("withoutActivation", &without_activation);
}
return platform_util::OpenExternal(url, without_activation);
}
void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
v8::Local<v8::Context> context, void* priv) {
mate::Dictionary dict(context->GetIsolate(), exports);
dict.SetMethod("showItemInFolder", &platform_util::ShowItemInFolder);
dict.SetMethod("openItem", &platform_util::OpenItem);
dict.SetMethod("openExternal", &platform_util::OpenExternal);
dict.SetMethod("openExternal", &OpenExternal);
dict.SetMethod("moveItemToTrash", &platform_util::MoveItemToTrash);
dict.SetMethod("beep", &platform_util::Beep);
}

View file

@ -23,7 +23,7 @@ void OpenItem(const base::FilePath& full_path);
// Open the given external protocol URL in the desktop's default manner.
// (For example, mailto: URLs in the default mail user agent.)
bool OpenExternal(const GURL& url);
bool OpenExternal(const GURL& url, const bool without_activation);
// Move a file to trash.
bool MoveItemToTrash(const base::FilePath& full_path);

View file

@ -64,7 +64,7 @@ void OpenItem(const base::FilePath& full_path) {
XDGOpen(full_path.value());
}
bool OpenExternal(const GURL& url) {
bool OpenExternal(const GURL& url, const bool without_activation) {
if (url.SchemeIs("mailto"))
return XDGEmail(url.spec());
else

View file

@ -119,7 +119,7 @@ void OpenItem(const base::FilePath& full_path) {
}
}
bool OpenExternal(const GURL& url) {
bool OpenExternal(const GURL& url, const bool without_activation) {
DCHECK([NSThread isMainThread]);
NSURL* ns_url = net::NSURLWithGURL(url);
if (!ns_url) {
@ -136,7 +136,15 @@ bool OpenExternal(const GURL& url) {
}
CFRelease(openingApp); // NOT A BUG; LSGetApplicationForURL retains for us
return [[NSWorkspace sharedWorkspace] openURL:ns_url];
NSUInteger launchOptions = NSWorkspaceLaunchDefault;
if (without_activation)
launchOptions = launchOptions | NSWorkspaceLaunchWithoutActivation;
return [[NSWorkspace sharedWorkspace] openURLs: @[ns_url]
withAppBundleIdentifier: nil
options: launchOptions
additionalEventParamDescriptor: NULL
launchIdentifiers: NULL];
}
bool MoveItemToTrash(const base::FilePath& full_path) {

View file

@ -301,7 +301,7 @@ void OpenItem(const base::FilePath& full_path) {
ui::win::OpenFileViaShell(full_path);
}
bool OpenExternal(const GURL& url) {
bool OpenExternal(const GURL& url, const bool without_activation) {
// Quote the input scheme to be sure that the command does not have
// parameters unexpected by the external program. This url should already
// have been escaped.

View file

@ -26,12 +26,18 @@ Show the given file in a file manager. If possible, select the file.
Open the given file in the desktop's default manner.
### `shell.openExternal(url)`
### `shell.openExternal(url[, options])`
* `url` String
Open the given external protocol URL in the desktop's default manner. (For
example, mailto: URLs in the user's default mail agent.)
example, mailto: URLs in the user's default mail agent.) Returns true if an
application was available to open the URL, false otherwise.
On Mac OS X, you can pass additional options to openExternal:
- withoutActivation: Pass true to open the URL without bringing the
application into the foreground.
### `shell.moveItemToTrash(fullPath)`