summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormrossetti@chromium.org <mrossetti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-10 17:52:41 +0000
committermrossetti@chromium.org <mrossetti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-10 17:52:41 +0000
commit01a354415f462d90e3d433bec37fd41205365277 (patch)
tree214e90f7e3ac57f99431aaf4d786267d2eb35827
parent41cc8f713a1322c55bf273ae5e55a24401dc4e3a (diff)
downloadchromium_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.mm31
-rw-r--r--chrome/browser/cocoa/bookmark_bar_controller_unittest.mm21
-rw-r--r--chrome/browser/cocoa/bookmark_bar_folder_controller.h1
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;