Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: chrome/browser/app_controller_mac.mm

Issue 1041313003: MacViews: Remove BrowserWindowController dependency from AppController (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@titlebar
Patch Set: Fix for rsesek Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "chrome/browser/app_controller_mac.h" 5 #import "chrome/browser/app_controller_mac.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 26 matching lines...) Expand all
37 #include "chrome/browser/profiles/profile_info_cache_observer.h" 37 #include "chrome/browser/profiles/profile_info_cache_observer.h"
38 #include "chrome/browser/profiles/profile_manager.h" 38 #include "chrome/browser/profiles/profile_manager.h"
39 #include "chrome/browser/profiles/profiles_state.h" 39 #include "chrome/browser/profiles/profiles_state.h"
40 #include "chrome/browser/sessions/session_restore.h" 40 #include "chrome/browser/sessions/session_restore.h"
41 #include "chrome/browser/sessions/session_service.h" 41 #include "chrome/browser/sessions/session_service.h"
42 #include "chrome/browser/sessions/session_service_factory.h" 42 #include "chrome/browser/sessions/session_service_factory.h"
43 #include "chrome/browser/sessions/tab_restore_service.h" 43 #include "chrome/browser/sessions/tab_restore_service.h"
44 #include "chrome/browser/sessions/tab_restore_service_factory.h" 44 #include "chrome/browser/sessions/tab_restore_service_factory.h"
45 #include "chrome/browser/signin/signin_manager_factory.h" 45 #include "chrome/browser/signin/signin_manager_factory.h"
46 #include "chrome/browser/signin/signin_promo.h" 46 #include "chrome/browser/signin/signin_promo.h"
47 #include "chrome/browser/signin/signin_ui_util.h"
47 #include "chrome/browser/sync/profile_sync_service.h" 48 #include "chrome/browser/sync/profile_sync_service.h"
48 #include "chrome/browser/sync/sync_ui_util.h" 49 #include "chrome/browser/sync/sync_ui_util.h"
49 #include "chrome/browser/ui/browser.h" 50 #include "chrome/browser/ui/browser.h"
50 #include "chrome/browser/ui/browser_command_controller.h" 51 #include "chrome/browser/ui/browser_command_controller.h"
51 #include "chrome/browser/ui/browser_commands.h" 52 #include "chrome/browser/ui/browser_commands.h"
52 #include "chrome/browser/ui/browser_dialogs.h" 53 #include "chrome/browser/ui/browser_dialogs.h"
53 #include "chrome/browser/ui/browser_finder.h" 54 #include "chrome/browser/ui/browser_finder.h"
54 #include "chrome/browser/ui/browser_iterator.h" 55 #include "chrome/browser/ui/browser_iterator.h"
55 #include "chrome/browser/ui/browser_mac.h" 56 #include "chrome/browser/ui/browser_mac.h"
56 #include "chrome/browser/ui/browser_window.h" 57 #include "chrome/browser/ui/browser_window.h"
57 #include "chrome/browser/ui/chrome_pages.h" 58 #include "chrome/browser/ui/chrome_pages.h"
58 #import "chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.h" 59 #import "chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.h"
59 #include "chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac.h" 60 #include "chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac.h"
60 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.h" 61 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.h"
61 #import "chrome/browser/ui/cocoa/browser_window_cocoa.h"
62 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
63 #import "chrome/browser/ui/cocoa/confirm_quit.h" 62 #import "chrome/browser/ui/cocoa/confirm_quit.h"
64 #import "chrome/browser/ui/cocoa/confirm_quit_panel_controller.h" 63 #import "chrome/browser/ui/cocoa/confirm_quit_panel_controller.h"
65 #import "chrome/browser/ui/cocoa/encoding_menu_controller_delegate_mac.h" 64 #import "chrome/browser/ui/cocoa/encoding_menu_controller_delegate_mac.h"
66 #include "chrome/browser/ui/cocoa/handoff_active_url_observer_bridge.h" 65 #include "chrome/browser/ui/cocoa/handoff_active_url_observer_bridge.h"
67 #import "chrome/browser/ui/cocoa/history_menu_bridge.h" 66 #import "chrome/browser/ui/cocoa/history_menu_bridge.h"
68 #include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" 67 #include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h"
69 #import "chrome/browser/ui/cocoa/profiles/profile_menu_controller.h" 68 #import "chrome/browser/ui/cocoa/profiles/profile_menu_controller.h"
70 #import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
71 #import "chrome/browser/ui/cocoa/tabs/tab_window_controller.h"
72 #include "chrome/browser/ui/cocoa/task_manager_mac.h"
73 #include "chrome/browser/ui/extensions/application_launch.h" 69 #include "chrome/browser/ui/extensions/application_launch.h"
74 #include "chrome/browser/ui/host_desktop.h" 70 #include "chrome/browser/ui/host_desktop.h"
75 #include "chrome/browser/ui/startup/startup_browser_creator.h" 71 #include "chrome/browser/ui/startup/startup_browser_creator.h"
76 #include "chrome/browser/ui/startup/startup_browser_creator_impl.h" 72 #include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
73 #include "chrome/browser/ui/tabs/tab_strip_model.h"
77 #include "chrome/browser/ui/user_manager.h" 74 #include "chrome/browser/ui/user_manager.h"
78 #include "chrome/browser/web_applications/web_app_mac.h" 75 #include "chrome/browser/web_applications/web_app_mac.h"
79 #include "chrome/common/chrome_paths_internal.h" 76 #include "chrome/common/chrome_paths_internal.h"
80 #include "chrome/common/chrome_switches.h" 77 #include "chrome/common/chrome_switches.h"
81 #include "chrome/common/cloud_print/cloud_print_class_mac.h" 78 #include "chrome/common/cloud_print/cloud_print_class_mac.h"
82 #include "chrome/common/extensions/extension_constants.h" 79 #include "chrome/common/extensions/extension_constants.h"
83 #include "chrome/common/mac/app_mode_common.h" 80 #include "chrome/common/mac/app_mode_common.h"
84 #include "chrome/common/pref_names.h" 81 #include "chrome/common/pref_names.h"
85 #include "chrome/common/url_constants.h" 82 #include "chrome/common/url_constants.h"
86 #include "chrome/grit/chromium_strings.h" 83 #include "chrome/grit/chromium_strings.h"
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 296
300 AppController* app_controller_; // Weak; owns us. 297 AppController* app_controller_; // Weak; owns us.
301 298
302 DISALLOW_COPY_AND_ASSIGN(AppControllerProfileObserver); 299 DISALLOW_COPY_AND_ASSIGN(AppControllerProfileObserver);
303 }; 300 };
304 301
305 @implementation AppController 302 @implementation AppController
306 303
307 @synthesize startupComplete = startupComplete_; 304 @synthesize startupComplete = startupComplete_;
308 305
306 + (void)updateSigninItem:(id)signinItem
307 shouldShow:(BOOL)showSigninMenuItem
308 currentProfile:(Profile*)profile {
309 DCHECK([signinItem isKindOfClass:[NSMenuItem class]]);
310 NSMenuItem* signinMenuItem = static_cast<NSMenuItem*>(signinItem);
Robert Sesek 2015/04/01 15:17:45 nit: can use base::mac::ObjCCastStrict<>.
311
312 // Look for a separator immediately after the menu item so it can be hidden
313 // or shown appropriately along with the signin menu item.
314 NSMenuItem* followingSeparator = nil;
315 NSMenu* menu = [signinItem menu];
316 if (menu) {
317 NSInteger signinItemIndex = [menu indexOfItem:signinMenuItem];
318 DCHECK_NE(signinItemIndex, -1);
319 if ((signinItemIndex + 1) < [menu numberOfItems]) {
320 NSMenuItem* menuItem = [menu itemAtIndex:(signinItemIndex + 1)];
321 if ([menuItem isSeparatorItem]) {
322 followingSeparator = menuItem;
323 }
324 }
325 }
326
327 base::string16 label = signin_ui_util::GetSigninMenuLabel(profile);
328 [signinMenuItem setTitle:l10n_util::FixUpWindowsStyleLabel(label)];
329 [signinMenuItem setHidden:!showSigninMenuItem];
330 [followingSeparator setHidden:!showSigninMenuItem];
331 }
332
309 - (void)dealloc { 333 - (void)dealloc {
310 [[closeTabMenuItem_ menu] setDelegate:nil]; 334 [[closeTabMenuItem_ menu] setDelegate:nil];
311 [super dealloc]; 335 [super dealloc];
312 } 336 }
313 337
314 // This method is called very early in application startup (ie, before 338 // This method is called very early in application startup (ie, before
315 // the profile is loaded or any preferences have been registered). Defer any 339 // the profile is loaded or any preferences have been registered). Defer any
316 // user-data initialization until -applicationDidFinishLaunching:. 340 // user-data initialization until -applicationDidFinishLaunching:.
317 - (void)awakeFromNib { 341 - (void)awakeFromNib {
318 MacStartupProfiler::GetInstance()->Profile( 342 MacStartupProfiler::GetInstance()->Profile(
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 // close the popover so map it to "Close Window". 575 // close the popover so map it to "Close Window".
552 // Otherwise, map Cmd-W to "Close Tab" if it's a browser window. 576 // Otherwise, map Cmd-W to "Close Tab" if it's a browser window.
553 if ([target isKindOfClass:[NSWindow class]]) { 577 if ([target isKindOfClass:[NSWindow class]]) {
554 NSWindow* window = target; 578 NSWindow* window = target;
555 NSWindow* mainWindow = [NSApp mainWindow]; 579 NSWindow* mainWindow = [NSApp mainWindow];
556 if (!window || ([window parentWindow] == mainWindow)) { 580 if (!window || ([window parentWindow] == mainWindow)) {
557 // If the target window is a child of the main window (e.g. a bubble), the 581 // If the target window is a child of the main window (e.g. a bubble), the
558 // main window should be the one that handles the close menu item action. 582 // main window should be the one that handles the close menu item action.
559 window = mainWindow; 583 window = mainWindow;
560 } 584 }
561 enableCloseTabShortcut = 585 Browser* browser = chrome::FindBrowserWithWindow(window);
562 [[window windowController] isKindOfClass:[TabWindowController class]]; 586 enableCloseTabShortcut = browser && browser->is_type_tabbed();
563 } 587 }
564 588
565 [self adjustCloseWindowMenuItemKeyEquivalent:enableCloseTabShortcut]; 589 [self adjustCloseWindowMenuItemKeyEquivalent:enableCloseTabShortcut];
566 [self adjustCloseTabMenuItemKeyEquivalent:enableCloseTabShortcut]; 590 [self adjustCloseTabMenuItemKeyEquivalent:enableCloseTabShortcut];
567 } 591 }
568 592
569 - (void)windowDidResignKey:(NSNotification*)notify { 593 - (void)windowDidResignKey:(NSNotification*)notify {
570 // If a window is closed, this notification is fired but |[NSApp keyWindow]| 594 // If a window is closed, this notification is fired but |[NSApp keyWindow]|
571 // returns nil regardless of whether any suitable candidates for the key 595 // returns nil regardless of whether any suitable candidates for the key
572 // window remain. It seems that the new key window for the app is not set 596 // window remain. It seems that the new key window for the app is not set
573 // until after this notification is fired, so a check is performed after the 597 // until after this notification is fired, so a check is performed after the
574 // run loop is allowed to spin. 598 // run loop is allowed to spin.
575 [self performSelector:@selector(checkForAnyKeyWindows) 599 [self performSelector:@selector(checkForAnyKeyWindows)
576 withObject:nil 600 withObject:nil
577 afterDelay:0.0]; 601 afterDelay:0.0];
578 } 602 }
579 603
580 - (void)windowDidBecomeMain:(NSNotification*)notify { 604 - (void)windowDidBecomeMain:(NSNotification*)notify {
581 // If the window changed to a new BrowserWindowController, update the profile. 605 Browser* browser = chrome::FindBrowserWithWindow([notify object]);
582 id windowController = [[notify object] windowController]; 606 if (browser)
583 if (![windowController isKindOfClass:[BrowserWindowController class]]) 607 [self windowChangedToProfile:browser->profile()->GetOriginalProfile()];
584 return;
585
586 // If the profile is incognito, use the original profile.
587 Profile* newProfile = [windowController profile]->GetOriginalProfile();
588 [self windowChangedToProfile:newProfile];
589 } 608 }
590 609
591 - (void)windowDidResignMain:(NSNotification*)notify { 610 - (void)windowDidResignMain:(NSNotification*)notify {
592 if (chrome::GetTotalBrowserCount() == 0) { 611 if (chrome::GetTotalBrowserCount() == 0) {
593 [self windowChangedToProfile: 612 [self windowChangedToProfile:
594 g_browser_process->profile_manager()->GetLastUsedProfile()]; 613 g_browser_process->profile_manager()->GetLastUsedProfile()];
595 } 614 }
596 } 615 }
597 616
598 - (void)activeSpaceDidChange:(NSNotification*)notify { 617 - (void)activeSpaceDidChange:(NSNotification*)notify {
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
943 // TODO(akalin,viettrungluu): Figure out whether this method 962 // TODO(akalin,viettrungluu): Figure out whether this method
944 // can be prevented from being called if lastProfile is 963 // can be prevented from being called if lastProfile is
945 // NULL. 964 // NULL.
946 if (!lastProfile) { 965 if (!lastProfile) {
947 LOG(WARNING) 966 LOG(WARNING)
948 << "NULL lastProfile detected -- not doing anything"; 967 << "NULL lastProfile detected -- not doing anything";
949 break; 968 break;
950 } 969 }
951 SigninManager* signin = SigninManagerFactory::GetForProfile( 970 SigninManager* signin = SigninManagerFactory::GetForProfile(
952 lastProfile->GetOriginalProfile()); 971 lastProfile->GetOriginalProfile());
953 enable = signin->IsSigninAllowed() && 972 enable = signin->IsSigninAllowed() && ![self keyWindowIsModal];
954 ![self keyWindowIsModal]; 973 [AppController updateSigninItem:item
955 [BrowserWindowController updateSigninItem:item 974 shouldShow:enable
956 shouldShow:enable 975 currentProfile:lastProfile];
957 currentProfile:lastProfile];
958 break; 976 break;
959 } 977 }
960 #if defined(GOOGLE_CHROME_BUILD) 978 #if defined(GOOGLE_CHROME_BUILD)
961 case IDC_FEEDBACK: 979 case IDC_FEEDBACK:
962 enable = NO; 980 enable = NO;
963 break; 981 break;
964 #endif 982 #endif
965 default: 983 default:
966 enable = menuState_->IsCommandEnabled(tag) ? 984 enable = menuState_->IsCommandEnabled(tag) ?
967 ![self keyWindowIsModal] : NO; 985 ![self keyWindowIsModal] : NO;
(...skipping 26 matching lines...) Expand all
994 // check, otherwise it should have been disabled in the UI in 1012 // check, otherwise it should have been disabled in the UI in
995 // |-validateUserInterfaceItem:|. 1013 // |-validateUserInterfaceItem:|.
996 - (void)commandDispatch:(id)sender { 1014 - (void)commandDispatch:(id)sender {
997 Profile* lastProfile = [self safeLastProfileForNewWindows]; 1015 Profile* lastProfile = [self safeLastProfileForNewWindows];
998 1016
999 // Handle the case where we're dispatching a command from a sender that's in a 1017 // Handle the case where we're dispatching a command from a sender that's in a
1000 // browser window. This means that the command came from a background window 1018 // browser window. This means that the command came from a background window
1001 // and is getting here because the foreground window is not a browser window. 1019 // and is getting here because the foreground window is not a browser window.
1002 if ([sender respondsToSelector:@selector(window)]) { 1020 if ([sender respondsToSelector:@selector(window)]) {
1003 id delegate = [[sender window] windowController]; 1021 id delegate = [[sender window] windowController];
1004 if ([delegate isKindOfClass:[BrowserWindowController class]]) { 1022 if ([delegate respondsToSelector:@selector(commandDispatch:)]) {
1005 [delegate commandDispatch:sender]; 1023 [delegate commandDispatch:sender];
1006 return; 1024 return;
1007 } 1025 }
1008 } 1026 }
1009 1027
1010 // Ignore commands during session restore's browser creation. It uses a 1028 // Ignore commands during session restore's browser creation. It uses a
1011 // nested message loop and commands dispatched during this operation cause 1029 // nested message loop and commands dispatched during this operation cause
1012 // havoc. 1030 // havoc.
1013 if (SessionRestore::IsRestoring(lastProfile) && 1031 if (SessionRestore::IsRestoring(lastProfile) &&
1014 base::MessageLoop::current()->IsNested()) 1032 base::MessageLoop::current()->IsNested())
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 1156
1139 // Same as |-commandDispatch:|, but executes commands using a disposition 1157 // Same as |-commandDispatch:|, but executes commands using a disposition
1140 // determined by the key flags. This will get called in the case where the 1158 // determined by the key flags. This will get called in the case where the
1141 // frontmost window is not a browser window, and the user has command-clicked 1159 // frontmost window is not a browser window, and the user has command-clicked
1142 // a button in a background browser window whose action is 1160 // a button in a background browser window whose action is
1143 // |-commandDispatchUsingKeyModifiers:| 1161 // |-commandDispatchUsingKeyModifiers:|
1144 - (void)commandDispatchUsingKeyModifiers:(id)sender { 1162 - (void)commandDispatchUsingKeyModifiers:(id)sender {
1145 DCHECK(sender); 1163 DCHECK(sender);
1146 if ([sender respondsToSelector:@selector(window)]) { 1164 if ([sender respondsToSelector:@selector(window)]) {
1147 id delegate = [[sender window] windowController]; 1165 id delegate = [[sender window] windowController];
1148 if ([delegate isKindOfClass:[BrowserWindowController class]]) { 1166 if ([delegate respondsToSelector:
1167 @selector(commandDispatchUsingKeyModifiers:)]) {
1149 [delegate commandDispatchUsingKeyModifiers:sender]; 1168 [delegate commandDispatchUsingKeyModifiers:sender];
1150 } 1169 }
1151 } 1170 }
1152 } 1171 }
1153 1172
1154 // NSApplication delegate method called when someone clicks on the dock icon. 1173 // NSApplication delegate method called when someone clicks on the dock icon.
1155 // To match standard mac behavior, we should open a new window if there are no 1174 // To match standard mac behavior, we should open a new window if there are no
1156 // browser windows. 1175 // browser windows.
1157 - (BOOL)applicationShouldHandleReopen:(NSApplication*)theApplication 1176 - (BOOL)applicationShouldHandleReopen:(NSApplication*)theApplication
1158 hasVisibleWindows:(BOOL)hasVisibleWindows { 1177 hasVisibleWindows:(BOOL)hasVisibleWindows {
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
1311 } 1330 }
1312 1331
1313 - (void)registerServicesMenuTypesTo:(NSApplication*)app { 1332 - (void)registerServicesMenuTypesTo:(NSApplication*)app {
1314 // Note that RenderWidgetHostViewCocoa implements NSServicesRequests which 1333 // Note that RenderWidgetHostViewCocoa implements NSServicesRequests which
1315 // handles requests from services. 1334 // handles requests from services.
1316 NSArray* types = [NSArray arrayWithObjects:NSStringPboardType, nil]; 1335 NSArray* types = [NSArray arrayWithObjects:NSStringPboardType, nil];
1317 [app registerServicesMenuSendTypes:types returnTypes:types]; 1336 [app registerServicesMenuSendTypes:types returnTypes:types];
1318 } 1337 }
1319 1338
1320 - (Profile*)lastProfile { 1339 - (Profile*)lastProfile {
1321 // Return the profile of the last-used BrowserWindowController, if available. 1340 // Return the profile of the last-used Browser, if available.
1322 if (lastProfile_) 1341 if (lastProfile_)
1323 return lastProfile_; 1342 return lastProfile_;
1324 1343
1325 // On first launch, use the logic that ChromeBrowserMain uses to determine 1344 // On first launch, use the logic that ChromeBrowserMain uses to determine
1326 // the initial profile. 1345 // the initial profile.
1327 ProfileManager* profile_manager = g_browser_process->profile_manager(); 1346 ProfileManager* profile_manager = g_browser_process->profile_manager();
1328 if (!profile_manager) 1347 if (!profile_manager)
1329 return NULL; 1348 return NULL;
1330 1349
1331 return profile_manager->GetProfile( 1350 return profile_manager->GetProfile(
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
1684 1703
1685 //--------------------------------------------------------------------------- 1704 //---------------------------------------------------------------------------
1686 1705
1687 namespace app_controller_mac { 1706 namespace app_controller_mac {
1688 1707
1689 bool IsOpeningNewWindow() { 1708 bool IsOpeningNewWindow() {
1690 return g_is_opening_new_window; 1709 return g_is_opening_new_window;
1691 } 1710 }
1692 1711
1693 } // namespace app_controller_mac 1712 } // namespace app_controller_mac
OLDNEW
« no previous file with comments | « chrome/browser/app_controller_mac.h ('k') | chrome/browser/ui/cocoa/browser_window_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698