diff options
author | jrg@chromium.org <jrg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-22 16:49:10 +0000 |
---|---|---|
committer | jrg@chromium.org <jrg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-22 16:49:10 +0000 |
commit | 9cd6def3b735220b4dd0d00ec5c8633a2dfa8acd (patch) | |
tree | d4dc784bc5a7d0d4662806e940ebb33ff2fc0abc | |
parent | 80a9966966b76bba436398ca529f9e4d509d5aab (diff) | |
download | chromium_src-9cd6def3b735220b4dd0d00ec5c8633a2dfa8acd.zip chromium_src-9cd6def3b735220b4dd0d00ec5c8633a2dfa8acd.tar.gz chromium_src-9cd6def3b735220b4dd0d00ec5c8633a2dfa8acd.tar.bz2 |
Command-click on a bookmark folder button will now open all in
background tabs.
BUG=34288
TEST=\
1) Make sure normal clicking will open bookmarks, bookmark folders.
2) Make sure right-click opens context menus on folders
3) command-click a folder --> opens all the marks in that folder in
background tabs
Review URL: http://codereview.chromium.org/1115004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@42225 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_controller.mm | 49 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_controller_unittest.mm | 35 |
2 files changed, 73 insertions, 11 deletions
diff --git a/chrome/browser/cocoa/bookmark_bar_controller.mm b/chrome/browser/cocoa/bookmark_bar_controller.mm index 13ca49a..3915f9d 100644 --- a/chrome/browser/cocoa/bookmark_bar_controller.mm +++ b/chrome/browser/cocoa/bookmark_bar_controller.mm @@ -179,6 +179,10 @@ const NSTimeInterval kBookmarkBarAnimationDuration = 0.12; - (void)watchForClickOutside:(BOOL)watch; +// An ObjC version of bookmark_utils::OpenAllImpl(). +- (void)openBookmarkNodesRecursive:(const BookmarkNode*)node + disposition:(WindowOpenDisposition)disposition; + @end @implementation BookmarkBarController @@ -1122,25 +1126,49 @@ static BOOL ValueInRangeInclusive(CGFloat low, CGFloat value, CGFloat high) { return menu; } -// Heuristics: -// 1: click and hold (without moving much): opens it -// 2: click and release (normal button push): opens it. -// This is called on the second one. +// This IBAction is called when the user clicks (mouseUp, really) on a +// "folder" bookmark button. (In this context, "Click" does not +// include right-click to open a context menu which follows a +// different path). Scenarios when folder X is clicked: +// *Predicate* *Action* +// (nothing) Open Folder X +// Folder X open Close folder X +// Folder Y open Close Y, open X +// Cmd-click Open All with proper disposition // -// Called from a Folder bookmark button to open the folder. +// Note complication in which a click-drag engages drag and drop, not +// a click-to-open. Thus the path to get here is a little twisted. - (IBAction)openBookmarkFolderFromButton:(id)sender { DCHECK(sender); + BOOL same = false; + if (folderController_) { // closeAllBookmarkFolders sets folderController_ to nil // so we need the SAME check to happen first. - BOOL same = ([folderController_ parentButton] == sender); + same = ([folderController_ parentButton] == sender); [self closeAllBookmarkFolders]; - // If click on same folder, close it and be done. - // Else we clicked on a different folder so more work to do. - if (same) - return; } + // Watch out for a modifier click. For example, command-click + // should open all. + // + // NOTE: we cannot use [[sender cell] mouseDownFlags] because we + // thwart the normal mouse click mechanism to make buttons + // draggable. Thus we must use [NSApp currentEvent]. + DCHECK([sender bookmarkNode]->is_folder()); + WindowOpenDisposition disposition = + event_utils::WindowOpenDispositionFromNSEvent([NSApp currentEvent]); + if (disposition == NEW_BACKGROUND_TAB) { + [self openBookmarkNodesRecursive:[sender bookmarkNode] + disposition:disposition]; + return; + } + + // If click on same folder, close it and be done. + // Else we clicked on a different folder so more work to do. + if (same) + return; + // Folder controller, like many window controllers, owns itself. folderController_ = [[BookmarkBarFolderController alloc] initWithParentButton:sender @@ -1260,7 +1288,6 @@ static BOOL ValueInRangeInclusive(CGFloat low, CGFloat value, CGFloat high) { } } -// An ObjC version of bookmark_utils::OpenAllImpl(). - (void)openBookmarkNodesRecursive:(const BookmarkNode*)node disposition:(WindowOpenDisposition)disposition { DCHECK(node); diff --git a/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm b/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm index b34d9ad..7b7ac17 100644 --- a/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm +++ b/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm @@ -22,6 +22,7 @@ #include "chrome/common/pref_names.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" // Just like a BookmarkBarController but openURL: is stubbed out. @interface BookmarkBarControllerNoOpen : BookmarkBarController { @@ -783,6 +784,40 @@ TEST_F(BookmarkBarControllerTest, MiddleClick) { EXPECT_EQ(bar_.get()->urls_.size(), 1U); } +// Command-click on a folder should open all the marks in it. +TEST_F(BookmarkBarControllerTest, CommandClickOnFolder) { + BookmarkModel* model = helper_.profile()->GetBookmarkModel(); + const BookmarkNode* parent = model->GetBookmarkBarNode(); + const BookmarkNode* folder = model->AddGroup(parent, + parent->GetChildCount(), + L"group"); + model->AddURL(folder, folder->GetChildCount(), + L"f1", GURL("http://framma-lamma.com")); + model->AddURL(folder, folder->GetChildCount(), + L"f2", GURL("http://framma-lamma-ding-dong.com")); + + ASSERT_EQ(1U, [[bar_ buttons] count]); + NSButton* first = [[bar_ buttons] objectAtIndex:0]; + EXPECT_TRUE(first); + + // Create the right kind of event; mock NSApp so [NSApp + // currentEvent] finds it. + NSEvent* commandClick = test_event_utils::MouseEventAtPoint(NSZeroPoint, + NSLeftMouseDown, + NSCommandKeyMask); + id fakeApp = [OCMockObject partialMockForObject:NSApp]; + [[[fakeApp stub] andReturn:commandClick] currentEvent]; + id oldApp = NSApp; + NSApp = fakeApp; + + // Click! + [first performClick:first]; + EXPECT_EQ(2U, bar_.get()->urls_.size()); + + // Replace NSApp + NSApp = oldApp; +} + TEST_F(BookmarkBarControllerTest, TestBuildOffTheSideMenu) { BookmarkModel* model = helper_.profile()->GetBookmarkModel(); NSMenu* menu = [bar_ offTheSideMenu]; |