| Index: chrome/browser/global_keyboard_shortcuts_mac.mm
 | 
| diff --git a/chrome/browser/global_keyboard_shortcuts_mac.mm b/chrome/browser/global_keyboard_shortcuts_mac.mm
 | 
| index a4ee31eba96bfcaa44d2e2138a55f8709f7c052d..93272139d42aebc6967417d6944133e01fddb701 100644
 | 
| --- a/chrome/browser/global_keyboard_shortcuts_mac.mm
 | 
| +++ b/chrome/browser/global_keyboard_shortcuts_mac.mm
 | 
| @@ -2,7 +2,7 @@
 | 
|  // Use of this source code is governed by a BSD-style license that can be
 | 
|  // found in the LICENSE file.
 | 
|  
 | 
| -#include <AppKit/NSEvent.h>
 | 
| +#import <AppKit/AppKit.h>
 | 
|  #include <Carbon/Carbon.h>
 | 
|  
 | 
|  #include "chrome/browser/global_keyboard_shortcuts_mac.h"
 | 
| @@ -10,6 +10,31 @@
 | 
|  #include "base/basictypes.h"
 | 
|  #include "base/logging.h"
 | 
|  #include "chrome/app/chrome_command_ids.h"
 | 
| +#import "chrome/browser/ui/cocoa/nsmenuitem_additions.h"
 | 
| +
 | 
| +namespace {
 | 
| +
 | 
| +// Returns the menu item associated with |key| in |menu|, or nil if not found.
 | 
| +NSMenuItem* FindMenuItem(NSEvent* key, NSMenu* menu) {
 | 
| +  NSMenuItem* result = nil;
 | 
| +
 | 
| +  for (NSMenuItem* item in [menu itemArray]) {
 | 
| +    NSMenu* submenu = [item submenu];
 | 
| +    if (submenu) {
 | 
| +      if (submenu != [NSApp servicesMenu])
 | 
| +        result = FindMenuItem(key, submenu);
 | 
| +    } else if ([item cr_firesForKeyEventIfEnabled:key]) {
 | 
| +      result = item;
 | 
| +    }
 | 
| +
 | 
| +    if (result)
 | 
| +      break;
 | 
| +  }
 | 
| +
 | 
| +  return result;
 | 
| +}
 | 
| +
 | 
| +}  // namespace
 | 
|  
 | 
|  // Basically, there are two kinds of keyboard shortcuts: Ones that should work
 | 
|  // only if the tab contents is focused (BrowserKeyboardShortcut), and ones that
 | 
| @@ -169,6 +194,48 @@ int CommandForBrowserKeyboardShortcut(
 | 
|                                      key_char);
 | 
|  }
 | 
|  
 | 
| +int CommandForKeyEvent(NSEvent* event) {
 | 
| +  if ([event type] != NSKeyDown)
 | 
| +    return -1;
 | 
| +
 | 
| +  // Look in menu.
 | 
| +  NSMenuItem* item = FindMenuItem(event, [NSApp mainMenu]);
 | 
| +  if (item && [item action] == @selector(commandDispatch:) && [item tag] > 0)
 | 
| +    return [item tag];
 | 
| +
 | 
| +  // "Close window" doesn't use the |commandDispatch:| mechanism. Menu items
 | 
| +  // that do not correspond to IDC_ constants need no special treatment however,
 | 
| +  // as they can't be blacklisted in
 | 
| +  // |BrowserCommandController::IsReservedCommandOrKey()| anyhow.
 | 
| +  if (item && [item action] == @selector(performClose:))
 | 
| +    return IDC_CLOSE_WINDOW;
 | 
| +
 | 
| +  // "Exit" doesn't use the |commandDispatch:| mechanism either.
 | 
| +  if (item && [item action] == @selector(terminate:))
 | 
| +    return IDC_EXIT;
 | 
| +
 | 
| +  // Look in secondary keyboard shortcuts.
 | 
| +  NSUInteger modifiers = [event modifierFlags];
 | 
| +  const bool cmdKey = (modifiers & NSCommandKeyMask) != 0;
 | 
| +  const bool shiftKey = (modifiers & NSShiftKeyMask) != 0;
 | 
| +  const bool cntrlKey = (modifiers & NSControlKeyMask) != 0;
 | 
| +  const bool optKey = (modifiers & NSAlternateKeyMask) != 0;
 | 
| +  const int keyCode = [event keyCode];
 | 
| +  const unichar keyChar = KeyCharacterForEvent(event);
 | 
| +
 | 
| +  int cmdNum = CommandForWindowKeyboardShortcut(
 | 
| +      cmdKey, shiftKey, cntrlKey, optKey, keyCode, keyChar);
 | 
| +  if (cmdNum != -1)
 | 
| +    return cmdNum;
 | 
| +
 | 
| +  cmdNum = CommandForBrowserKeyboardShortcut(
 | 
| +      cmdKey, shiftKey, cntrlKey, optKey, keyCode, keyChar);
 | 
| +  if (cmdNum != -1)
 | 
| +    return cmdNum;
 | 
| +
 | 
| +  return -1;
 | 
| +}
 | 
| +
 | 
|  unichar KeyCharacterForEvent(NSEvent* event) {
 | 
|    NSString* eventString = [event charactersIgnoringModifiers];
 | 
|    NSString* characters = [event characters];
 | 
| 
 |