diff --git a/shell/browser/mac/electron_application_delegate.mm b/shell/browser/mac/electron_application_delegate.mm index 9f947f4933..7ab2741aa1 100644 --- a/shell/browser/mac/electron_application_delegate.mm +++ b/shell/browser/mac/electron_application_delegate.mm @@ -109,7 +109,14 @@ static NSDictionary* UNNotificationResponseToNSDictionary( } - (NSMenu*)applicationDockMenu:(NSApplication*)sender { - return menu_controller_ ? menu_controller_.menu : nil; + if (!menu_controller_) + return nil; + + // Manually refresh menu state since menuWillOpen: is not called + // by macOS for dock menus for some reason before they are displayed. + NSMenu* menu = menu_controller_.menu; + [menu_controller_ refreshMenuTree:menu]; + return menu; } - (BOOL)application:(NSApplication*)sender openFile:(NSString*)filename { diff --git a/shell/browser/ui/cocoa/electron_menu_controller.h b/shell/browser/ui/cocoa/electron_menu_controller.h index 489f42ad77..b0f104215d 100644 --- a/shell/browser/ui/cocoa/electron_menu_controller.h +++ b/shell/browser/ui/cocoa/electron_menu_controller.h @@ -57,6 +57,10 @@ class ElectronMenuModel; // Whether the menu is currently open. - (BOOL)isMenuOpen; +// Recursively refreshes the menu tree starting from |menu|, applying the +// model state (enabled, checked, hidden etc) to each menu item. +- (void)refreshMenuTree:(NSMenu*)menu; + // NSMenuDelegate methods this class implements. Subclasses should call super // if extending the behavior. - (void)menuWillOpen:(NSMenu*)menu; diff --git a/shell/browser/ui/cocoa/electron_menu_controller.mm b/shell/browser/ui/cocoa/electron_menu_controller.mm index e0a17f8d64..4f0962e000 100644 --- a/shell/browser/ui/cocoa/electron_menu_controller.mm +++ b/shell/browser/ui/cocoa/electron_menu_controller.mm @@ -490,8 +490,6 @@ NSArray* ConvertSharingItemToNS(const SharingItem& item) { : NSControlStateValueOff; } -// Recursively refreshes the menu tree starting from |menu|, applying the -// model state to each menu item. - (void)refreshMenuTree:(NSMenu*)menu { for (NSMenuItem* item in menu.itemArray) { [self applyStateToMenuItem:item];