diff options
Diffstat (limited to 'ui/views/cocoa/bridged_native_widget_unittest.mm')
-rw-r--r-- | ui/views/cocoa/bridged_native_widget_unittest.mm | 182 |
1 files changed, 0 insertions, 182 deletions
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm index 41a97f5..f3720d5 100644 --- a/ui/views/cocoa/bridged_native_widget_unittest.mm +++ b/ui/views/cocoa/bridged_native_widget_unittest.mm @@ -11,7 +11,6 @@ #import "base/mac/sdk_forward_declarations.h" #include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" -#include "base/run_loop.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #import "testing/gtest_mac.h" @@ -44,91 +43,6 @@ NSRange EmptyRange() { } // namespace -@interface NativeWidgetMacNotificationWaiter : NSObject { - @private - scoped_ptr<base::RunLoop> runLoop_; - base::scoped_nsobject<NSWindow> window_; - int enterCount_; - int exitCount_; - int targetEnterCount_; - int targetExitCount_; -} - -@property(readonly, nonatomic) int enterCount; -@property(readonly, nonatomic) int exitCount; - -// Initialize for the given window and start tracking notifications. -- (id)initWithWindow:(NSWindow*)window; - -// Keep spinning a run loop until the enter and exit counts match. -- (void)waitForEnterCount:(int)enterCount exitCount:(int)exitCount; - -// private: -// Exit the RunLoop if there is one and the counts being tracked match. -- (void)maybeQuitForChangedArg:(int*)changedArg; - -- (void)onEnter:(NSNotification*)notification; -- (void)onExit:(NSNotification*)notification; - -@end - -@implementation NativeWidgetMacNotificationWaiter - -@synthesize enterCount = enterCount_; -@synthesize exitCount = exitCount_; - -- (id)initWithWindow:(NSWindow*)window { - if ((self = [super init])) { - window_.reset([window retain]); - NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter]; - [defaultCenter addObserver:self - selector:@selector(onEnter:) - name:NSWindowDidEnterFullScreenNotification - object:window]; - [defaultCenter addObserver:self - selector:@selector(onExit:) - name:NSWindowDidExitFullScreenNotification - object:window]; - } - return self; -} - -- (void)dealloc { - DCHECK(!runLoop_); - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [super dealloc]; -} - -- (void)waitForEnterCount:(int)enterCount exitCount:(int)exitCount { - if (enterCount_ >= enterCount && exitCount_ >= exitCount) - return; - - targetEnterCount_ = enterCount; - targetExitCount_ = exitCount; - runLoop_.reset(new base::RunLoop); - runLoop_->Run(); - runLoop_.reset(); -} - -- (void)maybeQuitForChangedArg:(int*)changedArg { - ++*changedArg; - if (!runLoop_) - return; - - if (enterCount_ >= targetEnterCount_ && exitCount_ >= targetExitCount_) - runLoop_->Quit(); -} - -- (void)onEnter:(NSNotification*)notification { - [self maybeQuitForChangedArg:&enterCount_]; -} - -- (void)onExit:(NSNotification*)notification { - [self maybeQuitForChangedArg:&exitCount_]; -} - -@end - // Class to override -[NSWindow toggleFullScreen:] to a no-op. This simulates // NSWindow's behavior when attempting to toggle fullscreen state again, when // the last attempt failed but Cocoa has not yet sent @@ -508,102 +422,6 @@ TEST_F(BridgedNativeWidgetTest, TextInput_DeleteForward) { EXPECT_EQ_RANGE(NSMakeRange(0, 0), [ns_view_ selectedRange]); } -// Tests for correct fullscreen tracking, regardless of whether it is initiated -// by the Widget code or elsewhere (e.g. by the user). -TEST_F(BridgedNativeWidgetTest, FullscreenSynchronousState) { - EXPECT_FALSE(widget_->IsFullscreen()); - if (base::mac::IsOSSnowLeopard()) - return; - - // Allow user-initiated fullscreen changes on the Window. - [test_window() - setCollectionBehavior:[test_window() collectionBehavior] | - NSWindowCollectionBehaviorFullScreenPrimary]; - - base::scoped_nsobject<NativeWidgetMacNotificationWaiter> waiter( - [[NativeWidgetMacNotificationWaiter alloc] initWithWindow:test_window()]); - const gfx::Rect restored_bounds = widget_->GetRestoredBounds(); - - // Simulate a user-initiated fullscreen. Note trying to to this again before - // spinning a runloop will cause Cocoa to emit text to stdio and ignore it. - [test_window() toggleFullScreen:nil]; - EXPECT_TRUE(widget_->IsFullscreen()); - EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds()); - - // Note there's now an animation running. While that's happening, toggling the - // state should work as expected, but do "nothing". - widget_->SetFullscreen(false); - EXPECT_FALSE(widget_->IsFullscreen()); - EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds()); - widget_->SetFullscreen(false); // Same request - should no-op. - EXPECT_FALSE(widget_->IsFullscreen()); - EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds()); - - widget_->SetFullscreen(true); - EXPECT_TRUE(widget_->IsFullscreen()); - EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds()); - - // Always finish out of fullscreen. Otherwise there are 4 NSWindow objects - // that Cocoa creates which don't close themselves and will be seen by the Mac - // test harness on teardown. Note that the test harness will be waiting until - // all animations complete, since these temporary animation windows will not - // be removed from the window list until they do. - widget_->SetFullscreen(false); - EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds()); - - // Now we must wait for the notifications. Since, if the widget is torn down, - // the NSWindowDelegate is removed, and the pending request to take out of - // fullscreen is lost. Since a message loop has not yet spun up in this test - // we can reliably say there will be one enter and one exit, despite all the - // toggling above. - base::MessageLoopForUI message_loop; - [waiter waitForEnterCount:1 exitCount:1]; - EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds()); -} - -// Test fullscreen without overlapping calls and without changing collection -// behavior on the test window. -TEST_F(BridgedNativeWidgetTest, FullscreenEnterAndExit) { - base::MessageLoopForUI message_loop; - base::scoped_nsobject<NativeWidgetMacNotificationWaiter> waiter( - [[NativeWidgetMacNotificationWaiter alloc] initWithWindow:test_window()]); - - EXPECT_FALSE(widget_->IsFullscreen()); - const gfx::Rect restored_bounds = widget_->GetRestoredBounds(); - EXPECT_FALSE(restored_bounds.IsEmpty()); - - // Ensure this works without having to change collection behavior as for the - // test above. - widget_->SetFullscreen(true); - if (base::mac::IsOSSnowLeopard()) { - // On Snow Leopard, SetFullscreen() isn't implemented. But shouldn't crash. - EXPECT_FALSE(widget_->IsFullscreen()); - return; - } - - EXPECT_TRUE(widget_->IsFullscreen()); - EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds()); - - // Should be zero until the runloop spins. - EXPECT_EQ(0, [waiter enterCount]); - [waiter waitForEnterCount:1 exitCount:0]; - - // Verify it hasn't exceeded. - EXPECT_EQ(1, [waiter enterCount]); - EXPECT_EQ(0, [waiter exitCount]); - EXPECT_TRUE(widget_->IsFullscreen()); - EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds()); - - widget_->SetFullscreen(false); - EXPECT_FALSE(widget_->IsFullscreen()); - EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds()); - - [waiter waitForEnterCount:1 exitCount:1]; - EXPECT_EQ(1, [waiter enterCount]); - EXPECT_EQ(1, [waiter exitCount]); - EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds()); -} - typedef BridgedNativeWidgetTestBase BridgedNativeWidgetSimulateFullscreenTest; // Simulate the notifications that AppKit would send out if a fullscreen |