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

Unified Diff: chrome/browser/ui/cocoa/base_bubble_controller_unittest.mm

Issue 300113009: Fix BaseBubbleController close issue. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: unit_test Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/base_bubble_controller_unittest.mm
diff --git a/chrome/browser/ui/cocoa/base_bubble_controller_unittest.mm b/chrome/browser/ui/cocoa/base_bubble_controller_unittest.mm
index 8e04a9ec123599553c7cf637f99c8ab424dc267b..78db7b1b941dcc889f915c4e3d3195206f6c7ed1 100644
--- a/chrome/browser/ui/cocoa/base_bubble_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/base_bubble_controller_unittest.mm
@@ -18,6 +18,74 @@ const CGFloat kAnchorPointX = 400;
const CGFloat kAnchorPointY = 300;
} // namespace
+@interface ContextMenuController : NSObject<NSMenuDelegate> {
+ @private
Robert Sesek 2014/06/05 14:22:50 nit: @private is only indented 1 space
+ NSMenu* menu_;
+ NSWindow* window_;
+ BOOL isMenuOpen_;
+ BOOL didOpen_;
+}
+
+- (id)initWithMenu:(NSMenu*) menu AndWindow:(NSWindow*) window;
Robert Sesek 2014/06/05 14:22:50 nit: No space after ) for arguments. I'm mentionin
Robert Sesek 2014/06/05 14:22:50 nit: AndWindow: -> andWindow:
+
+- (BOOL)isMenuOpen;
+- (BOOL)didOpen;
+- (BOOL)isWindowVisible;
+
+// NSMenuDelegate methods
+- (void)menuWillOpen:(NSMenu*) menu;
+- (void)menuDidClose:(NSMenu*) menu;
+
+@end
+
+@implementation ContextMenuController
+
+- (id)initWithMenu:(NSMenu*) menu AndWindow:(NSWindow*)window {
+ if (self = [super init]) {
+ menu_ = menu;
+ window_ = window;
+ isMenuOpen_ = NO;
+ didOpen_ = NO;
+ [menu_ setDelegate: self];
Robert Sesek 2014/06/05 14:22:50 nit: No space after : in method invocations. Pleas
+ }
+ return self;
+}
+
+- (BOOL)isMenuOpen {
+ return isMenuOpen_;
+}
+
+- (BOOL)didOpen {
+ return didOpen_;
+}
+
+- (BOOL)isWindowVisible {
+ if (window_) {
+ return [window_ isVisible];
+ }
+ return NO;
+}
+
+- (void)menuWillOpen:(NSMenu *)menu {
Robert Sesek 2014/06/05 14:22:50 nit: No space before * in arguments. Same with lin
+ isMenuOpen_ = YES;
+ didOpen_ = NO;
+
+ NSArray* modes = [NSArray arrayWithObjects:NSEventTrackingRunLoopMode,
Robert Sesek 2014/06/05 14:22:50 You can use the ObjC array literal syntax @[ NSEve
+ NSDefaultRunLoopMode,
+ nil];
+ [menu_ performSelector:@selector(cancelTracking)
+ withObject:nil
+ afterDelay:0.1
+ inModes:modes];
+}
+
+- (void)menuDidClose:(NSMenu *)menu {
+ isMenuOpen_ = NO;
+ didOpen_ = YES;
+}
+
+@end
+
class BaseBubbleControllerTest : public CocoaTest {
public:
virtual void SetUp() OVERRIDE {
@@ -174,7 +242,7 @@ TEST_F(BaseBubbleControllerTest, ResignKeyCloses) {
// Test that clicking outside the window causes the bubble to close if
// shouldCloseOnResignKey is YES.
-TEST_F(BaseBubbleControllerTest, LionClickOutsideCloses) {
+TEST_F(BaseBubbleControllerTest, LionClickOutsideClosesWithoutContextMenu) {
// The event tap is only installed on 10.7+.
if (!base::mac::IsOSLionOrLater())
return;
@@ -194,7 +262,12 @@ TEST_F(BaseBubbleControllerTest, LionClickOutsideCloses) {
NSEvent* event = cocoa_test_event_utils::LeftMouseDownAtPointInWindow(
NSMakePoint(10, 10), test_window());
[NSApp sendEvent:event];
- chrome::testing::NSRunLoopRunAllPending();
Robert Sesek 2014/06/05 14:22:50 What's the rationale for removing these calls?
Xuefei Ren 2014/06/06 03:41:44 Before my patch, the bubble window close depends o
+
+ EXPECT_TRUE([window isVisible]);
+
+ event = cocoa_test_event_utils::RightMouseDownAtPointInWindow(
+ NSMakePoint(10, 10), test_window());
+ [NSApp sendEvent:event];
EXPECT_TRUE([window isVisible]);
@@ -202,7 +275,70 @@ TEST_F(BaseBubbleControllerTest, LionClickOutsideCloses) {
event = cocoa_test_event_utils::LeftMouseDownAtPointInWindow(
NSMakePoint(10, 10), test_window());
[NSApp sendEvent:event];
- chrome::testing::NSRunLoopRunAllPending();
EXPECT_FALSE([window isVisible]);
+
+ [controller_ showWindow:nil]; // Show it again
+ EXPECT_TRUE([window isVisible]);
+ EXPECT_TRUE([controller_ shouldCloseOnResignKey]); // Verify.
+
+ event = cocoa_test_event_utils::RightMouseDownAtPointInWindow(
+ NSMakePoint(10, 10), test_window());
+ [NSApp sendEvent:event];
+
+ EXPECT_FALSE([window isVisible]);
+}
+
+// Test that right-clicking the window with displaying a context menu causes
+// the bubble to close.
+TEST_F(BaseBubbleControllerTest, LionRightClickOutsideClosesWithContextMenu) {
+ // The event tap is only installed on 10.7+.
+ if (!base::mac::IsOSLionOrLater())
+ return;
+
+ // Closing the bubble will autorelease the controller.
+ base::scoped_nsobject<BaseBubbleController> keep_alive([controller_ retain]);
+ NSWindow* window = [controller_ window];
+
+ EXPECT_TRUE([controller_ shouldCloseOnResignKey]); // Verify default value.
+ EXPECT_FALSE([window isVisible]);
+
+ [controller_ showWindow:nil];
+
+ EXPECT_TRUE([window isVisible]);
+
+ base::scoped_nsobject<NSMenu> context_menu(
+ [[NSMenu alloc] initWithTitle:@""]);
Robert Sesek 2014/06/05 14:22:50 nit: Only indent 6 spaces total.
+ [context_menu addItemWithTitle: @"ContextMenuTest"
+ action: nil
+ keyEquivalent:@""];
+ ContextMenuController* menu_controller = [[ContextMenuController alloc]
Robert Sesek 2014/06/05 14:22:50 This is leaked, so you should put it in a scoped_n
+ initWithMenu: context_menu
+ AndWindow: window];
+ // Set the menu as the contextual menu of contentView of test_window().
+ [[test_window() contentView] setMenu:context_menu];
+
+ // RightMouseDown in test_window() would close the bubble window and then
+ // dispaly the contextual menu.
+ NSEvent* event = cocoa_test_event_utils::RightMouseDownAtPointInWindow(
+ NSMakePoint(10, 10),
Robert Sesek 2014/06/05 14:22:50 nit: Only indent 6 spaces total, and you can join
+ test_window());
+ // Verify bubble's window is closed when contextual menu is open.
+ CFRunLoopPerformBlock(CFRunLoopGetCurrent(), NSEventTrackingRunLoopMode, ^{
+ EXPECT_TRUE([menu_controller isMenuOpen]);
Robert Sesek 2014/06/05 14:22:50 nit: Indent blocks 4 spaces.
+ EXPECT_FALSE([menu_controller isWindowVisible]);
+ });
+
+ EXPECT_FALSE([menu_controller isMenuOpen]);
+ EXPECT_FALSE([menu_controller didOpen]);
+
+ [NSApp sendEvent:event];
+
+ // When we got here, menu has already run its RunLoop.
+ // See ContextualMenuController::MenuWillOpen.
Robert Sesek 2014/06/05 14:22:50 This is how you name a C++ method. This should be
+ EXPECT_FALSE([window isVisible]);
+
+ EXPECT_FALSE([menu_controller isMenuOpen]);
+ EXPECT_TRUE([menu_controller didOpen]);
}
+

Powered by Google App Engine
This is Rietveld 408576698