| Index: chrome/browser/app_controller_mac.mm
|
| diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
|
| index 6a4f146417b713cfb25b6bd16cad6f653bf20356..bd486579d1a270911a44ed8594711038e09b0d52 100644
|
| --- a/chrome/browser/app_controller_mac.mm
|
| +++ b/chrome/browser/app_controller_mac.mm
|
| @@ -352,30 +352,6 @@ const AEEventClass kAECloudPrintUninstallClass = 'GCPu';
|
| }
|
| }
|
|
|
| -// Helper routine to get the window controller if the key window is a tabbed
|
| -// window, or nil if not. Examples of non-tabbed windows are "about" or
|
| -// "preferences".
|
| -- (TabWindowController*)keyWindowTabController {
|
| - NSWindowController* keyWindowController =
|
| - [[NSApp keyWindow] windowController];
|
| - if ([keyWindowController isKindOfClass:[TabWindowController class]])
|
| - return (TabWindowController*)keyWindowController;
|
| -
|
| - return nil;
|
| -}
|
| -
|
| -// Helper routine to get the window controller if the main window is a tabbed
|
| -// window, or nil if not. Examples of non-tabbed windows are "about" or
|
| -// "preferences".
|
| -- (TabWindowController*)mainWindowTabController {
|
| - NSWindowController* mainWindowController =
|
| - [[NSApp mainWindow] windowController];
|
| - if ([mainWindowController isKindOfClass:[TabWindowController class]])
|
| - return (TabWindowController*)mainWindowController;
|
| -
|
| - return nil;
|
| -}
|
| -
|
| // If the window has a tab controller, make "close window" be cmd-shift-w,
|
| // otherwise leave it as the normal cmd-w. Capitalization of the key equivalent
|
| // affects whether the shift modifer is used.
|
| @@ -406,18 +382,25 @@ const AEEventClass kAECloudPrintUninstallClass = 'GCPu';
|
| [closeWindowMenuItem_ setKeyEquivalentModifierMask:0];
|
| }
|
|
|
| -// See if we have a window with tabs open, and adjust the key equivalents for
|
| +// See if the focused window window has tabs, and adjust the key equivalents for
|
| // Close Tab/Close Window accordingly.
|
| -- (void)fixCloseMenuItemKeyEquivalents:(NSWindow*)window {
|
| +- (void)fixCloseMenuItemKeyEquivalents {
|
| fileMenuUpdatePending_ = NO;
|
| - TabWindowController* tabController = [self keyWindowTabController];
|
| - if (!tabController && ![NSApp keyWindow]) {
|
| - // There might be a small amount of time where there is no key window,
|
| - // so just use our main browser window if there is one.
|
| - tabController = [self mainWindowTabController];
|
| +
|
| + NSWindow* window = [NSApp keyWindow];
|
| + NSWindow* mainWindow = [NSApp mainWindow];
|
| + if (!window || ([window parentWindow] == mainWindow)) {
|
| + // If the key window is a child of the main window (e.g. a bubble), the main
|
| + // window should be the one that handles the close menu item action.
|
| + // Also, there might be a small amount of time where there is no key window;
|
| + // in that case as well, just use our main browser window if there is one.
|
| + // You might think that we should just always use the main window, but the
|
| + // "About Chrome" window serves as a counterexample.
|
| + window = mainWindow;
|
| }
|
| - BOOL hasTabs = !!tabController;
|
|
|
| + BOOL hasTabs =
|
| + [[window windowController] isKindOfClass:[TabWindowController class]];
|
| [self adjustCloseWindowMenuItemKeyEquivalent:hasTabs];
|
| [self adjustCloseTabMenuItemKeyEquivalent:hasTabs];
|
| }
|
| @@ -426,7 +409,7 @@ const AEEventClass kAECloudPrintUninstallClass = 'GCPu';
|
| // after a delay to ensure that window layer state has been set by the time
|
| // we do the enabling. This should only be called on the main thread, code that
|
| // calls this (even as a side-effect) from other threads needs to be fixed.
|
| -- (void)delayedFixCloseMenuItemKeyEquivalents:(NSNotification*)notify {
|
| +- (void)delayedFixCloseMenuItemKeyEquivalents {
|
| DCHECK([NSThread isMainThread]);
|
| if (!fileMenuUpdatePending_) {
|
| // The OS prefers keypresses to timers, so it's possible that a cmd-w
|
| @@ -436,8 +419,8 @@ const AEEventClass kAECloudPrintUninstallClass = 'GCPu';
|
| if ([NSThread isMainThread]) {
|
| fileMenuUpdatePending_ = YES;
|
| [self clearCloseMenuItemKeyEquivalents];
|
| - [self performSelector:@selector(fixCloseMenuItemKeyEquivalents:)
|
| - withObject:[notify object]
|
| + [self performSelector:@selector(fixCloseMenuItemKeyEquivalents)
|
| + withObject:nil
|
| afterDelay:0];
|
| } else {
|
| // This shouldn't be happening, but if it does, force it to the main
|
| @@ -446,8 +429,8 @@ const AEEventClass kAECloudPrintUninstallClass = 'GCPu';
|
| // there could be a race between the selector finishing and setting the
|
| // flag.
|
| [self
|
| - performSelectorOnMainThread:@selector(fixCloseMenuItemKeyEquivalents:)
|
| - withObject:[notify object]
|
| + performSelectorOnMainThread:@selector(fixCloseMenuItemKeyEquivalents)
|
| + withObject:nil
|
| waitUntilDone:NO];
|
| }
|
| }
|
| @@ -456,7 +439,7 @@ const AEEventClass kAECloudPrintUninstallClass = 'GCPu';
|
| // Called when we get a notification about the window layering changing to
|
| // update the UI based on the new main window.
|
| - (void)windowLayeringDidChange:(NSNotification*)notify {
|
| - [self delayedFixCloseMenuItemKeyEquivalents:notify];
|
| + [self delayedFixCloseMenuItemKeyEquivalents];
|
|
|
| if ([notify name] == NSWindowDidResignKeyNotification) {
|
| // If a window is closed, this notification is fired but |[NSApp keyWindow]|
|
|
|