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

Side by Side Diff: chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm

Issue 1040993005: [Mac] A more robust way to ensure panels avoid key status on window close (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: static 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/ui/cocoa/apps/app_shim_menu_controller_mac.h" 5 #import "chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.h"
6 6
7 #include "base/mac/scoped_nsautorelease_pool.h" 7 #include "base/mac/scoped_nsautorelease_pool.h"
8 #include "base/strings/sys_string_conversions.h" 8 #include "base/strings/sys_string_conversions.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/app/chrome_command_ids.h" 10 #include "chrome/app/chrome_command_ids.h"
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 } 366 }
367 367
368 - (void)windowMainStatusChanged:(NSNotification*)notification { 368 - (void)windowMainStatusChanged:(NSNotification*)notification {
369 // A Yosemite AppKit bug causes this notification to be sent during the 369 // A Yosemite AppKit bug causes this notification to be sent during the
370 // -dealloc for a specific NSWindow. Any autoreleases sent to that window 370 // -dealloc for a specific NSWindow. Any autoreleases sent to that window
371 // must be drained before the window finishes -dealloc. In this method, an 371 // must be drained before the window finishes -dealloc. In this method, an
372 // autorelease is sent by the invocation of [NSApp windows]. 372 // autorelease is sent by the invocation of [NSApp windows].
373 // http://crbug.com/406944. 373 // http://crbug.com/406944.
374 base::mac::ScopedNSAutoreleasePool pool; 374 base::mac::ScopedNSAutoreleasePool pool;
375 375
376 id window = [notification object];
377 NSString* name = [notification name]; 376 NSString* name = [notification name];
378 if ([name isEqualToString:NSWindowDidBecomeMainNotification]) { 377 if ([name isEqualToString:NSWindowDidBecomeMainNotification]) {
378 id window = [notification object];
379 extensions::AppWindow* appWindow = 379 extensions::AppWindow* appWindow =
380 AppWindowRegistryUtil::GetAppWindowForNativeWindowAnyProfile( 380 AppWindowRegistryUtil::GetAppWindowForNativeWindowAnyProfile(
381 window); 381 window);
382 382
383 const extensions::Extension* extension = NULL; 383 const extensions::Extension* extension = NULL;
384 // If there is no corresponding AppWindow, this could be a hosted app, so 384 // If there is no corresponding AppWindow, this could be a hosted app, so
385 // check for a browser. 385 // check for a browser.
386 if (appWindow) 386 if (appWindow)
387 extension = appWindow->GetExtension(); 387 extension = appWindow->GetExtension();
388 else 388 else
389 extension = apps::ExtensionAppShimHandler::GetAppForBrowser( 389 extension = apps::ExtensionAppShimHandler::GetAppForBrowser(
390 chrome::FindBrowserWithWindow(window)); 390 chrome::FindBrowserWithWindow(window));
391 391
392 if (extension) 392 if (extension)
393 [self addMenuItems:extension]; 393 [self addMenuItems:extension];
394 else 394 else
395 [self removeMenuItems]; 395 [self removeMenuItems];
396 } else if ([name isEqualToString:NSWindowWillCloseNotification]) { 396 } else if ([name isEqualToString:NSWindowWillCloseNotification]) {
397 // If there are any other windows that can become main, leave the menu. It 397 // Always reset back to the Chrome menu. This once scanned [NSApp windows]
398 // will be changed when another window becomes main. Otherwise, restore the 398 // to predict whether we could expect another Chrome window to become main,
399 // Chrome menu. 399 // and skip the reset. However, panels need to do strange things during
400 for (NSWindow* w : [NSApp windows]) { 400 // window close to ensure panels never get chosen for key status over a
401 if ([w canBecomeMainWindow] && ![w isEqual:window] && [w isOnActiveSpace]) 401 // browser window (which is likely because they are given an elevated
402 return; 402 // [NSWindow level]). Trying to handle this case is not robust.
403 } 403 // Unfortunately, resetting the menu to Chrome unconditionally means that
404 404 // if another packaged app window becomes key, the menu will flicker.
405 // TODO(tapted): Investigate restoring the logic when the panel code is
406 // removed.
405 [self removeMenuItems]; 407 [self removeMenuItems];
406 } else { 408 } else {
407 NOTREACHED(); 409 NOTREACHED();
408 } 410 }
409 } 411 }
410 412
411 - (void)addMenuItems:(const extensions::Extension*)app { 413 - (void)addMenuItems:(const extensions::Extension*)app {
412 NSString* appId = base::SysUTF8ToNSString(app->id()); 414 NSString* appId = base::SysUTF8ToNSString(app->id());
413 NSString* title = base::SysUTF8ToNSString(app->name()); 415 NSString* title = base::SysUTF8ToNSString(app->name());
414 416
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 514
513 - (void)focusCurrentPlatformApp { 515 - (void)focusCurrentPlatformApp {
514 extensions::AppWindow* appWindow = 516 extensions::AppWindow* appWindow =
515 AppWindowRegistryUtil::GetAppWindowForNativeWindowAnyProfile( 517 AppWindowRegistryUtil::GetAppWindowForNativeWindowAnyProfile(
516 [NSApp keyWindow]); 518 [NSApp keyWindow]);
517 if (appWindow) 519 if (appWindow)
518 apps::ExtensionAppShimHandler::FocusAppForWindow(appWindow); 520 apps::ExtensionAppShimHandler::FocusAppForWindow(appWindow);
519 } 521 }
520 522
521 @end 523 @end
OLDNEW
« no previous file with comments | « chrome/browser/chrome_browser_application_mac.mm ('k') | chrome/browser/ui/cocoa/panels/panel_cocoa_browsertest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698