Browse Source

fix: emit 'shutdown' outside -[NSApplication terminate:] (#24111)

Shelley Vohr 4 years ago
parent
commit
9c7d73c6d6

+ 4 - 0
shell/browser/mac/electron_application.h

@@ -17,6 +17,7 @@
   base::scoped_nsobject<NSUserActivity> currentActivity_;
   NSCondition* handoffLock_;
   BOOL updateReceived_;
+  BOOL userStoppedShutdown_;
   base::Callback<bool()> shouldShutdown_;
 }
 
@@ -25,6 +26,9 @@
 - (void)setShutdownHandler:(base::Callback<bool()>)handler;
 - (void)registerURLHandler;
 
+// Called when macOS itself is shutting down.
+- (void)willPowerOff:(NSNotification*)notify;
+
 // CrAppProtocol:
 - (BOOL)isHandlingSendEvent;
 

+ 7 - 2
shell/browser/mac/electron_application.mm

@@ -41,9 +41,14 @@ inline void dispatch_sync_main(dispatch_block_t block) {
   return (AtomApplication*)[super sharedApplication];
 }
 
+- (void)willPowerOff:(NSNotification*)notify {
+  userStoppedShutdown_ = shouldShutdown_ && !shouldShutdown_.Run();
+}
+
 - (void)terminate:(id)sender {
-  if (shouldShutdown_ && !shouldShutdown_.Run())
-    return;  // User will call Quit later.
+  // User will call Quit later.
+  if (userStoppedShutdown_)
+    return;
 
   // We simply try to close the browser, which in turn will try to close the
   // windows. Termination can proceed if all windows are closed or window close

+ 10 - 0
shell/browser/mac/electron_application_delegate.mm

@@ -48,12 +48,22 @@ static base::mac::ScopedObjCClassSwizzler* g_swizzle_imk_input_session;
                                                  useDefaultAccelerator:NO]);
 }
 
+- (void)willPowerOff:(NSNotification*)notify {
+  [[AtomApplication sharedApplication] willPowerOff:notify];
+}
+
 - (void)applicationWillFinishLaunching:(NSNotification*)notify {
   // Don't add the "Enter Full Screen" menu item automatically.
   [[NSUserDefaults standardUserDefaults]
       setBool:NO
        forKey:@"NSFullScreenMenuItemEverywhere"];
 
+  [[[NSWorkspace sharedWorkspace] notificationCenter]
+      addObserver:self
+         selector:@selector(willPowerOff:)
+             name:NSWorkspaceWillPowerOffNotification
+           object:nil];
+
   electron::Browser::Get()->WillFinishLaunching();
 }