From af9e010162adaf3261cce5ee35b426db235ffa53 Mon Sep 17 00:00:00 2001 From: Charlie Hess Date: Wed, 31 Aug 2016 17:17:44 -0700 Subject: [PATCH 1/5] Send notification userInfo to app.ready, on macOS. Check if the user launched the app from a notification and send the notification args across if so. --- atom/browser/api/atom_api_app.cc | 4 ++-- atom/browser/api/atom_api_app.h | 2 +- atom/browser/atom_browser_main_parts.cc | 3 ++- atom/browser/browser.cc | 4 ++-- atom/browser/browser.h | 2 +- atom/browser/browser_observer.h | 2 +- atom/browser/mac/atom_application_delegate.mm | 13 +++++++++++-- 7 files changed, 20 insertions(+), 10 deletions(-) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index 4f926f55ba73..cfe147bf38e9 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -274,8 +274,8 @@ void App::OnWillFinishLaunching() { Emit("will-finish-launching"); } -void App::OnFinishLaunching() { - Emit("ready"); +void App::OnFinishLaunching(const base::DictionaryValue& launch_info) { + Emit("ready", launch_info); } void App::OnAccessibilitySupportChanged() { diff --git a/atom/browser/api/atom_api_app.h b/atom/browser/api/atom_api_app.h index 990199cd6fe5..1c87023f104f 100644 --- a/atom/browser/api/atom_api_app.h +++ b/atom/browser/api/atom_api_app.h @@ -69,7 +69,7 @@ class App : public AtomBrowserClient::Delegate, void OnOpenURL(const std::string& url) override; void OnActivate(bool has_visible_windows) override; void OnWillFinishLaunching() override; - void OnFinishLaunching() override; + void OnFinishLaunching(const base::DictionaryValue& launch_info) override; void OnLogin(LoginHandler* login_handler, const base::DictionaryValue& request_details) override; void OnAccessibilitySupportChanged() override; diff --git a/atom/browser/atom_browser_main_parts.cc b/atom/browser/atom_browser_main_parts.cc index 6c2f18be0f6e..ab27a8127dca 100644 --- a/atom/browser/atom_browser_main_parts.cc +++ b/atom/browser/atom_browser_main_parts.cc @@ -156,7 +156,8 @@ void AtomBrowserMainParts::PreMainMessageLoopRun() { #if !defined(OS_MACOSX) // The corresponding call in macOS is in AtomApplicationDelegate. Browser::Get()->WillFinishLaunching(); - Browser::Get()->DidFinishLaunching(); + base::DictionaryValue* empty_info = new base::DictionaryValue(); + Browser::Get()->DidFinishLaunching(empty_info); #endif } diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index 6c3edc0d6e3d..9bd1e3a9c4fe 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -148,14 +148,14 @@ void Browser::WillFinishLaunching() { FOR_EACH_OBSERVER(BrowserObserver, observers_, OnWillFinishLaunching()); } -void Browser::DidFinishLaunching() { +void Browser::DidFinishLaunching(const base::DictionaryValue& launch_info) { // Make sure the userData directory is created. base::FilePath user_data; if (PathService::Get(brightray::DIR_USER_DATA, &user_data)) base::CreateDirectoryAndGetError(user_data, nullptr); is_ready_ = true; - FOR_EACH_OBSERVER(BrowserObserver, observers_, OnFinishLaunching()); + FOR_EACH_OBSERVER(BrowserObserver, observers_, OnFinishLaunching(launch_info)); } void Browser::OnAccessibilitySupportChanged() { diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 924685510f7e..5bb2500b6633 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -184,7 +184,7 @@ class Browser : public WindowListObserver { // Tell the application the loading has been done. void WillFinishLaunching(); - void DidFinishLaunching(); + void DidFinishLaunching(const base::DictionaryValue& launch_info); void OnAccessibilitySupportChanged(); diff --git a/atom/browser/browser_observer.h b/atom/browser/browser_observer.h index 54617e5e09fa..88a50a93a7ee 100644 --- a/atom/browser/browser_observer.h +++ b/atom/browser/browser_observer.h @@ -46,7 +46,7 @@ class BrowserObserver { // The browser has finished loading. virtual void OnWillFinishLaunching() {} - virtual void OnFinishLaunching() {} + virtual void OnFinishLaunching(const base::DictionaryValue& launch_info) {} // The browser requests HTTP login. virtual void OnLogin(LoginHandler* login_handler, diff --git a/atom/browser/mac/atom_application_delegate.mm b/atom/browser/mac/atom_application_delegate.mm index e77bd125201b..4fcbc012bd15 100644 --- a/atom/browser/mac/atom_application_delegate.mm +++ b/atom/browser/mac/atom_application_delegate.mm @@ -25,7 +25,16 @@ } - (void)applicationDidFinishLaunching:(NSNotification*)notify { - atom::Browser::Get()->DidFinishLaunching(); + NSUserNotification *user_notification = [notify userInfo][(id)@"NSApplicationLaunchUserNotificationKey"]; + + if (user_notification.userInfo != nil) { + std::unique_ptr launch_info = + atom::NSDictionaryToDictionaryValue(user_notification.userInfo); + atom::Browser::Get()->DidFinishLaunching(*launch_info); + } else { + base::DictionaryValue* launch_info = new base::DictionaryValue(); + atom::Browser::Get()->DidFinishLaunching(*launch_info); + } } - (NSMenu*)applicationDockMenu:(NSApplication*)sender { @@ -64,7 +73,7 @@ continueUserActivity:(NSUserActivity*)userActivity restorationHandler:(void (^)(NSArray*restorableObjects))restorationHandler { std::string activity_type(base::SysNSStringToUTF8(userActivity.activityType)); std::unique_ptr user_info = - atom::NSDictionaryToDictionaryValue(userActivity.userInfo); + atom::NSDictionaryToDictionaryValue(userActivity.userInfo); if (!user_info) return NO; From cd25066c9f8276e391738e090da62c554aa3208e Mon Sep 17 00:00:00 2001 From: Charlie Hess Date: Wed, 31 Aug 2016 17:26:25 -0700 Subject: [PATCH 2/5] Fix oops on Windows / Linux. --- atom/browser/atom_browser_main_parts.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atom/browser/atom_browser_main_parts.cc b/atom/browser/atom_browser_main_parts.cc index ab27a8127dca..00461a49fae4 100644 --- a/atom/browser/atom_browser_main_parts.cc +++ b/atom/browser/atom_browser_main_parts.cc @@ -157,7 +157,7 @@ void AtomBrowserMainParts::PreMainMessageLoopRun() { // The corresponding call in macOS is in AtomApplicationDelegate. Browser::Get()->WillFinishLaunching(); base::DictionaryValue* empty_info = new base::DictionaryValue(); - Browser::Get()->DidFinishLaunching(empty_info); + Browser::Get()->DidFinishLaunching(*empty_info); #endif } From f0517812b1bacab39eafcf71744fb4d005e72220 Mon Sep 17 00:00:00 2001 From: Charlie Hess Date: Wed, 31 Aug 2016 18:12:35 -0700 Subject: [PATCH 3/5] Linter fascism. --- atom/browser/browser.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index 9bd1e3a9c4fe..b227b6b81590 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -155,7 +155,8 @@ void Browser::DidFinishLaunching(const base::DictionaryValue& launch_info) { base::CreateDirectoryAndGetError(user_data, nullptr); is_ready_ = true; - FOR_EACH_OBSERVER(BrowserObserver, observers_, OnFinishLaunching(launch_info)); + FOR_EACH_OBSERVER(BrowserObserver, observers_, + OnFinishLaunching(launch_info)); } void Browser::OnAccessibilitySupportChanged() { From 80f046c8dfba0100f303150839ca68a179b4d7fc Mon Sep 17 00:00:00 2001 From: Charlie Hess Date: Sat, 3 Sep 2016 12:03:58 -0700 Subject: [PATCH 4/5] Update docs. --- docs/api/app.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/api/app.md b/docs/api/app.md index aeb003d33974..84a6dc465d39 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -28,7 +28,13 @@ In most cases, you should just do everything in the `ready` event handler. ### Event: 'ready' -Emitted when Electron has finished initialization. +Returns: + +* `launchInfo` Object _macOS_ + +Emitted when Electron has finished initialization. On macOS, `launchInfo` holds +the `userInfo` of the `NSUserNotification` that was used to open the application, +if it was launched from Notification Center. ### Event: 'window-all-closed' From 32e0e8a1518db32e8df4edac6d931fd719523e7b Mon Sep 17 00:00:00 2001 From: Charlie Hess Date: Thu, 8 Sep 2016 16:23:55 -0700 Subject: [PATCH 5/5] Use smart pointers in a couple places. --- atom/browser/atom_browser_main_parts.cc | 2 +- atom/browser/mac/atom_application_delegate.mm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/atom/browser/atom_browser_main_parts.cc b/atom/browser/atom_browser_main_parts.cc index 00461a49fae4..e160eb7c0ce1 100644 --- a/atom/browser/atom_browser_main_parts.cc +++ b/atom/browser/atom_browser_main_parts.cc @@ -156,7 +156,7 @@ void AtomBrowserMainParts::PreMainMessageLoopRun() { #if !defined(OS_MACOSX) // The corresponding call in macOS is in AtomApplicationDelegate. Browser::Get()->WillFinishLaunching(); - base::DictionaryValue* empty_info = new base::DictionaryValue(); + std::unique_ptr empty_info(new base::DictionaryValue); Browser::Get()->DidFinishLaunching(*empty_info); #endif } diff --git a/atom/browser/mac/atom_application_delegate.mm b/atom/browser/mac/atom_application_delegate.mm index 4fcbc012bd15..4c6a938fba59 100644 --- a/atom/browser/mac/atom_application_delegate.mm +++ b/atom/browser/mac/atom_application_delegate.mm @@ -32,8 +32,8 @@ atom::NSDictionaryToDictionaryValue(user_notification.userInfo); atom::Browser::Get()->DidFinishLaunching(*launch_info); } else { - base::DictionaryValue* launch_info = new base::DictionaryValue(); - atom::Browser::Get()->DidFinishLaunching(*launch_info); + std::unique_ptr empty_info(new base::DictionaryValue); + atom::Browser::Get()->DidFinishLaunching(*empty_info); } }