diff --git a/browser/brave_app_controller_mac.h b/browser/brave_app_controller_mac.h index b0e29b28c00..a5860351f52 100644 --- a/browser/brave_app_controller_mac.h +++ b/browser/brave_app_controller_mac.h @@ -8,11 +8,15 @@ #import +#import "brave/components/brave_origin/buildflags/buildflags.h" #import "chrome/browser/app_controller_mac.h" // * Manages logic to switch hotkey between copy and copy clean link item. // * Add "New Private Window with Tor" to the dock menu. @interface BraveAppController : AppController +#if BUILDFLAG(IS_BRAVE_ORIGIN_BRANDED) +- (void)restoreProfileMenu; +#endif @end #endif // BRAVE_BROWSER_BRAVE_APP_CONTROLLER_MAC_H_ diff --git a/browser/brave_app_controller_mac.mm b/browser/brave_app_controller_mac.mm index 8d1c161e23c..784eb8df17a 100644 --- a/browser/brave_app_controller_mac.mm +++ b/browser/brave_app_controller_mac.mm @@ -87,6 +87,11 @@ class TorPrefObserver : public BooleanPrefMember { NSMenuItem* _copyMenuItem; NSMenuItem* _copyCleanLinkMenuItem; +#if BUILDFLAG(IS_BRAVE_ORIGIN_BRANDED) + NSMenuItem* _profileMenuItem; // Stashed while startup dialog is showing + NSInteger _profileMenuIndex; // Original position in the menu bar +#endif + #if BUILDFLAG(ENABLE_TOR) NSMenuItem* _torMenuItem; // For dock menu NSMenuItem* _torMainMenuItem; // For main menu @@ -96,6 +101,14 @@ class TorPrefObserver : public BooleanPrefMember { } @end +#if BUILDFLAG(IS_BRAVE_ORIGIN_BRANDED) +void BraveRestoreProfileMenu() { + auto* controller = + static_cast(AppController.sharedController); + [controller restoreProfileMenu]; +} +#endif + @implementation BraveAppController #if BUILDFLAG(IS_BRAVE_ORIGIN_BRANDED) @@ -132,11 +145,41 @@ class TorPrefObserver : public BooleanPrefMember { return [super applicationShouldHandleReopen:theApplication hasVisibleWindows:hasVisibleWindows]; } + +- (void)application:(NSApplication*)sender openURLs:(NSArray*)urls { + if (BraveOriginStartupView::IsShowing()) { + return; + } + [super application:sender openURLs:urls]; +} + +- (void)restoreProfileMenu { + if (_profileMenuItem) { + [[NSApp mainMenu] insertItem:_profileMenuItem atIndex:_profileMenuIndex]; + _profileMenuItem = nil; + } +} #endif // BUILDFLAG(IS_BRAVE_ORIGIN_BRANDED) - (void)mainMenuCreated { [super mainMenuCreated]; +#if BUILDFLAG(IS_BRAVE_ORIGIN_BRANDED) + // Stash and remove the Profiles top-level menu. Profile switching, "Manage", + // and "Add Profile" all open browser windows that bypass the startup dialog. + // restoreProfileMenu re-inserts it. It is called from the startup completion + // callback, or immediately if no dialog is needed. + { + NSMenu* mainMenu = [NSApp mainMenu]; + NSMenuItem* profileMenu = [mainMenu itemWithTag:IDC_PROFILE_MAIN_MENU]; + if (profileMenu) { + _profileMenuIndex = [mainMenu indexOfItem:profileMenu]; + _profileMenuItem = profileMenu; + [mainMenu removeItem:profileMenu]; + } + } +#endif // BUILDFLAG(IS_BRAVE_ORIGIN_BRANDED) + NSMenu* editMenu = [[[NSApp mainMenu] itemWithTag:IDC_EDIT_MENU] submenu]; _copyMenuItem = [editMenu itemWithTag:IDC_CONTENT_CONTEXT_COPY]; DCHECK(_copyMenuItem); @@ -302,6 +345,14 @@ class TorPrefObserver : public BooleanPrefMember { } - (NSMenu*)applicationDockMenu:(NSApplication*)sender { +#if BUILDFLAG(IS_BRAVE_ORIGIN_BRANDED) + if (BraveOriginStartupView::IsShowing()) { + // Return an empty dock menu while the startup dialog is showing. + // The system always adds "Quit" automatically. + return [[NSMenu alloc] initWithTitle:@""]; + } +#endif // BUILDFLAG(IS_BRAVE_ORIGIN_BRANDED) + auto* menu = [super applicationDockMenu:sender]; #if BUILDFLAG(ENABLE_TOR) diff --git a/chromium_src/chrome/browser/ui/startup/startup_browser_creator.cc b/chromium_src/chrome/browser/ui/startup/startup_browser_creator.cc index 899949a4f95..a5e5357a46e 100644 --- a/chromium_src/chrome/browser/ui/startup/startup_browser_creator.cc +++ b/chromium_src/chrome/browser/ui/startup/startup_browser_creator.cc @@ -23,6 +23,11 @@ #include "chrome/browser/platform_util.h" #include "chrome/browser/profiles/profile_manager.h" #include "components/prefs/pref_service.h" +#if BUILDFLAG(IS_MAC) +// Defined in brave_app_controller_mac.mm. We can't include the ObjC header +// from a .cc file, so declare the free function directly. +void BraveRestoreProfileMenu(); +#endif #endif #ifdef LaunchModeRecorder @@ -154,6 +159,11 @@ bool StartupBrowserCreator::Start(const base::CommandLine& cmd_line, const base::CommandLine& cmd_line, const base::FilePath& cur_dir, StartupProfileInfo profile_info, const Profiles& last_opened_profiles) { +#if BUILDFLAG(IS_MAC) + // Re-insert the Profiles menu that was stashed while the + // startup dialog was showing. + BraveRestoreProfileMenu(); +#endif StartupBrowserCreator browser_creator; browser_creator.AddFirstRunTabs(first_run_tabs); browser_creator.Start_ChromiumImpl(cmd_line, cur_dir, @@ -165,6 +175,10 @@ bool StartupBrowserCreator::Start(const base::CommandLine& cmd_line, std::make_unique()); return true; } +#if BUILDFLAG(IS_MAC) + // No dialog needed, restore the Profiles menu immediately. + BraveRestoreProfileMenu(); +#endif #endif // BUILDFLAG(IS_BRAVE_ORIGIN_BRANDED) return Start_ChromiumImpl(cmd_line, cur_dir, std::move(profile_info), last_opened_profiles);