Index: chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm |
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm |
index 197680667bdea8348b77082c9b71668968a77908..91e0229489472c7cc70eb43dd2e3fb5e77708a7f 100644 |
--- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm |
+++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm |
@@ -7,6 +7,7 @@ |
#import <Cocoa/Cocoa.h> |
#include "apps/app_window_registry.h" |
+#include "base/mac/mac_util.h" |
#include "chrome/browser/apps/app_browsertest_util.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/extensions/application_launch.h" |
@@ -107,3 +108,120 @@ IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, HideShowWithApp) { |
EXPECT_TRUE([ns_window isVisible]); |
EXPECT_FALSE([other_ns_window isVisible]); |
} |
+ |
+// Only test fullscreen for 10.7 and above. |
+// Replicate specific 10.7 SDK declarations for building with prior SDKs. |
+#if !defined(MAC_OS_X_VERSION_10_7) || \ |
+ MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 |
+ |
+@interface NSWindow (LionSDKDeclarations) |
+- (void)toggleFullScreen:(id)sender; |
+@end |
+ |
+enum { |
+ NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7, |
+ NSFullScreenWindowMask = 1 << 14 |
+}; |
+ |
+NSString* const NSWindowDidEnterFullScreenNotification = |
+ @"NSWindowDidEnterFullScreenNotification"; |
+NSString* const NSWindowDidExitFullScreenNotification = |
+ @"NSWindowDidExitFullScreenNotification"; |
+ |
+#endif // MAC_OS_X_VERSION_10_7 |
+ |
+@interface ScopedNotificationWatcher : NSObject { |
+ @private |
+ BOOL received_; |
+} |
+- (id)initWithNotification:(NSString*)notification |
+ andObject:(NSObject*)object; |
+- (void)onNotification:(NSString*)notification; |
+- (void)waitForNotification; |
+@end |
+ |
+@implementation ScopedNotificationWatcher |
+ |
+- (id)initWithNotification:(NSString*)notification |
+ andObject:(NSObject*)object { |
+ if ((self = [super init])) { |
+ [[NSNotificationCenter defaultCenter] |
+ addObserver:self |
+ selector:@selector(onNotification:) |
+ name:notification |
+ object:object]; |
+ } |
+ return self; |
+} |
+ |
+- (void)onNotification:(NSString*)notification { |
+ received_ = YES; |
+ [[NSNotificationCenter defaultCenter] removeObserver:self]; |
+} |
+ |
+- (void)waitForNotification { |
+ while (!received_) |
+ content::RunAllPendingInMessageLoop(); |
+} |
+ |
+@end |
+ |
+// Test that NativeAppWindow and AppWindow fullscreen state is updated when |
+// the window is fullscreened natively. |
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Fullscreen) { |
+ if (!base::mac::IsOSLionOrLater()) |
+ return; |
+ |
+ SetUpAppWithWindows(1); |
+ apps::AppWindow* app_window = GetFirstAppWindow(); |
+ apps::NativeAppWindow* window = app_window->GetBaseWindow(); |
+ NSWindow* ns_window = app_window->GetNativeWindow(); |
+ base::scoped_nsobject<ScopedNotificationWatcher> watcher; |
+ |
+ EXPECT_EQ(apps::AppWindow::FULLSCREEN_TYPE_NONE, |
+ app_window->fullscreen_types_for_test()); |
+ EXPECT_FALSE(window->IsFullscreen()); |
+ EXPECT_FALSE([ns_window styleMask] & NSFullScreenWindowMask); |
+ |
+ watcher.reset([[ScopedNotificationWatcher alloc] |
+ initWithNotification:NSWindowDidEnterFullScreenNotification |
+ andObject:ns_window]); |
+ [ns_window toggleFullScreen:nil]; |
+ [watcher waitForNotification]; |
+ EXPECT_TRUE(app_window->fullscreen_types_for_test() & |
+ apps::AppWindow::FULLSCREEN_TYPE_OS); |
+ EXPECT_TRUE(window->IsFullscreen()); |
+ EXPECT_TRUE([ns_window styleMask] & NSFullScreenWindowMask); |
+ |
+ watcher.reset([[ScopedNotificationWatcher alloc] |
+ initWithNotification:NSWindowDidExitFullScreenNotification |
+ andObject:ns_window]); |
+ app_window->Restore(); |
+ EXPECT_FALSE(window->IsFullscreenOrPending()); |
+ [watcher waitForNotification]; |
+ EXPECT_EQ(apps::AppWindow::FULLSCREEN_TYPE_NONE, |
+ app_window->fullscreen_types_for_test()); |
+ EXPECT_FALSE(window->IsFullscreen()); |
+ EXPECT_FALSE([ns_window styleMask] & NSFullScreenWindowMask); |
+ |
+ watcher.reset([[ScopedNotificationWatcher alloc] |
+ initWithNotification:NSWindowDidEnterFullScreenNotification |
+ andObject:ns_window]); |
+ app_window->Fullscreen(); |
+ EXPECT_TRUE(window->IsFullscreenOrPending()); |
+ [watcher waitForNotification]; |
+ EXPECT_TRUE(app_window->fullscreen_types_for_test() & |
+ apps::AppWindow::FULLSCREEN_TYPE_WINDOW_API); |
+ EXPECT_TRUE(window->IsFullscreen()); |
+ EXPECT_TRUE([ns_window styleMask] & NSFullScreenWindowMask); |
+ |
+ watcher.reset([[ScopedNotificationWatcher alloc] |
+ initWithNotification:NSWindowDidExitFullScreenNotification |
+ andObject:ns_window]); |
+ [ns_window toggleFullScreen:nil]; |
+ [watcher waitForNotification]; |
+ EXPECT_EQ(apps::AppWindow::FULLSCREEN_TYPE_NONE, |
+ app_window->fullscreen_types_for_test()); |
+ EXPECT_FALSE(window->IsFullscreen()); |
+ EXPECT_FALSE([ns_window styleMask] & NSFullScreenWindowMask); |
+} |