Chromium Code Reviews| Index: chrome/browser/ui/cocoa/browser_window_controller.mm |
| diff --git a/chrome/browser/ui/cocoa/browser_window_controller.mm b/chrome/browser/ui/cocoa/browser_window_controller.mm |
| index b2103789057b29653bce2c19ec402e8a00953ace..f1a45df8904c1efda439b4df4cc6d2a4f9272426 100644 |
| --- a/chrome/browser/ui/cocoa/browser_window_controller.mm |
| +++ b/chrome/browser/ui/cocoa/browser_window_controller.mm |
| @@ -15,7 +15,6 @@ |
| #include "base/strings/sys_string_conversions.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/app/chrome_command_ids.h" // IDC_* |
| -#import "chrome/browser/app_controller_mac.h" |
| #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
| #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" |
| #include "chrome/browser/browser_process.h" |
| @@ -31,7 +30,6 @@ |
| #include "chrome/browser/themes/theme_service_factory.h" |
| #include "chrome/browser/translate/chrome_translate_client.h" |
| #include "chrome/browser/ui/bookmarks/bookmark_editor.h" |
| -#include "chrome/browser/ui/bookmarks/bookmark_utils.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_command_controller.h" |
| #include "chrome/browser/ui/browser_commands.h" |
| @@ -44,6 +42,7 @@ |
| #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_observer_cocoa.h" |
| #import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h" |
| #import "chrome/browser/ui/cocoa/browser_window_cocoa.h" |
| +#import "chrome/browser/ui/cocoa/browser_window_command_handler.h" |
| #import "chrome/browser/ui/cocoa/browser_window_controller_private.h" |
| #import "chrome/browser/ui/cocoa/browser_window_layout.h" |
| #import "chrome/browser/ui/cocoa/browser_window_utils.h" |
| @@ -75,7 +74,6 @@ |
| #include "chrome/browser/ui/location_bar/location_bar.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model_delegate.h" |
| -#include "chrome/browser/ui/toolbar/encoding_menu_controller.h" |
| #include "chrome/browser/ui/translate/translate_bubble_model_impl.h" |
| #include "chrome/browser/ui/website_settings/permission_bubble_manager.h" |
| #include "chrome/browser/ui/window_sizer/window_sizer.h" |
| @@ -228,6 +226,11 @@ using content::WebContents; |
| browser_.reset(browser); |
| ownsBrowser_ = ownIt; |
| NSWindow* window = [self window]; |
| + // Make the window handle browser window commands. |
| + commandHandler_.reset([[BrowserWindowCommandHandler alloc] init]); |
| + [base::mac::ObjCCastStrict<ChromeEventProcessingWindow>(window) |
| + setCommandHandler:commandHandler_]; |
|
tapted
2015/09/04 02:56:24
So, I'm currently thinking something like
[[windo
jackhou1
2015/09/04 06:13:59
Made CommandDispatchingWindow retain this, so Brow
|
| + |
| // Make the content view for the window have a layer. This will make all |
| // sub-views have layers. This is necessary to ensure correct layer |
| // ordering of all child views and their layers. |
| @@ -1063,211 +1066,6 @@ using content::WebContents; |
| } |
| } |
| -// Update a toggle state for an NSMenuItem if modified. |
| -// Take care to ensure |item| looks like a NSMenuItem. |
| -// Called by validateUserInterfaceItem:. |
| -- (void)updateToggleStateWithTag:(NSInteger)tag forItem:(id)item { |
| - if (![item respondsToSelector:@selector(state)] || |
| - ![item respondsToSelector:@selector(setState:)]) |
| - return; |
| - |
| - // On Windows this logic happens in bookmark_bar_view.cc. On the |
| - // Mac we're a lot more MVC happy so we've moved it into a |
| - // controller. To be clear, this simply updates the menu item; it |
| - // does not display the bookmark bar itself. |
| - if (tag == IDC_SHOW_BOOKMARK_BAR) { |
| - bool toggled = windowShim_->IsBookmarkBarVisible(); |
| - NSInteger oldState = [(NSMenuItem*)item state]; |
| - NSInteger newState = toggled ? NSOnState : NSOffState; |
| - if (oldState != newState) |
| - [item setState:newState]; |
| - } |
| - |
| - // Update the checked/Unchecked state of items in the encoding menu. |
| - // On Windows, this logic is part of |EncodingMenuModel| in |
| - // browser/ui/views/toolbar_view.h. |
| - EncodingMenuController encoding_controller; |
| - if (encoding_controller.DoesCommandBelongToEncodingMenu(tag)) { |
| - DCHECK(browser_.get()); |
| - Profile* profile = browser_->profile(); |
| - DCHECK(profile); |
| - WebContents* current_tab = |
| - browser_->tab_strip_model()->GetActiveWebContents(); |
| - if (!current_tab) |
| - return; |
| - |
| - const std::string encoding = current_tab->GetEncoding(); |
| - |
| - bool toggled = encoding_controller.IsItemChecked(profile, encoding, tag); |
| - NSInteger oldState = [(NSMenuItem*)item state]; |
| - NSInteger newState = toggled ? NSOnState : NSOffState; |
| - if (oldState != newState) |
| - [item setState:newState]; |
| - } |
| -} |
| - |
| -// Called to validate menu and toolbar items when this window is key. All the |
| -// items we care about have been set with the |-commandDispatch:| or |
| -// |-commandDispatchUsingKeyModifiers:| actions and a target of FirstResponder |
| -// in IB. If it's not one of those, let it continue up the responder chain to be |
| -// handled elsewhere. We pull out the tag as the cross-platform constant to |
| -// differentiate and dispatch the various commands. |
| -// NOTE: we might have to handle state for app-wide menu items, |
| -// although we could cheat and directly ask the app controller if our |
| -// command_updater doesn't support the command. This may or may not be an issue, |
| -// too early to tell. |
| -- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item { |
| - SEL action = [item action]; |
| - BOOL enable = NO; |
| - if (action == @selector(commandDispatch:) || |
| - action == @selector(commandDispatchUsingKeyModifiers:)) { |
| - NSInteger tag = [item tag]; |
| - if (chrome::SupportsCommand(browser_.get(), tag)) { |
| - // Generate return value (enabled state) |
| - enable = chrome::IsCommandEnabled(browser_.get(), tag); |
| - switch (tag) { |
| - case IDC_CLOSE_TAB: |
| - // Disable "close tab" if the receiving window is not tabbed. |
| - // We simply check whether the item has a keyboard shortcut set here; |
| - // app_controller_mac.mm actually determines whether the item should |
| - // be enabled. |
| - if (NSMenuItem* menuItem = base::mac::ObjCCast<NSMenuItem>(item)) |
| - enable &= !![[menuItem keyEquivalent] length]; |
| - break; |
| - case IDC_FULLSCREEN: { |
| - if (NSMenuItem* menuItem = base::mac::ObjCCast<NSMenuItem>(item)) { |
| - if (chrome::mac::SupportsSystemFullscreen()) { |
| - [menuItem setTitle:[self titleForFullscreenMenuItem]]; |
| - } else { |
| - [menuItem setHidden:YES]; |
| - } |
| - } |
| - break; |
| - } |
| - case IDC_PRESENTATION_MODE: { |
| - if (NSMenuItem* menuItem = base::mac::ObjCCast<NSMenuItem>(item)) { |
| - [menuItem setTitle:[self titleForFullscreenMenuItem]]; |
| - |
| - if (chrome::mac::SupportsSystemFullscreen()) |
| - [menuItem setAlternate:YES]; |
| - } |
| - break; |
| - } |
| - case IDC_SHOW_SIGNIN: { |
| - Profile* original_profile = |
| - browser_->profile()->GetOriginalProfile(); |
| - [AppController updateSigninItem:item |
| - shouldShow:enable |
| - currentProfile:original_profile]; |
| - break; |
| - } |
| - case IDC_BOOKMARK_PAGE: { |
| - // Extensions have the ability to hide the bookmark page menu item. |
| - // This only affects the bookmark page menu item under the main menu. |
| - // The bookmark page menu item under the wrench menu has its |
| - // visibility controlled by WrenchMenuModel. |
| - bool shouldHide = |
| - chrome::ShouldRemoveBookmarkThisPageUI(browser_->profile()); |
| - NSMenuItem* menuItem = base::mac::ObjCCast<NSMenuItem>(item); |
| - [menuItem setHidden:shouldHide]; |
| - break; |
| - } |
| - case IDC_BOOKMARK_ALL_TABS: { |
| - // Extensions have the ability to hide the bookmark all tabs menu |
| - // item. This only affects the bookmark page menu item under the main |
| - // menu. The bookmark page menu item under the wrench menu has its |
| - // visibility controlled by WrenchMenuModel. |
| - bool shouldHide = |
| - chrome::ShouldRemoveBookmarkOpenPagesUI(browser_->profile()); |
| - NSMenuItem* menuItem = base::mac::ObjCCast<NSMenuItem>(item); |
| - [menuItem setHidden:shouldHide]; |
| - break; |
| - } |
| - default: |
| - // Special handling for the contents of the Text Encoding submenu. On |
| - // Mac OS, instead of enabling/disabling the top-level menu item, we |
| - // enable/disable the submenu's contents (per Apple's HIG). |
| - EncodingMenuController encoding_controller; |
| - if (encoding_controller.DoesCommandBelongToEncodingMenu(tag)) { |
| - enable &= chrome::IsCommandEnabled(browser_.get(), |
| - IDC_ENCODING_MENU) ? YES : NO; |
| - } |
| - } |
| - |
| - // If the item is toggleable, find its toggle state and |
| - // try to update it. This is a little awkward, but the alternative is |
| - // to check after a commandDispatch, which seems worse. |
| - [self updateToggleStateWithTag:tag forItem:item]; |
| - } |
| - } |
| - return enable; |
| -} |
| - |
| -// Called when the user picks a menu or toolbar item when this window is key. |
| -// Calls through to the browser object to execute the command. This assumes that |
| -// the command is supported and doesn't check, otherwise it would have been |
| -// disabled in the UI in validateUserInterfaceItem:. |
| -- (void)commandDispatch:(id)sender { |
| - DCHECK(sender); |
| - // Identify the actual BWC to which the command should be dispatched. It might |
| - // belong to a background window, yet this controller gets it because it is |
| - // the foreground window's controller and thus in the responder chain. Some |
| - // senders don't have this problem (for example, menus only operate on the |
| - // foreground window), so this is only an issue for senders that are part of |
| - // windows. |
| - BrowserWindowController* targetController = self; |
| - if ([sender respondsToSelector:@selector(window)]) |
| - targetController = [[sender window] windowController]; |
| - DCHECK([targetController isKindOfClass:[BrowserWindowController class]]); |
| - DCHECK(targetController->browser_.get()); |
| - |
| - // When system fullscreen is available, it supercedes presentation mode. |
| - int tag = [sender tag]; |
| - if (tag == IDC_PRESENTATION_MODE && chrome::mac::SupportsSystemFullscreen()) |
| - tag = IDC_FULLSCREEN; |
| - |
| - chrome::ExecuteCommand(targetController->browser_.get(), tag); |
| -} |
| - |
| -// Same as |-commandDispatch:|, but executes commands using a disposition |
| -// determined by the key flags. If the window is in the background and the |
| -// command key is down, ignore the command key, but process any other modifiers. |
| -- (void)commandDispatchUsingKeyModifiers:(id)sender { |
| - DCHECK(sender); |
| - |
| - if (![sender isEnabled]) { |
| - // This code is reachable e.g. if the user mashes the back button, queuing |
| - // up a bunch of events before the button's enabled state is updated: |
| - // http://crbug.com/63254 |
| - return; |
| - } |
| - |
| - // See comment above for why we do this. |
| - BrowserWindowController* targetController = self; |
| - if ([sender respondsToSelector:@selector(window)]) |
| - targetController = [[sender window] windowController]; |
| - DCHECK([targetController isKindOfClass:[BrowserWindowController class]]); |
| - DCHECK(targetController->browser_.get()); |
| - |
| - NSInteger command = [sender tag]; |
| - NSUInteger modifierFlags = [[NSApp currentEvent] modifierFlags]; |
| - if ((command == IDC_RELOAD) && |
| - (modifierFlags & (NSShiftKeyMask | NSControlKeyMask))) { |
| - command = IDC_RELOAD_IGNORING_CACHE; |
| - // Mask off Shift and Control so they don't affect the disposition below. |
| - modifierFlags &= ~(NSShiftKeyMask | NSControlKeyMask); |
| - } |
| - if (![[sender window] isMainWindow]) { |
| - // Remove the command key from the flags, it means "keep the window in |
| - // the background" in this case. |
| - modifierFlags &= ~NSCommandKeyMask; |
| - } |
| - chrome::ExecuteCommandWithDisposition( |
| - targetController->browser_.get(), command, |
| - ui::WindowOpenDispositionFromNSEventWithFlags( |
| - [NSApp currentEvent], modifierFlags)); |
| -} |
| - |
| - (BOOL)handledByExtensionCommand:(NSEvent*)event |
| priority:(ui::AcceleratorManager::HandlerPriority)priority { |
| return extension_keybinding_registry_->ProcessKeyEvent( |
| @@ -2107,18 +1905,6 @@ willAnimateFromState:(BookmarkBar::State)oldState |
| chrome::ExecuteCommand(browser_.get(), IDC_FULLSCREEN); |
| } |
| -- (NSString*)titleForFullscreenMenuItem { |
| - if (!chrome::mac::SupportsSystemFullscreen()) { |
| - return l10n_util::GetNSString([self inPresentationMode] |
| - ? IDS_EXIT_PRESENTATION_MAC |
| - : IDS_ENTER_PRESENTATION_MAC); |
| - } |
| - |
| - return l10n_util::GetNSString([self isInAppKitFullscreen] |
| - ? IDS_EXIT_FULLSCREEN_MAC |
| - : IDS_ENTER_FULLSCREEN_MAC); |
| -} |
| - |
| - (void)enterBrowserFullscreenWithToolbar:(BOOL)withToolbar { |
| if (!chrome::mac::SupportsSystemFullscreen()) { |
| if (![self isInImmersiveFullscreen]) |