summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjrg@chromium.org <jrg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-22 16:49:10 +0000
committerjrg@chromium.org <jrg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-22 16:49:10 +0000
commit9cd6def3b735220b4dd0d00ec5c8633a2dfa8acd (patch)
treed4dc784bc5a7d0d4662806e940ebb33ff2fc0abc
parent80a9966966b76bba436398ca529f9e4d509d5aab (diff)
downloadchromium_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.mm49
-rw-r--r--chrome/browser/cocoa/bookmark_bar_controller_unittest.mm35
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];