diff options
-rw-r--r-- | chrome/app/nibs/BookmarkBar.xib | 25 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_controller.h | 3 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_controller.mm | 19 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_controller_unittest.mm | 32 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_view.h | 6 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_view.mm | 48 | ||||
-rw-r--r-- | chrome/browser/cocoa/browser_window_controller.mm | 2 |
7 files changed, 129 insertions, 6 deletions
diff --git a/chrome/app/nibs/BookmarkBar.xib b/chrome/app/nibs/BookmarkBar.xib index 0163b28..52f4fa3 100644 --- a/chrome/app/nibs/BookmarkBar.xib +++ b/chrome/app/nibs/BookmarkBar.xib @@ -634,6 +634,14 @@ </object> <int key="connectionID">94</int> </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">controller_</string> + <reference key="source" ref="610146462"/> + <reference key="destination" ref="1001"/> + </object> + <int key="connectionID">95</int> + </object> </object> <object class="IBMutableOrderedSet" key="objectRecords"> <object class="NSArray" key="orderedObjects"> @@ -956,7 +964,7 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{1111, 613}, {600, 144}}</string> + <string>{{191, 181}, {600, 144}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -1020,7 +1028,7 @@ </object> </object> <nil key="sourceID"/> - <int key="maxID">94</int> + <int key="maxID">95</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <object class="NSMutableArray" key="referencedPartialClassDescriptions"> @@ -1118,8 +1126,17 @@ <string key="className">BookmarkBarView</string> <string key="superclassName">NSView</string> <object class="NSMutableDictionary" key="outlets"> - <string key="NS.key.0">noItemTextfield_</string> - <string key="NS.object.0">NSTextField</string> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>controller_</string> + <string>noItemTextfield_</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>BookmarkBarController</string> + <string>NSTextField</string> + </object> </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBProjectSource</string> diff --git a/chrome/browser/cocoa/bookmark_bar_controller.h b/chrome/browser/cocoa/bookmark_bar_controller.h index 31a7f2b..e01312f 100644 --- a/chrome/browser/cocoa/bookmark_bar_controller.h +++ b/chrome/browser/cocoa/bookmark_bar_controller.h @@ -137,6 +137,9 @@ const CGFloat kNoBookmarksNTPVerticalOffset = 27.0; // to the user having selected "Always show the bookmark bar") - (BOOL)isAlwaysVisible; +// Returns true if at least one bookmark was added. +- (BOOL)addURLs:(NSArray*)urls withTitles:(NSArray*)titles at:(NSPoint)point; + // Actions for manipulating bookmarks. // From a button, ... - (IBAction)openBookmark:(id)sender; diff --git a/chrome/browser/cocoa/bookmark_bar_controller.mm b/chrome/browser/cocoa/bookmark_bar_controller.mm index 52ec734..5d2a6d1 100644 --- a/chrome/browser/cocoa/bookmark_bar_controller.mm +++ b/chrome/browser/cocoa/bookmark_bar_controller.mm @@ -80,6 +80,9 @@ } - (void)dealloc { + // Remove our view from its superview so it doesn't attempt to reference + // it when the controller is gone. + [[self view] removeFromSuperview]; bridge_.reset(NULL); [[NSNotificationCenter defaultCenter] removeObserver:self]; [super dealloc]; @@ -202,6 +205,22 @@ browser_->profile()->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); } +- (BOOL)addURLs:(NSArray*)urls withTitles:(NSArray*)titles at:(NSPoint)point { + // TODO(jrg): Support drops on folders etc + // TODO(jrg): Use |point|. + DCHECK([urls count] == [titles count]); + const BookmarkNode* node = bookmarkModel_->GetBookmarkBarNode(); + + for (size_t i = 0; i < [urls count]; ++i) { + bookmarkModel_->AddURL( + node, + node->GetChildCount(), + base::SysNSStringToWide([titles objectAtIndex:i]), + GURL([[urls objectAtIndex:i] UTF8String])); + } + return YES; +} + - (int)currentTabContentsHeight { return browser_->GetSelectedTabContents()->view()->GetContainerSize(). height(); diff --git a/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm b/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm index 985e96f..11dc3fd 100644 --- a/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm +++ b/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm @@ -6,6 +6,7 @@ #include "base/basictypes.h" #include "base/scoped_nsobject.h" +#include "base/sys_string_conversions.h" #import "chrome/browser/cocoa/bookmark_bar_constants.h" #import "chrome/browser/cocoa/bookmark_bar_controller.h" #import "chrome/browser/cocoa/bookmark_bar_view.h" @@ -669,6 +670,37 @@ TEST_F(BookmarkBarControllerTest, BookmarkButtonSizing) { } } +TEST_F(BookmarkBarControllerTest, DropBookmarks) { + const char* urls[] = { + "http://qwantz.com", + "http://xkcd.com", + "javascript:alert('lolwut')" + }; + std::wstring titles[] = { + std::wstring(L"Philosophoraptor"), + std::wstring(L"Can't draw"), + std::wstring(L"Inspiration") + }; + EXPECT_EQ(arraysize(urls), arraysize(titles)); + + NSMutableArray* nsurls = [NSMutableArray arrayWithCapacity:0]; + NSMutableArray* nstitles = [NSMutableArray arrayWithCapacity:0]; + for (size_t i = 0; i < arraysize(urls); ++i) { + [nsurls addObject:[NSString stringWithCString:urls[i]]]; + [nstitles addObject:base::SysWideToNSString(titles[i])]; + } + + BookmarkModel* model = helper_.profile()->GetBookmarkModel(); + const BookmarkNode* parent = model->GetBookmarkBarNode(); + [bar_ addURLs:nsurls withTitles:nstitles at:NSZeroPoint]; + EXPECT_EQ(3, parent->GetChildCount()); + for (int i = 0; i < parent->GetChildCount(); ++i) { + EXPECT_EQ(parent->GetChild(i)->GetURL(), GURL(urls[i])); + EXPECT_EQ(parent->GetChild(i)->GetTitle(), titles[i]); + } +} + + // Cannot test these methods since they simply call a single static // method, BookmarkEditor::Show(), which is impossible to mock. // editBookmark:, addPage: diff --git a/chrome/browser/cocoa/bookmark_bar_view.h b/chrome/browser/cocoa/bookmark_bar_view.h index 9bd94d2..9b81ec4 100644 --- a/chrome/browser/cocoa/bookmark_bar_view.h +++ b/chrome/browser/cocoa/bookmark_bar_view.h @@ -10,11 +10,15 @@ #import <Cocoa/Cocoa.h> +@class BookmarkBarController; + @interface BookmarkBarView : NSView { + @private + IBOutlet BookmarkBarController* controller_; IBOutlet NSTextField* noItemTextfield_; } --(NSTextField*)noItemTextfield; +- (NSTextField*)noItemTextfield; @end diff --git a/chrome/browser/cocoa/bookmark_bar_view.mm b/chrome/browser/cocoa/bookmark_bar_view.mm index a991e71..d62b755 100644 --- a/chrome/browser/cocoa/bookmark_bar_view.mm +++ b/chrome/browser/cocoa/bookmark_bar_view.mm @@ -3,7 +3,10 @@ // found in the LICENSE file. #import "chrome/browser/cocoa/bookmark_bar_view.h" + +#import "chrome/browser/cocoa/bookmark_bar_controller.h" #import "third_party/GTM/AppKit/GTMTheme.h" +#import "third_party/mozilla/include/NSPasteboard+Utils.h" @interface BookmarkBarView (Private) - (void)themeDidChangeNotification:(NSNotification*)aNotification; @@ -14,6 +17,8 @@ - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; + // This probably isn't strictly necessary, but can't hurt. + [self unregisterDraggedTypes]; [super dealloc]; } @@ -23,6 +28,11 @@ selector:@selector(themeDidChangeNotification:) name:kGTMThemeDidChangeNotification object:nil]; + + DCHECK(controller_ && "Expected this to be hooked up via Interface Builder"); + NSArray* types = [NSArray arrayWithObjects:NSStringPboardType, + NSHTMLPboardType, NSURLPboardType, nil]; + [self registerForDraggedTypes:types]; } - (void)viewDidMoveToWindow { @@ -51,4 +61,42 @@ return noItemTextfield_; } +// NSDraggingDestination methods + +- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)info { + if ([[info draggingPasteboard] containsURLData]) + return NSDragOperationCopy; + return NSDragOperationNone; +} + +- (BOOL)wantsPeriodicDraggingUpdates { + // TODO(port): This should probably return |YES| and the controller should + // slide the existing bookmark buttons interactively to the side to make + // room for the about-to-be-dropped bookmark. + return NO; +} + +- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)info { + if ([[info draggingPasteboard] containsURLData]) + return NSDragOperationCopy; + return NSDragOperationNone; +} + +- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)info { + return YES; +} + +- (BOOL)performDragOperation:(id<NSDraggingInfo>)info { + NSPasteboard* pboard = [info draggingPasteboard]; + DCHECK([pboard containsURLData]); + + NSArray* urls = nil; + NSArray* titles = nil; + [pboard getURLs:&urls andTitles:&titles]; + + return [controller_ addURLs:urls + withTitles:titles + at:[info draggingLocation]]; +} + @end // @implementation BookmarkBarView diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm index 2f11527..57a5159 100644 --- a/chrome/browser/cocoa/browser_window_controller.mm +++ b/chrome/browser/cocoa/browser_window_controller.mm @@ -271,7 +271,7 @@ willPositionSheet:(NSWindow*)sheet // We can't actually use |-autorelease| here because there's an embedded // run loop in the |-performClose:| which contains its own autorelease pool. - // Instead we use call it after a zero-length delay, which gets us back + // Instead we call it after a zero-length delay, which gets us back // to the main event loop. [self performSelector:@selector(autorelease) withObject:nil |