feat: add app.getApplicationInfoForProtocol API (#24112)
* pre merge * windows changes * added tests * clean up * more cleanup * lint error * windows 7 support * added windows 7 implementation * code review * lint and code review * code review * app.md merge conflict * merge conflict app.md accidently deleted code block * 'lint' * mis-moved getapplicationinfoforprotocol() into anonymous namespace * fix test * lint * code review
This commit is contained in:
parent
2cbd091e89
commit
ee61eb9aa4
6 changed files with 261 additions and 20 deletions
|
@ -21,6 +21,7 @@
|
|||
#include "shell/browser/native_window.h"
|
||||
#include "shell/browser/window_list.h"
|
||||
#include "shell/common/application_info.h"
|
||||
#include "shell/common/gin_converters/image_converter.h"
|
||||
#include "shell/common/gin_helper/arguments.h"
|
||||
#include "shell/common/gin_helper/dictionary.h"
|
||||
#include "shell/common/gin_helper/error_thrower.h"
|
||||
|
@ -31,6 +32,65 @@
|
|||
|
||||
namespace electron {
|
||||
|
||||
namespace {
|
||||
|
||||
NSString* GetAppPathForProtocol(const GURL& url) {
|
||||
NSURL* ns_url = [NSURL
|
||||
URLWithString:base::SysUTF8ToNSString(url.possibly_invalid_spec())];
|
||||
base::ScopedCFTypeRef<CFErrorRef> out_err;
|
||||
|
||||
base::ScopedCFTypeRef<CFURLRef> openingApp(LSCopyDefaultApplicationURLForURL(
|
||||
(CFURLRef)ns_url, kLSRolesAll, out_err.InitializeInto()));
|
||||
|
||||
if (out_err) {
|
||||
// likely kLSApplicationNotFoundErr
|
||||
return nullptr;
|
||||
}
|
||||
NSString* app_path = [base::mac::CFToNSCast(openingApp.get()) path];
|
||||
return app_path;
|
||||
}
|
||||
|
||||
gfx::Image GetApplicationIconForProtocol(NSString* _Nonnull app_path) {
|
||||
NSImage* image = [[NSWorkspace sharedWorkspace] iconForFile:app_path];
|
||||
gfx::Image icon(image);
|
||||
return icon;
|
||||
}
|
||||
|
||||
base::string16 GetAppDisplayNameForProtocol(NSString* app_path) {
|
||||
NSString* app_display_name =
|
||||
[[NSFileManager defaultManager] displayNameAtPath:app_path];
|
||||
return base::SysNSStringToUTF16(app_display_name);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
v8::Local<v8::Promise> Browser::GetApplicationInfoForProtocol(
|
||||
v8::Isolate* isolate,
|
||||
const GURL& url) {
|
||||
gin_helper::Promise<gin_helper::Dictionary> promise(isolate);
|
||||
v8::Local<v8::Promise> handle = promise.GetHandle();
|
||||
gin_helper::Dictionary dict = gin::Dictionary::CreateEmpty(isolate);
|
||||
|
||||
NSString* ns_app_path = GetAppPathForProtocol(url);
|
||||
|
||||
if (!ns_app_path) {
|
||||
promise.RejectWithErrorMessage(
|
||||
"Unable to retrieve installation path to app");
|
||||
return handle;
|
||||
}
|
||||
|
||||
base::string16 app_path = base::SysNSStringToUTF16(ns_app_path);
|
||||
base::string16 app_display_name = GetAppDisplayNameForProtocol(ns_app_path);
|
||||
gfx::Image app_icon = GetApplicationIconForProtocol(ns_app_path);
|
||||
|
||||
dict.Set("name", app_display_name);
|
||||
dict.Set("path", app_path);
|
||||
dict.Set("icon", app_icon);
|
||||
|
||||
promise.Resolve(dict);
|
||||
return handle;
|
||||
}
|
||||
|
||||
void Browser::SetShutdownHandler(base::Callback<bool()> handler) {
|
||||
[[AtomApplication sharedApplication] setShutdownHandler:std::move(handler)];
|
||||
}
|
||||
|
@ -148,19 +208,12 @@ bool Browser::IsDefaultProtocolClient(const std::string& protocol,
|
|||
}
|
||||
|
||||
base::string16 Browser::GetApplicationNameForProtocol(const GURL& url) {
|
||||
NSURL* ns_url = [NSURL
|
||||
URLWithString:base::SysUTF8ToNSString(url.possibly_invalid_spec())];
|
||||
base::ScopedCFTypeRef<CFErrorRef> out_err;
|
||||
base::ScopedCFTypeRef<CFURLRef> openingApp(LSCopyDefaultApplicationURLForURL(
|
||||
(CFURLRef)ns_url, kLSRolesAll, out_err.InitializeInto()));
|
||||
if (out_err) {
|
||||
// likely kLSApplicationNotFoundErr
|
||||
NSString* app_path = GetAppPathForProtocol(url);
|
||||
if (!app_path) {
|
||||
return base::string16();
|
||||
}
|
||||
NSString* appPath = [base::mac::CFToNSCast(openingApp.get()) path];
|
||||
NSString* appDisplayName =
|
||||
[[NSFileManager defaultManager] displayNameAtPath:appPath];
|
||||
return base::SysNSStringToUTF16(appDisplayName);
|
||||
base::string16 app_display_name = GetAppDisplayNameForProtocol(app_path);
|
||||
return app_display_name;
|
||||
}
|
||||
|
||||
void Browser::SetAppUserModelID(const base::string16& name) {}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue