| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/base_bubble_controller.h" | 5 #import "chrome/browser/ui/cocoa/base_bubble_controller.h" |
| 6 | 6 |
| 7 #include "base/mac/mac_util.h" | |
| 8 #import "base/mac/scoped_nsobject.h" | 7 #import "base/mac/scoped_nsobject.h" |
| 9 #import "base/mac/scoped_objc_class_swizzler.h" | 8 #import "base/mac/scoped_objc_class_swizzler.h" |
| 10 #import "base/mac/sdk_forward_declarations.h" | 9 #import "base/mac/sdk_forward_declarations.h" |
| 11 #include "base/macros.h" | 10 #include "base/macros.h" |
| 12 #import "chrome/browser/ui/cocoa/cocoa_test_helper.h" | 11 #import "chrome/browser/ui/cocoa/cocoa_test_helper.h" |
| 13 #import "chrome/browser/ui/cocoa/info_bubble_view.h" | 12 #import "chrome/browser/ui/cocoa/info_bubble_view.h" |
| 14 #import "chrome/browser/ui/cocoa/info_bubble_window.h" | 13 #import "chrome/browser/ui/cocoa/info_bubble_window.h" |
| 15 #import "ui/events/test/cocoa_test_event_utils.h" | 14 #import "ui/events/test/cocoa_test_event_utils.h" |
| 16 | 15 |
| 17 namespace { | 16 namespace { |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 [controller_ showWindow:nil]; | 138 [controller_ showWindow:nil]; |
| 140 EXPECT_TRUE([bubble_window_ isVisible]); | 139 EXPECT_TRUE([bubble_window_ isVisible]); |
| 141 return keep_alive; | 140 return keep_alive; |
| 142 } | 141 } |
| 143 | 142 |
| 144 // Fake the key state notification. Because unit_tests is a "daemon" process | 143 // Fake the key state notification. Because unit_tests is a "daemon" process |
| 145 // type, its windows can never become key (nor can the app become active). | 144 // type, its windows can never become key (nor can the app become active). |
| 146 // Instead of the hacks below, one could make a browser_test or transform the | 145 // Instead of the hacks below, one could make a browser_test or transform the |
| 147 // process type, but this seems easiest and is best suited to a unit test. | 146 // process type, but this seems easiest and is best suited to a unit test. |
| 148 // | 147 // |
| 149 // On Lion and above, which have the event taps, simply post a notification | 148 // Simply post a notification that will cause the controller to call |
| 150 // that will cause the controller to call |-windowDidResignKey:|. Earlier | 149 // |-windowDidResignKey:|. |
| 151 // OSes can call through directly. | |
| 152 void SimulateKeyStatusChange() { | 150 void SimulateKeyStatusChange() { |
| 153 NSNotification* notif = | 151 NSNotification* notif = |
| 154 [NSNotification notificationWithName:NSWindowDidResignKeyNotification | 152 [NSNotification notificationWithName:NSWindowDidResignKeyNotification |
| 155 object:[controller_ window]]; | 153 object:[controller_ window]]; |
| 156 if (base::mac::IsOSLionOrLater()) | 154 [[NSNotificationCenter defaultCenter] postNotification:notif]; |
| 157 [[NSNotificationCenter defaultCenter] postNotification:notif]; | |
| 158 else | |
| 159 [controller_ windowDidResignKey:notif]; | |
| 160 } | 155 } |
| 161 | 156 |
| 162 protected: | 157 protected: |
| 163 base::scoped_nsobject<InfoBubbleWindow> bubble_window_; | 158 base::scoped_nsobject<InfoBubbleWindow> bubble_window_; |
| 164 BaseBubbleController* controller_; | 159 BaseBubbleController* controller_; |
| 165 | 160 |
| 166 private: | 161 private: |
| 167 DISALLOW_COPY_AND_ASSIGN(BaseBubbleControllerTest); | 162 DISALLOW_COPY_AND_ASSIGN(BaseBubbleControllerTest); |
| 168 }; | 163 }; |
| 169 | 164 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 [other_window makeKeyAndOrderFront:nil]; | 273 [other_window makeKeyAndOrderFront:nil]; |
| 279 SimulateKeyStatusChange(); | 274 SimulateKeyStatusChange(); |
| 280 | 275 |
| 281 EXPECT_FALSE([bubble_window_ isVisible]); | 276 EXPECT_FALSE([bubble_window_ isVisible]); |
| 282 EXPECT_TRUE([other_window isVisible]); | 277 EXPECT_TRUE([other_window isVisible]); |
| 283 } | 278 } |
| 284 | 279 |
| 285 // Test that clicking outside the window causes the bubble to close if | 280 // Test that clicking outside the window causes the bubble to close if |
| 286 // shouldCloseOnResignKey is YES. | 281 // shouldCloseOnResignKey is YES. |
| 287 TEST_F(BaseBubbleControllerTest, LionClickOutsideClosesWithoutContextMenu) { | 282 TEST_F(BaseBubbleControllerTest, LionClickOutsideClosesWithoutContextMenu) { |
| 288 // The event tap is only installed on 10.7+. | |
| 289 if (!base::mac::IsOSLionOrLater()) | |
| 290 return; | |
| 291 | |
| 292 base::scoped_nsobject<BaseBubbleController> keep_alive = ShowBubble(); | 283 base::scoped_nsobject<BaseBubbleController> keep_alive = ShowBubble(); |
| 293 NSWindow* window = [controller_ window]; | 284 NSWindow* window = [controller_ window]; |
| 294 | 285 |
| 295 EXPECT_TRUE([controller_ shouldCloseOnResignKey]); // Verify default value. | 286 EXPECT_TRUE([controller_ shouldCloseOnResignKey]); // Verify default value. |
| 296 [controller_ setShouldCloseOnResignKey:NO]; | 287 [controller_ setShouldCloseOnResignKey:NO]; |
| 297 NSEvent* event = cocoa_test_event_utils::LeftMouseDownAtPointInWindow( | 288 NSEvent* event = cocoa_test_event_utils::LeftMouseDownAtPointInWindow( |
| 298 NSMakePoint(10, 10), test_window()); | 289 NSMakePoint(10, 10), test_window()); |
| 299 [NSApp sendEvent:event]; | 290 [NSApp sendEvent:event]; |
| 300 | 291 |
| 301 EXPECT_TRUE([window isVisible]); | 292 EXPECT_TRUE([window isVisible]); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 320 event = cocoa_test_event_utils::RightMouseDownAtPointInWindow( | 311 event = cocoa_test_event_utils::RightMouseDownAtPointInWindow( |
| 321 NSMakePoint(10, 10), test_window()); | 312 NSMakePoint(10, 10), test_window()); |
| 322 [NSApp sendEvent:event]; | 313 [NSApp sendEvent:event]; |
| 323 | 314 |
| 324 EXPECT_FALSE([window isVisible]); | 315 EXPECT_FALSE([window isVisible]); |
| 325 } | 316 } |
| 326 | 317 |
| 327 // Test that right-clicking the window with displaying a context menu causes | 318 // Test that right-clicking the window with displaying a context menu causes |
| 328 // the bubble to close. | 319 // the bubble to close. |
| 329 TEST_F(BaseBubbleControllerTest, LionRightClickOutsideClosesWithContextMenu) { | 320 TEST_F(BaseBubbleControllerTest, LionRightClickOutsideClosesWithContextMenu) { |
| 330 // The event tap is only installed on 10.7+. | |
| 331 if (!base::mac::IsOSLionOrLater()) | |
| 332 return; | |
| 333 | |
| 334 base::scoped_nsobject<BaseBubbleController> keep_alive = ShowBubble(); | 321 base::scoped_nsobject<BaseBubbleController> keep_alive = ShowBubble(); |
| 335 NSWindow* window = [controller_ window]; | 322 NSWindow* window = [controller_ window]; |
| 336 | 323 |
| 337 base::scoped_nsobject<NSMenu> context_menu( | 324 base::scoped_nsobject<NSMenu> context_menu( |
| 338 [[NSMenu alloc] initWithTitle:@""]); | 325 [[NSMenu alloc] initWithTitle:@""]); |
| 339 [context_menu addItemWithTitle:@"ContextMenuTest" | 326 [context_menu addItemWithTitle:@"ContextMenuTest" |
| 340 action:nil | 327 action:nil |
| 341 keyEquivalent:@""]; | 328 keyEquivalent:@""]; |
| 342 base::scoped_nsobject<ContextMenuController> menu_controller( | 329 base::scoped_nsobject<ContextMenuController> menu_controller( |
| 343 [[ContextMenuController alloc] initWithMenu:context_menu | 330 [[ContextMenuController alloc] initWithMenu:context_menu |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 // Post the "exit fullscreen" notification. | 423 // Post the "exit fullscreen" notification. |
| 437 NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; | 424 NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; |
| 438 [center postNotificationName:NSWindowWillExitFullScreenNotification | 425 [center postNotificationName:NSWindowWillExitFullScreenNotification |
| 439 object:test_window()]; | 426 object:test_window()]; |
| 440 | 427 |
| 441 EXPECT_FALSE([bubble_window_ isVisible]); | 428 EXPECT_FALSE([bubble_window_ isVisible]); |
| 442 } | 429 } |
| 443 | 430 |
| 444 // Tests that a bubble will not close when it's becoming a key window. | 431 // Tests that a bubble will not close when it's becoming a key window. |
| 445 TEST_F(BaseBubbleControllerTest, StayOnFocus) { | 432 TEST_F(BaseBubbleControllerTest, StayOnFocus) { |
| 446 // The event tap is only installed on 10.7+. | |
| 447 if (!base::mac::IsOSLionOrLater()) | |
| 448 return; | |
| 449 | |
| 450 [controller_ setShouldOpenAsKeyWindow:NO]; | 433 [controller_ setShouldOpenAsKeyWindow:NO]; |
| 451 base::scoped_nsobject<BaseBubbleController> keep_alive = ShowBubble(); | 434 base::scoped_nsobject<BaseBubbleController> keep_alive = ShowBubble(); |
| 452 | 435 |
| 453 EXPECT_TRUE([bubble_window_ isVisible]); | 436 EXPECT_TRUE([bubble_window_ isVisible]); |
| 454 EXPECT_TRUE([controller_ shouldCloseOnResignKey]); // Verify default value. | 437 EXPECT_TRUE([controller_ shouldCloseOnResignKey]); // Verify default value. |
| 455 | 438 |
| 456 // Make the bubble a key window. | 439 // Make the bubble a key window. |
| 457 g_key_window = [controller_ window]; | 440 g_key_window = [controller_ window]; |
| 458 base::mac::ScopedObjCClassSwizzler swizzler( | 441 base::mac::ScopedObjCClassSwizzler swizzler( |
| 459 [NSApplication class], [FakeKeyWindow class], @selector(keyWindow)); | 442 [NSApplication class], [FakeKeyWindow class], @selector(keyWindow)); |
| 460 | 443 |
| 461 // Post the "resign key" notification for another window. | 444 // Post the "resign key" notification for another window. |
| 462 NSNotification* notif = | 445 NSNotification* notif = |
| 463 [NSNotification notificationWithName:NSWindowDidResignKeyNotification | 446 [NSNotification notificationWithName:NSWindowDidResignKeyNotification |
| 464 object:test_window()]; | 447 object:test_window()]; |
| 465 [[NSNotificationCenter defaultCenter] postNotification:notif]; | 448 [[NSNotificationCenter defaultCenter] postNotification:notif]; |
| 466 | 449 |
| 467 EXPECT_TRUE([bubble_window_ isVisible]); | 450 EXPECT_TRUE([bubble_window_ isVisible]); |
| 468 g_key_window = nil; | 451 g_key_window = nil; |
| 469 } | 452 } |
| OLD | NEW |