Chromium Code Reviews| Index: ui/base/cocoa/command_dispatcher.mm |
| diff --git a/chrome/browser/ui/cocoa/chrome_event_processing_window.mm b/ui/base/cocoa/command_dispatcher.mm |
| similarity index 34% |
| copy from chrome/browser/ui/cocoa/chrome_event_processing_window.mm |
| copy to ui/base/cocoa/command_dispatcher.mm |
| index 4dd2c644a574850fc78ae54c78c0da9b3a7c252b..8d2ed28c2abf98018319b75b8b11bacc3ef32deb 100644 |
| --- a/chrome/browser/ui/cocoa/chrome_event_processing_window.mm |
| +++ b/ui/base/cocoa/command_dispatcher.mm |
| @@ -1,67 +1,13 @@ |
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -#import "chrome/browser/ui/cocoa/chrome_event_processing_window.h" |
| +#import "ui/base/cocoa/command_dispatcher.h" |
| #include "base/logging.h" |
| -#include "chrome/browser/global_keyboard_shortcuts_mac.h" |
| -#include "chrome/browser/ui/browser_commands.h" |
| -#include "chrome/browser/ui/browser_finder.h" |
| -#import "chrome/browser/ui/cocoa/browser_window_controller_private.h" |
| -#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h" |
| -#import "content/public/browser/render_widget_host_view_mac_base.h" |
| namespace { |
| -// Type of functions listed in global_keyboard_shortcuts_mac.h. |
| -typedef int (*KeyToCommandMapper)(bool, bool, bool, bool, int, unichar); |
| - |
| -// If the event is for a Browser window, and the key combination has an |
| -// associated command, execute the command. |
| -bool HandleExtraKeyboardShortcut( |
| - NSEvent* event, |
| - NSWindow* window, |
| - KeyToCommandMapper command_for_keyboard_shortcut) { |
| - // Extract info from |event|. |
| - NSUInteger modifers = [event modifierFlags]; |
| - const bool command = modifers & NSCommandKeyMask; |
| - const bool shift = modifers & NSShiftKeyMask; |
| - const bool control = modifers & NSControlKeyMask; |
| - const bool option = modifers & NSAlternateKeyMask; |
| - const int key_code = [event keyCode]; |
| - const unichar key_char = KeyCharacterForEvent(event); |
| - |
| - int cmd = command_for_keyboard_shortcut(command, shift, control, option, |
| - key_code, key_char); |
| - |
| - if (cmd == -1) |
| - return false; |
| - |
| - // Only handle event if this is a browser window. |
| - Browser* browser = chrome::FindBrowserWithWindow(window); |
| - if (!browser) |
| - return false; |
| - |
| - chrome::ExecuteCommand(browser, cmd); |
| - return true; |
| -} |
| - |
| -bool HandleExtraWindowKeyboardShortcut(NSEvent* event, NSWindow* window) { |
| - return HandleExtraKeyboardShortcut(event, window, |
| - CommandForWindowKeyboardShortcut); |
| -} |
| - |
| -bool HandleDelayedWindowKeyboardShortcut(NSEvent* event, NSWindow* window) { |
| - return HandleExtraKeyboardShortcut(event, window, |
| - CommandForDelayedWindowKeyboardShortcut); |
| -} |
| - |
| -bool HandleExtraBrowserKeyboardShortcut(NSEvent* event, NSWindow* window) { |
| - return HandleExtraKeyboardShortcut(event, window, |
| - CommandForBrowserKeyboardShortcut); |
| -} |
| - |
| // Duplicate the given key event, but changing the associated window. |
| NSEvent* KeyEventForWindow(NSWindow* window, NSEvent* event) { |
| NSEventType event_type = [event type]; |
| @@ -99,72 +45,58 @@ NSEvent* KeyEventForWindow(NSWindow* window, NSEvent* event) { |
| } // namespace |
| -@implementation ChromeEventProcessingWindow |
| +@implementation CommandDispatcher |
| -- (BOOL)handleExtraKeyboardShortcut:(NSEvent*)event { |
| - return HandleExtraBrowserKeyboardShortcut(event, self) || |
| - HandleExtraWindowKeyboardShortcut(event, self) || |
| - HandleDelayedWindowKeyboardShortcut(event, self); |
| +@synthesize delegate = delegate_; |
| + |
| +- (id)initWithOwner:(NSWindow<CommandDispatchingWindow>*)owner { |
| + if ((self = [super init])) { |
| + owner_ = owner; |
| + } |
| + return self; |
| } |
| - (BOOL)performKeyEquivalent:(NSEvent*)event { |
| - // Some extension commands have higher priority than web content, and some |
| - // have lower priority. Regardless of whether the event is being |
| - // redispatched, let the extension system try to handle the event. |
| - NSWindow* window = event.window; |
| - if (window) { |
| - BrowserWindowController* controller = [window windowController]; |
| - if ([controller respondsToSelector:@selector(handledByExtensionCommand: |
| - priority:)]) { |
| - ui::AcceleratorManager::HandlerPriority priority = |
| - redispatchingEvent_ ? ui::AcceleratorManager::kNormalPriority |
| - : ui::AcceleratorManager::kHighPriority; |
| - if ([controller handledByExtensionCommand:event priority:priority]) |
| - return YES; |
| - } |
| - } |
| + if ([delegate_ handledByExtensionCommand:event |
| + isRedispatch:redispatchingEvent_]) |
|
Robert Sesek
2015/08/26 17:46:49
nit: requires braces since multi-line if
jackhou1
2015/08/27 00:01:25
Done.
|
| + return YES; |
| if (redispatchingEvent_) |
| return NO; |
| - // Give the web site a chance to handle the event. If it doesn't want to |
| - // handle it, it will call us back with one of the |handle*| methods above. |
| - NSResponder* r = [self firstResponder]; |
| - if ([r conformsToProtocol:@protocol(RenderWidgetHostViewMacBase)]) |
| + // Give a CommandDispatcherTarget (e.g. a web site) a chance to handle the |
| + // event. If it doesn't want to handle it, it will call us back with one of |
| + // the |handle*| methods above. |
| + NSResponder* r = [owner_ firstResponder]; |
| + if ([r conformsToProtocol:@protocol(CommandDispatcherTarget)]) |
| return [r performKeyEquivalent:event]; |
| - // Handle per-window shortcuts like cmd-1, but do not handle browser-level |
| - // shortcuts like cmd-left (else, cmd-left would do history navigation even |
| - // if e.g. the Omnibox has focus). |
| - if (HandleExtraWindowKeyboardShortcut(event, self)) |
| + if ([delegate_ prePerformKeyEquivalent:event window:owner_]) |
| return YES; |
| - if ([super performKeyEquivalent:event]) |
| + if ([owner_ defaultPerformKeyEquivalent:event]) |
| return YES; |
| - // Handle per-window shortcuts like Esc after giving everybody else a chance |
| - // to handle them |
| - return HandleDelayedWindowKeyboardShortcut(event, self); |
| + return [delegate_ postPerformKeyEquivalent:event window:owner_]; |
| } |
| - (BOOL)redispatchKeyEvent:(NSEvent*)event { |
| DCHECK(event); |
| NSEventType eventType = [event type]; |
| - if (eventType != NSKeyDown && |
| - eventType != NSKeyUp && |
| + if (eventType != NSKeyDown && eventType != NSKeyUp && |
| eventType != NSFlagsChanged) { |
| NOTREACHED(); |
| return YES; // Pretend it's been handled in an effort to limit damage. |
| } |
| - // Ordinarily, the event's window should be this window. However, when |
| - // switching between normal and fullscreen mode, we switch out the window, and |
| - // the event's window might be the previous window (or even an earlier one if |
| - // the renderer is running slowly and several mode switches occur). In this |
| - // rare case, we synthesize a new key event so that its associate window |
| - // (number) is our own. |
| - if ([event window] != self) |
| - event = KeyEventForWindow(self, event); |
| + // Ordinarily, the event's window should be |owner_|. However, when switching |
| + // between normal and fullscreen mode, we switch out the window, and the |
| + // event's window might be the previous window (or even an earlier one if the |
| + // renderer is running slowly and several mode switches occur). In this rare |
| + // case, we synthesize a new key event so that its associate window (number) |
| + // is our |owner_|'s. |
| + if ([event window] != owner_) |
| + event = KeyEventForWindow(owner_, event); |
| // Redispatch the event. |
| eventHandled_ = YES; |
| @@ -178,11 +110,15 @@ NSEvent* KeyEventForWindow(NSWindow* window, NSEvent* event) { |
| return eventHandled_; |
| } |
| -- (void)sendEvent:(NSEvent*)event { |
| - if (!redispatchingEvent_) |
| - [super sendEvent:event]; |
| - else |
| +- (BOOL)preSendEvent:(NSEvent*)event { |
| + if (redispatchingEvent_) { |
| + // If we get here, then the event was not handled by NSApplication. |
| eventHandled_ = NO; |
| + // Return YES to stop native -sendEvent handling. |
| + return YES; |
| + } |
| + |
| + return NO; |
| } |
| -@end // ChromeEventProcessingWindow |
| +@end |