| Index: chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
|
| diff --git a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
|
| index 60890eef76c04be6280395970275505f0e508774..e0960092993c68f73b642a26e2288e69ce8fea60 100644
|
| --- a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
|
| +++ b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
|
| @@ -7,7 +7,9 @@
|
| #import <Cocoa/Cocoa.h>
|
|
|
| #include "base/command_line.h"
|
| -#include "base/mac/scoped_nsobject.h"
|
| +#import "base/mac/foundation_util.h"
|
| +#import "base/mac/scoped_nsobject.h"
|
| +#import "base/mac/scoped_objc_class_swizzler.h"
|
| #include "base/strings/sys_string_conversions.h"
|
| #include "chrome/app/chrome_command_ids.h"
|
| #include "chrome/browser/apps/app_browsertest_util.h"
|
| @@ -24,8 +26,38 @@
|
| #include "extensions/common/extension.h"
|
| #include "extensions/test/extension_test_message_listener.h"
|
|
|
| +// Donates a testing implementation of [NSWindow isMainWindow].
|
| +@interface IsMainWindowDonorForWindow : NSObject
|
| +@end
|
| +
|
| namespace {
|
|
|
| +// Simulates a particular NSWindow to report YES for [NSWindow isMainWindow].
|
| +// This allows test coverage of code relying on window focus changes without
|
| +// resorting to an interactive_ui_test.
|
| +class ScopedFakeWindowMainStatus {
|
| + public:
|
| + ScopedFakeWindowMainStatus(NSWindow* window)
|
| + : swizzler_([NSWindow class],
|
| + [IsMainWindowDonorForWindow class],
|
| + @selector(isMainWindow)) {
|
| + DCHECK(!window_);
|
| + window_ = window;
|
| + }
|
| +
|
| + ~ScopedFakeWindowMainStatus() { window_ = nil; }
|
| +
|
| + static NSWindow* GetMainWindow() { return window_; }
|
| +
|
| + private:
|
| + static NSWindow* window_;
|
| + base::mac::ScopedObjCClassSwizzler swizzler_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ScopedFakeWindowMainStatus);
|
| +};
|
| +
|
| +NSWindow* ScopedFakeWindowMainStatus::window_ = nil;
|
| +
|
| class AppShimMenuControllerBrowserTest
|
| : public extensions::PlatformAppBrowserTest {
|
| protected:
|
| @@ -170,6 +202,31 @@ IN_PROC_BROWSER_TEST_F(AppShimMenuControllerBrowserTest,
|
| CheckNoAppMenus();
|
| }
|
|
|
| +// Test that closing windows without main status do not update the menu.
|
| +IN_PROC_BROWSER_TEST_F(AppShimMenuControllerBrowserTest,
|
| + ClosingBackgroundWindowLeavesMenuBar) {
|
| + // Start with app1 active.
|
| + SetUpApps(PACKAGED_1);
|
| + extensions::AppWindow* app_1_app_window = FirstWindowForApp(app_1_);
|
| + ScopedFakeWindowMainStatus app_1_is_main(app_1_app_window->GetNativeWindow());
|
| +
|
| + [[NSNotificationCenter defaultCenter]
|
| + postNotificationName:NSWindowDidBecomeMainNotification
|
| + object:app_1_app_window->GetNativeWindow()];
|
| + CheckHasAppMenus(app_1_);
|
| +
|
| + // Closing a background window without focusing it should not change menus.
|
| + BrowserWindow* chrome_window = chrome::BrowserIterator()->window();
|
| + chrome_window->Close();
|
| + [[NSNotificationCenter defaultCenter]
|
| + postNotificationName:NSWindowWillCloseNotification
|
| + object:chrome_window->GetNativeWindow()];
|
| + CheckHasAppMenus(app_1_);
|
| +
|
| + app_1_app_window->GetBaseWindow()->Close();
|
| + CheckNoAppMenus();
|
| +}
|
| +
|
| // Test to check that hosted apps have "Find" and "Paste and Match Style" menu
|
| // items under the "Edit" menu.
|
| IN_PROC_BROWSER_TEST_F(AppShimMenuControllerBrowserTest,
|
| @@ -214,9 +271,11 @@ IN_PROC_BROWSER_TEST_F(AppShimMenuControllerBrowserTest,
|
| // windows.
|
| FirstWindowForApp(app_2_)->GetBaseWindow()->Close();
|
| chrome::BrowserIterator()->window()->Close();
|
| + NSWindow* app_1_window = FirstWindowForApp(app_1_)->GetNativeWindow();
|
| [[NSNotificationCenter defaultCenter]
|
| postNotificationName:NSWindowDidBecomeMainNotification
|
| - object:FirstWindowForApp(app_1_)->GetNativeWindow()];
|
| + object:app_1_window];
|
| + ScopedFakeWindowMainStatus app_1_is_main(app_1_window);
|
|
|
| CheckHasAppMenus(app_1_);
|
| ExtensionService::UninstallExtensionHelper(
|
| @@ -227,3 +286,10 @@ IN_PROC_BROWSER_TEST_F(AppShimMenuControllerBrowserTest,
|
| }
|
|
|
| } // namespace
|
| +
|
| +@implementation IsMainWindowDonorForWindow
|
| +- (BOOL)isMainWindow {
|
| + NSWindow* selfAsWindow = base::mac::ObjCCastStrict<NSWindow>(self);
|
| + return selfAsWindow == ScopedFakeWindowMainStatus::GetMainWindow();
|
| +}
|
| +@end
|
|
|