diff options
author | mrossetti@chromium.org <mrossetti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-10 17:52:41 +0000 |
---|---|---|
committer | mrossetti@chromium.org <mrossetti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-10 17:52:41 +0000 |
commit | 01a354415f462d90e3d433bec37fd41205365277 (patch) | |
tree | 214e90f7e3ac57f99431aaf4d786267d2eb35827 | |
parent | 41cc8f713a1322c55bf273ae5e55a24401dc4e3a (diff) | |
download | chromium_src-01a354415f462d90e3d433bec37fd41205365277.zip chromium_src-01a354415f462d90e3d433bec37fd41205365277.tar.gz chromium_src-01a354415f462d90e3d433bec37fd41205365277.tar.bz2 |
Discontinue tracking folder menus as soon as any bookmark is clicked.
BUG=43622
TEST=Pop open a folder on the bookmark bar and verify that mousing over various folders causes their menus to appear. Find a bookmark within one of those folders and click on it. Verify that mousing over folders in the bookmark bar no longer cause the folder menus to appear.
Review URL: http://codereview.chromium.org/2044006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@46827 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_controller.mm | 31 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_controller_unittest.mm | 21 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_folder_controller.h | 1 |
3 files changed, 40 insertions, 13 deletions
diff --git a/chrome/browser/cocoa/bookmark_bar_controller.mm b/chrome/browser/cocoa/bookmark_bar_controller.mm index 446bfee..4d70f0a 100644 --- a/chrome/browser/cocoa/bookmark_bar_controller.mm +++ b/chrome/browser/cocoa/bookmark_bar_controller.mm @@ -174,6 +174,16 @@ const NSTimeInterval kBookmarkBarAnimationDuration = 0.12; // then show the no items label. - (void)reconfigureBookmarkBar; +// Used for situations where the bookmark bar folder menus should no longer +// be actively popping up. Called when the window loses focus, a click has +// occured outside the menus or a bookmark has been activated. (Note that this +// differs from the behavior of the -[BookmarkButtonControllerProtocol +// closeAllBookmarkFolders] method in that the latter does not terminate menu +// tracking since it may be being called in response to actions (such as +// dragging) where a 'stale' menu presentation should first be collapsed before +// presenting a new menu.) +- (void)closeFolderAndStopTrackingMenus; + - (void)addNode:(const BookmarkNode*)child toMenu:(NSMenu*)menu; - (void)addFolderNode:(const BookmarkNode*)node toMenu:(NSMenu*)menu; - (void)tagEmptyMenu:(NSMenu*)menu; @@ -423,19 +433,23 @@ const NSTimeInterval kBookmarkBarAnimationDuration = 0.12; [self closeAllBookmarkFolders]; } +- (void)closeFolderAndStopTrackingMenus { + showFolderMenus_ = NO; + [self closeAllBookmarkFolders]; +} + - (BookmarkModel*)bookmarkModel { return bookmarkModel_; } // NSNotificationCenter callback. - (void)parentWindowWillClose:(NSNotification*)notification { - [self closeAllBookmarkFolders]; + [self closeFolderAndStopTrackingMenus]; } // NSNotificationCenter callback. - (void)parentWindowDidResignKey:(NSNotification*)notification { - showFolderMenus_ = NO; - [self closeAllBookmarkFolders]; + [self closeFolderAndStopTrackingMenus]; } // BookmarkButtonDelegate protocol implementation. When menus are @@ -498,11 +512,8 @@ const NSTimeInterval kBookmarkBarAnimationDuration = 0.12; // Implementation of CrApplicationEventHookProtocol. // NOT an override of a standard Cocoa call made to NSViewControllers. - (void)hookForEvent:(NSEvent*)theEvent { - if ([self isEventAnExitEvent:theEvent]) { - showFolderMenus_ = NO; - [self watchForExitEvent:NO]; - [self closeAllBookmarkFolders]; - } + if ([self isEventAnExitEvent:theEvent]) + [self closeFolderAndStopTrackingMenus]; } // Return YES if the event indicates an exit from the bookmark bar @@ -1104,7 +1115,7 @@ static BOOL ValueInRangeInclusive(CGFloat low, CGFloat value, CGFloat high) { } - (IBAction)openBookmark:(id)sender { - [self closeAllBookmarkFolders]; + [self closeFolderAndStopTrackingMenus]; DCHECK([sender respondsToSelector:@selector(bookmarkNode)]); const BookmarkNode* node = [sender bookmarkNode]; WindowOpenDisposition disposition = @@ -1357,7 +1368,7 @@ static BOOL ValueInRangeInclusive(CGFloat low, CGFloat value, CGFloat high) { - (void)openAll:(const BookmarkNode*)node disposition:(WindowOpenDisposition)disposition { - [self closeAllBookmarkFolders]; + [self closeFolderAndStopTrackingMenus]; bookmark_utils::OpenAll([[self view] window], browser_->profile(), browser_, diff --git a/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm b/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm index 2ad6f80..e1c2c9a4 100644 --- a/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm +++ b/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm @@ -1163,8 +1163,14 @@ TEST_F(BookmarkBarControllerTest, TestFolderButtons) { EXPECT_EQ(model_string, actualModelString); EXPECT_FALSE([bar_ folderController]); + // Add a real bookmark so we can click on it. + const BookmarkNode* folder = root->GetChild(3); + model.AddURL(folder, folder->GetChildCount(), L"CLICK ME", + GURL("http://www.google.com/")); + // Click on a folder button. BookmarkButton* button = [bar_ buttonWithTitleEqualTo:@"4f"]; + EXPECT_TRUE(button); [bar_ openBookmarkFolderFromButton:button]; BookmarkBarFolderController* bbfc = [bar_ folderController]; EXPECT_TRUE(bbfc); @@ -1175,11 +1181,13 @@ TEST_F(BookmarkBarControllerTest, TestFolderButtons) { // Next open is a different button. button = [bar_ buttonWithTitleEqualTo:@"2f"]; + EXPECT_TRUE(button); [bar_ openBookmarkFolderFromButton:button]; EXPECT_TRUE([bar_ folderController]); // Mouse over a non-folder button and confirm controller has gone away. button = [bar_ buttonWithTitleEqualTo:@"1b"]; + EXPECT_TRUE(button); NSEvent* event = test_event_utils::MouseEventAtPoint([button center], NSMouseMoved, 0); [bar_ mouseEnteredButton:button event:event]; @@ -1187,19 +1195,25 @@ TEST_F(BookmarkBarControllerTest, TestFolderButtons) { // Mouse over the original folder and confirm a new controller. button = [bar_ buttonWithTitleEqualTo:@"2f"]; + EXPECT_TRUE(button); [bar_ mouseEnteredButton:button event:event]; BookmarkBarFolderController* oldBBFC = [bar_ folderController]; EXPECT_TRUE(oldBBFC); // 'Jump' over to a different folder and confirm a new controller. button = [bar_ buttonWithTitleEqualTo:@"4f"]; + EXPECT_TRUE(button); [bar_ mouseEnteredButton:button event:event]; BookmarkBarFolderController* newBBFC = [bar_ folderController]; EXPECT_TRUE(newBBFC); EXPECT_NE(oldBBFC, newBBFC); - // Another click should close the folder menus. - [bar_ openBookmarkFolderFromButton:button]; + // A click on a real bookmark should close and stop tracking the folder menus. + BookmarkButton* bookmarkButton = [newBBFC buttonWithTitleEqualTo:@"CLICK ME"]; + EXPECT_TRUE(bookmarkButton); + [newBBFC openBookmark:bookmarkButton]; + EXPECT_FALSE([bar_ folderController]); + [bar_ mouseEnteredButton:button event:event]; EXPECT_FALSE([bar_ folderController]); } @@ -1645,7 +1659,8 @@ TEST_F(BookmarkBarControllerDragDropTest, DragMoveBarBookmarkToOffTheSide) { EXPECT_TRUE(otsController); NSWindow* toWindow = [otsController window]; EXPECT_TRUE(toWindow); - BookmarkButton* draggedButton = [bar_ buttonWithTitleEqualTo:@"3bWithLongName"]; + BookmarkButton* draggedButton = + [bar_ buttonWithTitleEqualTo:@"3bWithLongName"]; ASSERT_TRUE(draggedButton); int oldOTSCount = (int)[[otsController buttons] count]; EXPECT_EQ(oldOTSCount, oldChildCount - oldDisplayedButtons); diff --git a/chrome/browser/cocoa/bookmark_bar_folder_controller.h b/chrome/browser/cocoa/bookmark_bar_folder_controller.h index 61e6380..09aaadf 100644 --- a/chrome/browser/cocoa/bookmark_bar_folder_controller.h +++ b/chrome/browser/cocoa/bookmark_bar_folder_controller.h @@ -140,6 +140,7 @@ - (IBAction)addFolder:(id)sender; - (IBAction)addPage:(id)sender; - (IBAction)editBookmark:(id)sender; +- (IBAction)openBookmark:(id)sender; - (IBAction)openAllBookmarks:(id)sender; - (IBAction)openAllBookmarksIncognitoWindow:(id)sender; - (IBAction)openAllBookmarksNewWindow:(id)sender; |