diff options
author | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-23 17:46:40 +0000 |
---|---|---|
committer | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-23 17:46:40 +0000 |
commit | 47e532b88cbf3acdeacd49f5cdcd69dbabd7ae68 (patch) | |
tree | 885bb92e7265623f904443620b3dd779a0060199 /chrome/browser/cocoa | |
parent | d4b3a6f00112079f966830cf0f2f3c34a156c10e (diff) | |
download | chromium_src-47e532b88cbf3acdeacd49f5cdcd69dbabd7ae68.zip chromium_src-47e532b88cbf3acdeacd49f5cdcd69dbabd7ae68.tar.gz chromium_src-47e532b88cbf3acdeacd49f5cdcd69dbabd7ae68.tar.bz2 |
Delete native Mac bookmark manager. Remove --disable-tabbed-bookmark-manager (everywhere).
Still to do: delete native bookmark managers on other platforms.
BUG=38908
TEST=Everything else still works.
Review URL: http://codereview.chromium.org/1751011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45462 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r-- | chrome/browser/cocoa/bookmark_item.h | 104 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_item.mm | 362 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_item_unittest.mm | 250 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_manager_controller.h | 78 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_manager_controller.mm | 577 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_manager_controller_unittest.mm | 161 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_tree_controller.h | 109 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_tree_controller.mm | 536 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_tree_controller_pasteboard.mm | 426 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_tree_controller_unittest.mm | 360 | ||||
-rw-r--r-- | chrome/browser/cocoa/browser_window_cocoa.mm | 4 |
11 files changed, 2 insertions, 2965 deletions
diff --git a/chrome/browser/cocoa/bookmark_item.h b/chrome/browser/cocoa/bookmark_item.h deleted file mode 100644 index 63e9097..0000000 --- a/chrome/browser/cocoa/bookmark_item.h +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import <Cocoa/Cocoa.h> -#include "base/scoped_nsobject.h" - -@class BookmarkManagerController; -class BookmarkNode; - -// Cocoa object that stands in for a C++ BookmarkNode. -@interface BookmarkItem : NSObject { - @private - const BookmarkNode* node_; // weak - BookmarkManagerController* manager_; // weak - @protected - scoped_nsobject<NSImage> icon_; -} - -- (id)initWithBookmarkNode:(const BookmarkNode*)node - manager:(BookmarkManagerController*)manager; - -// The item's underlying C++ node (nil for fake items). -@property (readonly) const BookmarkNode* node; -// The item's title. -@property (copy) NSString* title; -// The item's URL as a plain string (nil for folders). -@property (copy) NSString* URLString; -// The item's parent in the real bookmark tree. -@property (readonly) BookmarkItem* parent; -// The user-visible path to the item (slash-delimited). -@property (readonly) NSString* folderPath; -// Is this a FakeBookmarkItem? -@property (readonly) BOOL isFake; -// Fixed items (Bookmarks Bar, Other, fake) cannot be renamed, moved or deleted. -@property (readonly) BOOL isFixed; -// The bookmark's favicon (a folder icon for folders.) -@property (readonly) NSImage* icon; - -// The bookmark node's persistent ID. -@property (readonly) id persistentID; -// Finds a descendant with the given persistent ID. -- (BookmarkItem*)itemWithPersistentID:(id)persistentID; - -// Is this item a folder/group? -@property (readonly) BOOL isFolder; -// The number of direct children of a folder. -@property (readonly) NSUInteger numberOfChildren; -// The child at a given zero-based index. -- (BookmarkItem*)childAtIndex:(NSUInteger)index; -// The index of a direct child, or NSNotFound. -- (NSUInteger)indexOfChild:(BookmarkItem*)child; -// Is the item an indirect descendant of the receiver? -- (BOOL)hasDescendant:(BookmarkItem*)item; - -// The number of direct children that are themselves folders. -@property (readonly) NSUInteger numberOfChildFolders; -// The index'th child folder. -- (BookmarkItem*)childFolderAtIndex:(NSUInteger)index; -// The index, by counting child folders, of the given folder. -- (NSUInteger)indexOfChildFolder:(BookmarkItem*)child; - -// Moves an existing item into this folder at the given index. -- (void)moveItem:(BookmarkItem*)item toIndex:(int)index; - -// Adds a child bookmark. Receiver must be a folder. -- (BookmarkItem*) addBookmarkWithTitle:(NSString*)title - URL:(NSString*)urlString - atIndex:(int)index; -// Adds a child folder. Receiver must be a folder. -- (BookmarkItem*) addFolderWithTitle:(NSString*)title - atIndex:(int)index; -// Removes a child bookmark; returns YES on success, NO on failure. -- (BOOL) removeChild:(BookmarkItem*)child; - -// Open a bookmark in a tab. -- (BOOL)open; - -// Called to tell the object that its underlying BookmarkNode has changed. -- (void)nodeChanged; - -// The default bookmark favicon. -+ (NSImage*)defaultIcon; -// The default folder favicon. -+ (NSImage*)folderIcon; -@end - - -// A subclass of BookmarkItem for folders that don't actually exist in the tree. -@interface FakeBookmarkItem : BookmarkItem { - NSString* title_; - BookmarkItem* parent_; - NSArray* children_; -} - -- (id)initWithTitle:(NSString*)title - icon:(NSImage*)icon - manager:(BookmarkManagerController*)manager; - -// Parent is settable. -@property (readwrite, assign) BookmarkItem* parent; -// Children are settable. -@property (readwrite, copy) NSArray* children; -@end diff --git a/chrome/browser/cocoa/bookmark_item.mm b/chrome/browser/cocoa/bookmark_item.mm deleted file mode 100644 index a31e00f..0000000 --- a/chrome/browser/cocoa/bookmark_item.mm +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "bookmark_item.h" - -#include "app/resource_bundle.h" -#include "base/mac_util.h" -#include "base/sys_string_conversions.h" -#include "chrome/browser/bookmarks/bookmark_model.h" -#include "chrome/browser/browser.h" -#include "chrome/browser/browser_list.h" -#include "chrome/browser/browser_window.h" -#import "chrome/browser/cocoa/bookmark_manager_controller.h" -#include "grit/app_resources.h" -#include "grit/theme_resources.h" -#include "skia/ext/skia_utils_mac.h" - - -static GURL ConvertToGURL(NSString* urlStr) { - DCHECK(urlStr); - GURL url(base::SysNSStringToUTF8(urlStr)); - if (!url.is_valid()) { - // Mimic observed friendliness from Windows - urlStr = [@"http://" stringByAppendingString:urlStr]; - GURL fixedURL(base::SysNSStringToUTF8(urlStr)); - if (fixedURL.is_valid()) - url = fixedURL; - } - return url; -} - - -@implementation BookmarkItem - -@synthesize node = node_; - -- (id)initWithBookmarkNode:(const BookmarkNode*)node - manager:(BookmarkManagerController*)manager { - DCHECK(manager); - self = [super init]; - if (self) { - node_ = node; - manager_ = manager; - } - return self; -} - -- (NSString*)description { - return [NSString stringWithFormat:@"%@[%@]", [self class], [self title]]; -} - -- (NSString*)title { - return base::SysWideToNSString(node_->GetTitle()); -} - -- (void)setTitle:(NSString*)title { - DCHECK(![self isFixed]); - [manager_ bookmarkModel]->SetTitle(node_, base::SysNSStringToWide(title)); -} - -- (NSString*)URLString { - GURL url = node_->GetURL(); - if (url.is_empty()) - return nil; - return base::SysUTF8ToNSString(url.possibly_invalid_spec()); -} - -- (void)setURLString:(NSString*)urlStr { - DCHECK(![self isFolder]); - DCHECK(![self isFixed]); - GURL url = ConvertToGURL(urlStr); - if (url == node_->GetURL() || !url.is_valid()) - return; - - icon_.reset(nil); - // Create a new node with the updated URL. - BookmarkModel* model = [manager_ bookmarkModel]; - const BookmarkNode* parent = node_->GetParent(); - int index = parent->IndexOfChild(node_); - node_ = model->AddURLWithCreationTime(parent, index, node_->GetTitle(), - url, node_->date_added()); - // Tell the manager that the new node maps to me. - [manager_ remapItem:self forNode:node_]; - // Remove my old node. - model->Remove(parent, index + 1); -} - -- (BookmarkItem*)parent { - const BookmarkNode* parent = node_->GetParent(); - if (!parent || parent->IsRoot()) - return nil; - return [manager_ itemFromNode:parent]; -} - -- (NSString*)folderPath { - scoped_nsobject<NSMutableArray> path([[NSMutableArray alloc] init]); - for (BookmarkItem* folder = [self parent]; folder; folder = [folder parent]) { - [path insertObject:[folder title] atIndex:0]; - } - return [path componentsJoinedByString:@"/"]; -} - -- (BOOL)isFolder { - return node_->is_folder(); -} - -- (NSUInteger)numberOfChildren { - return node_->GetChildCount(); -} - -- (BookmarkItem*)childAtIndex:(NSUInteger)index { - return [manager_ itemFromNode:node_->GetChild(index)]; -} - -- (NSUInteger)indexOfChild:(BookmarkItem*)child { - DCHECK(child); - int index = node_->IndexOfChild([child node]); - return index >= 0 ? index : NSNotFound; -} - -- (BOOL)hasDescendant:(BookmarkItem*)item { - while (item) { - if (item == self) - return YES; - item = [item parent]; - } - return NO; -} - -- (BOOL)childAtIndexIsFolder:(NSUInteger)index { - return node_->GetChild(index)->is_folder(); -} - -- (NSUInteger)numberOfChildFolders { - int nChildren = [self numberOfChildren]; - NSUInteger nFolders = 0; - for (int i = 0; i < nChildren; i++) { - if ([self childAtIndexIsFolder:i]) - ++nFolders; - } - return nFolders; -} - -- (BookmarkItem*)childFolderAtIndex:(NSUInteger)index { - NSUInteger nChildren = [self numberOfChildren]; - for (NSUInteger i = 0; i < nChildren; i++) { - if ([self childAtIndexIsFolder:i]) { - if (index-- == 0) - return [self childAtIndex:i]; - } - } - NOTREACHED(); - return nil; -} - -- (NSUInteger)indexOfChildFolder:(BookmarkItem*)child { - const BookmarkNode* childNode = [child node]; - DCHECK(childNode); - NSUInteger folderIndex = 0; - NSUInteger nChildren = [self numberOfChildren]; - for (NSUInteger i = 0; i < nChildren; i++) { - if ([self childAtIndexIsFolder:i]) { - if ([self childAtIndex:i] == child) - return folderIndex; - ++folderIndex; - } - } - return NSNotFound; -} - -+ (NSImage*)defaultIcon { - static NSImage* sDefaultFavIcon = [ResourceBundle::GetSharedInstance(). - GetNSImageNamed(IDR_DEFAULT_FAVICON) retain]; - return sDefaultFavIcon; -} - -+ (NSImage*)folderIcon { - static NSImage* sFolderIcon = [ResourceBundle::GetSharedInstance(). - GetNSImageNamed(IDR_BOOKMARK_BAR_FOLDER) retain]; - return sFolderIcon; -} - -- (NSImage*)icon { - if (!icon_) { - // Lazily load icon. - NSImage* icon = [[self class] defaultIcon]; - if ([self isFolder]) { - icon = [[self class] folderIcon]; - } else if (node_ && node_->is_url()) { - const SkBitmap& skIcon = [manager_ bookmarkModel]->GetFavIcon(node_); - if (!skIcon.isNull()) { - icon = gfx::SkBitmapToNSImage(skIcon); - } - } - icon_.reset([icon retain]); - } - return icon_; -} - -- (id)persistentID { - DCHECK(node_); - return [NSNumber numberWithLongLong:node_->id()]; -} - -- (BookmarkItem*)itemWithPersistentID:(id)persistentID { - if ([persistentID isKindOfClass:[NSNumber class]]) { - int64 nodeID = [persistentID longLongValue]; - const BookmarkNode* node = [manager_ bookmarkModel]->GetNodeByID(nodeID); - return [manager_ itemFromNode:node]; - } - NOTREACHED(); - return nil; -} - -- (BOOL)isFake { - return NO; -} - -- (BOOL)isFixed { - BookmarkModel* model = [manager_ bookmarkModel]; - return node_ == model->GetBookmarkBarNode() || node_ == model->other_node(); -} - -// Open a bookmark, by having Chrome open a tab on its URL. -- (BOOL)open { - if (!node_ || !node_->is_url()) - return NO; - GURL url = node_->GetURL(); - if (url.is_empty()) - return NO; - - Browser* browser = BrowserList::GetLastActive(); - // if no browser window exists then create one with no tabs to be filled in - if (!browser) { - browser = Browser::Create([manager_ profile]); - browser->window()->Show(); - } - browser->OpenURL(url, GURL(), NEW_FOREGROUND_TAB, - PageTransition::AUTO_BOOKMARK); - return YES; -} - -- (void)moveItem:(BookmarkItem*)item toIndex:(int)index { - DCHECK(![item isFixed]); - const BookmarkNode* srcNode = [item node]; - DCHECK(srcNode); - DCHECK(node_); - [manager_ bookmarkModel]->Move(srcNode, node_, index); -} - -- (BookmarkItem*)addBookmarkWithTitle:(NSString*)title - URL:(NSString*)urlString - atIndex:(int)index{ - DCHECK(title); - DCHECK_GT([urlString length], 0U); - DCHECK([self isFolder]); - DCHECK(node_); - GURL url = ConvertToGURL(urlString); - if (!url.is_valid()) - return nil; - BookmarkModel* model = [manager_ bookmarkModel]; - const BookmarkNode* node = model->AddURL([self node], - index, - base::SysNSStringToWide(title), - url); - return [manager_ itemFromNode:node]; -} - -- (BookmarkItem*)addFolderWithTitle:(NSString*)title - atIndex:(int)index { - DCHECK(title); - DCHECK([self isFolder]); - DCHECK(node_); - BookmarkModel* model = [manager_ bookmarkModel]; - const BookmarkNode* node = model->AddGroup([self node], - index, - base::SysNSStringToWide(title)); - return [manager_ itemFromNode:node]; -} - -- (BOOL)removeChild:(BookmarkItem*)child { - DCHECK(![child isFixed]); - if (!node_) - return NO; - const BookmarkNode* childNode = [child node]; - if (!childNode) - return NO; - int index = node_->IndexOfChild(childNode); - if (index < 0) - return NO; - [manager_ bookmarkModel]->Remove(node_, index); - return YES; -} - -- (void)nodeChanged { - if (node_) - icon_.reset(nil); -} - -@end - - -@implementation FakeBookmarkItem - -@synthesize title = title_, parent = parent_, children = children_; - -- (id)initWithTitle:(NSString*)title - icon:(NSImage*)icon - manager:(BookmarkManagerController*)manager { - self = [super initWithBookmarkNode:nil manager:manager]; - if (self) { - title_ = [title copy]; - children_ = [[NSMutableArray alloc] init]; - icon_.reset([icon retain]); - } - return self; -} - -- (void)dealloc { - [title_ release]; - [children_ release]; - [super dealloc]; -} - -- (BOOL)isFolder { - return children_ != nil; -} - -- (NSUInteger)numberOfChildren { - return [children_ count]; -} - -- (BookmarkItem*)childAtIndex:(NSUInteger)index { - return [children_ objectAtIndex:index]; -} - -- (NSUInteger)indexOfChild:(BookmarkItem*)child { - return [children_ indexOfObjectIdenticalTo:child]; -} - -- (BOOL)childAtIndexIsFolder:(NSUInteger)index { - return [[children_ objectAtIndex:index] isFolder]; -} - -- (NSString*)URLString { - return nil; -} - -- (void)setURLString:(NSString*)urlStr { - NOTREACHED(); -} - -- (BOOL)isFake { - return YES; -} - -- (BOOL)isFixed { - return YES; -} - -@end diff --git a/chrome/browser/cocoa/bookmark_item_unittest.mm b/chrome/browser/cocoa/bookmark_item_unittest.mm deleted file mode 100644 index 64ca3c4..0000000 --- a/chrome/browser/cocoa/bookmark_item_unittest.mm +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/scoped_nsobject.h" -#include "base/sys_string_conversions.h" -#import "chrome/browser/cocoa/bookmark_item.h" -#import "chrome/browser/cocoa/bookmark_manager_controller.h" -#include "chrome/browser/cocoa/browser_test_helper.h" -#import "chrome/browser/cocoa/cocoa_test_helper.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" - -namespace { - -::testing::AssertionResult isEqual(id expected, id actual) { - if(expected == actual || [expected isEqual:actual]) - return ::testing::AssertionSuccess(); - else - return ::testing::AssertionFailure() - << "Actual value: " << base::SysNSStringToWide([actual description]); -} - -class BookmarkItemTest : public CocoaTest { - public: - void SetUp() { - CocoaTest::SetUp(); - manager_ = [BookmarkManagerController showBookmarkManager: - browser_test_helper_.profile()]; - ASSERT_TRUE(manager_); - model_ = [manager_ bookmarkModel]; - ASSERT_TRUE(model_); - EXPECT_EQ(browser_test_helper_.profile()->GetBookmarkModel(), model_); - barNode_ = model_->GetBookmarkBarNode(); - ASSERT_TRUE(barNode_); - bar_ = [manager_ itemFromNode:barNode_]; - ASSERT_TRUE(bar_); - } - - void AddTestBookmarks() { - model_->AddURL(barNode_, 0, L"bookmark0", GURL("http://example.com/0")); - model_->AddURL(barNode_, 1, L"bookmark1", GURL("http://example.com/1")); - model_->AddURL(barNode_, 2, L"bookmark3", GURL("http://example.com/3")); - const BookmarkNode* folder = model_->AddGroup(barNode_, 2, L"group"); - ASSERT_TRUE(folder); - model_->AddURL(folder, 0, L"nested0", GURL("http://example.com/n0")); - model_->AddURL(folder, 1, L"nested1", GURL("http://example.com/n1")); - } - - void TearDown() { - [manager_ close]; - CocoaTest::TearDown(); - } - - BrowserTestHelper browser_test_helper_; - BookmarkManagerController* manager_; - BookmarkModel* model_; - const BookmarkNode* barNode_; - const BookmarkItem* bar_; -}; - -TEST_F(BookmarkItemTest, RootItems) { - // Check the bookmarks-bar item: - EXPECT_EQ(barNode_, [bar_ node]); - EXPECT_EQ(bar_, [manager_ itemFromNode:barNode_]); - EXPECT_EQ(bar_, [manager_ bookmarkBarItem]); - EXPECT_TRUE([bar_ isFixed]); - EXPECT_FALSE([bar_ isFake]); - EXPECT_FALSE([bar_ parent]); - EXPECT_TRUE([bar_ isFolder]); - EXPECT_EQ(0U, [bar_ numberOfChildren]); - - // Check the 'others' item: - const BookmarkNode* otherNode = model_->other_node(); - ASSERT_TRUE(otherNode); - EXPECT_NE(barNode_, otherNode); - BookmarkItem* other = [manager_ itemFromNode:otherNode]; - ASSERT_TRUE(other); - EXPECT_EQ(otherNode, [other node]); - EXPECT_EQ(other, [manager_ itemFromNode:otherNode]); - EXPECT_EQ(other, [manager_ otherBookmarksItem]); - EXPECT_TRUE([other isFixed]); - EXPECT_FALSE([other isFake]); - EXPECT_FALSE([other parent]); - EXPECT_TRUE([other isFolder]); - EXPECT_EQ(0U, [other numberOfChildren]); - - EXPECT_NE(bar_, other); - EXPECT_FALSE(isEqual(bar_, other)); -} - -TEST_F(BookmarkItemTest, FakeItems) { - NSImage* icon = [NSImage imageNamed:@"NSApplicationIcon"]; - EXPECT_TRUE(icon); - FakeBookmarkItem* fake = [[FakeBookmarkItem alloc] initWithTitle:@"Fakir" - icon:icon - manager:manager_]; - [fake setChildren:nil]; - [fake autorelease]; - EXPECT_TRUE(isEqual(@"Fakir", [fake title])); - EXPECT_EQ(icon, [fake icon]); - EXPECT_TRUE([fake isFake]); - EXPECT_TRUE([fake isFixed]); - EXPECT_FALSE([fake parent]); - EXPECT_FALSE([fake isFolder]); - - NSArray* children = [NSArray arrayWithObject:bar_]; - FakeBookmarkItem* bogus = [[FakeBookmarkItem alloc] initWithTitle:@"Bogus" - icon:nil - manager:manager_]; - [bogus setChildren:children]; - [bogus autorelease]; - EXPECT_EQ([BookmarkItem folderIcon], [bogus icon]); - EXPECT_TRUE([bogus isFolder]); - EXPECT_TRUE(isEqual(children, [bogus children])); - ASSERT_EQ(1U, [bogus numberOfChildren]); - EXPECT_EQ(bar_, [bogus childAtIndex:0]); - - BookmarkItem* otherItem = [manager_ itemFromNode:model_->other_node()]; - children = [NSArray arrayWithObjects:bar_, otherItem, nil]; - [bogus setChildren:children]; - EXPECT_TRUE([bogus isFolder]); - EXPECT_TRUE(isEqual(children, [bogus children])); - EXPECT_EQ(2U, [bogus numberOfChildren]); - EXPECT_EQ(bar_, [bogus childAtIndex:0]); - EXPECT_EQ(otherItem, [bogus childAtIndex:1]); -} - -TEST_F(BookmarkItemTest, AddItems) { - BookmarkItem* item1 = [bar_ addBookmarkWithTitle:@"item1" - URL:@"http://example.com/item1" - atIndex:0]; - EXPECT_TRUE(isEqual(@"item1", [item1 title])); - EXPECT_TRUE(isEqual(@"http://example.com/item1", [item1 URLString])); - EXPECT_TRUE([item1 icon]); - EXPECT_FALSE([item1 isFixed]); - EXPECT_FALSE([item1 isFolder]); - EXPECT_EQ(bar_, [item1 parent]); - EXPECT_EQ(item1, [bar_ childAtIndex:0]); - - BookmarkItem* folder = [bar_ addFolderWithTitle:@"folder" - atIndex:1]; - EXPECT_TRUE(isEqual(@"folder", [folder title])); - EXPECT_FALSE([folder URLString]); - EXPECT_EQ([BookmarkItem folderIcon], [folder icon]); - EXPECT_FALSE([folder isFixed]); - EXPECT_TRUE([folder isFolder]); - ASSERT_EQ(0U, [folder numberOfChildren]); - EXPECT_EQ(bar_, [folder parent]); - EXPECT_EQ(folder, [bar_ childAtIndex:1]); - - BookmarkItem* item2 = [folder addBookmarkWithTitle:@"item2" - URL:@"http://example.com/item2" - atIndex:0]; - EXPECT_TRUE(isEqual(@"item2", [item2 title])); - EXPECT_TRUE(isEqual(@"http://example.com/item2", [item2 URLString])); - EXPECT_TRUE([item2 icon]); - EXPECT_FALSE([item2 isFixed]); - EXPECT_FALSE([item2 isFolder]); - EXPECT_EQ(folder, [item2 parent]); - EXPECT_EQ(item2, [folder childAtIndex:0]); - EXPECT_EQ(0U, [folder indexOfChild:item2]); -} - -TEST_F(BookmarkItemTest, URLEditing) { - BookmarkItem* item = [bar_ addBookmarkWithTitle:@"URL" - URL:@"http://www.google.com/" - atIndex:0]; - EXPECT_TRUE(item); - EXPECT_TRUE([@"http://www.google.com/" isEqual:[item URLString]]); - [item setURLString: @"http://www.google.com/chrome"]; - EXPECT_TRUE([@"http://www.google.com/chrome" isEqual:[item URLString]]); -} - -TEST_F(BookmarkItemTest, URLConversion) { - BookmarkItem* item = [bar_ addBookmarkWithTitle:@"fixable URL" - URL:@"www.google.com" - atIndex:0]; - EXPECT_TRUE(item); - EXPECT_TRUE([@"http://www.google.com/" isEqual:[item URLString]]); - - item = [bar_ addBookmarkWithTitle:@"bad URL" - URL:@"!$%@djd ^%QQQ" - atIndex:0]; - EXPECT_FALSE(item); -} - -TEST_F(BookmarkItemTest, Hierarchy) { - AddTestBookmarks(); - ASSERT_EQ(4U, [bar_ numberOfChildren]); - NSString* barTitle = [bar_ title]; - - // Check the bookmarks added to the bar. - BookmarkItem* item = [bar_ childAtIndex:0]; - EXPECT_TRUE(isEqual(@"bookmark0", [item title])); - EXPECT_TRUE(isEqual(@"http://example.com/0", [item URLString])); - EXPECT_FALSE([item isFixed]); - EXPECT_FALSE([item isFake]); - EXPECT_EQ(bar_, [item parent]); - EXPECT_FALSE([item isFolder]); - EXPECT_TRUE(isEqual(barTitle, [item folderPath])); - - item = [bar_ childAtIndex:1]; - EXPECT_TRUE(isEqual(@"bookmark1", [item title])); - EXPECT_TRUE(isEqual(@"http://example.com/1", [item URLString])); - EXPECT_FALSE([item isFixed]); - EXPECT_FALSE([item isFake]); - EXPECT_EQ(bar_, [item parent]); - EXPECT_FALSE([item isFolder]); - - item = [bar_ childAtIndex:3]; - EXPECT_TRUE(isEqual(@"bookmark3", [item title])); - EXPECT_TRUE(isEqual(@"http://example.com/3", [item URLString])); - EXPECT_FALSE([item isFixed]); - EXPECT_FALSE([item isFake]); - EXPECT_EQ(bar_, [item parent]); - EXPECT_FALSE([item isFolder]); - - // Check the subfolder. - BookmarkItem* folder = [bar_ childAtIndex:2]; - EXPECT_TRUE(isEqual(@"group", [folder title])); - EXPECT_EQ(0U, [[folder URLString] length]); - EXPECT_FALSE([item isFixed]); - EXPECT_FALSE([folder isFake]); - EXPECT_EQ(bar_, [folder parent]); - EXPECT_TRUE([folder isFolder]); - ASSERT_EQ(2U, [folder numberOfChildren]); - EXPECT_TRUE(isEqual(barTitle, [folder folderPath])); - - // Check items in subfolder. - item = [folder childAtIndex:0]; - EXPECT_TRUE(isEqual(@"nested0", [item title])); - EXPECT_TRUE(isEqual(@"http://example.com/n0", [item URLString])); - EXPECT_FALSE([item isFixed]); - EXPECT_FALSE([item isFake]); - EXPECT_EQ(folder, [item parent]); - EXPECT_FALSE([item isFolder]); - EXPECT_TRUE(isEqual([barTitle stringByAppendingString:@"/group"], - [item folderPath])); - - item = [folder childAtIndex:1]; - EXPECT_TRUE(isEqual(@"nested1", [item title])); - EXPECT_TRUE(isEqual(@"http://example.com/n1", [item URLString])); - EXPECT_FALSE([item isFixed]); - EXPECT_FALSE([item isFake]); - EXPECT_EQ(folder, [item parent]); - EXPECT_FALSE([item isFolder]); -} - -} // namespace diff --git a/chrome/browser/cocoa/bookmark_manager_controller.h b/chrome/browser/cocoa/bookmark_manager_controller.h deleted file mode 100644 index 5c30875..0000000 --- a/chrome/browser/cocoa/bookmark_manager_controller.h +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import <Cocoa/Cocoa.h> -#include "base/scoped_nsobject.h" -#include "base/scoped_ptr.h" - -@class BookmarkItem; -@class BookmarkTreeController; -class BookmarkManagerBridge; -class BookmarkModel; -class BookmarkNode; -@class FakeBookmarkItem; -class Profile; - -// Controller for the bookmark manager window. There is at most one instance. -@interface BookmarkManagerController : NSWindowController { - @private - IBOutlet NSSearchField* searchField_; - IBOutlet NSSegmentedControl* addRemoveButton_; - IBOutlet NSPopUpButton* actionButton_; - IBOutlet BookmarkTreeController* groupsController_; - IBOutlet BookmarkTreeController* listController_; - - Profile* profile_; // weak - scoped_ptr<BookmarkManagerBridge> bridge_; - scoped_nsobject<NSMapTable> nodeMap_; - scoped_nsobject<FakeBookmarkItem> root_; // Root of tree - scoped_nsobject<FakeBookmarkItem> searchGroup_; // Search Results group item - scoped_nsobject<FakeBookmarkItem> recentGroup_; // Recently-Added group item - scoped_nsobject<BookmarkItem> preSearchGroup_; // Selected before search -} - -// Opens the bookmark manager window, or brings it to the front if it's open. -+ (BookmarkManagerController*)showBookmarkManager:(Profile*)profile; - -// The user Profile. -@property (readonly) Profile* profile; - -// The BookmarkModel of the manager's Profile. -@property (readonly) BookmarkModel* bookmarkModel; - -@property (readonly) BookmarkItem* bookmarkBarItem; -@property (readonly) BookmarkItem* otherBookmarksItem; - -// Maps C++ BookmarkNode objects to Objective-C BookmarkItems. -- (BookmarkItem*)itemFromNode:(const BookmarkNode*)node; - -// Shows a group and its contents. -- (void)showGroup:(BookmarkItem*)group; -// Shows and selects a particular bookmark in its group. -- (BOOL)revealItem:(BookmarkItem*)item; - -- (void)setSearchString:(NSString*)string; - -// Called by the toolbar search field after the user changes its text. -- (IBAction)searchFieldChanged:(id)sender; -// Called by the toolbar item; forwards to the focused tree controller. -- (IBAction)delete:(id)sender; -// Called by add/remove button. -- (IBAction)segmentedControlClicked:(id)sender; - -// Updates the node->item mapping; called only by BookmarkItem itself! -- (void)remapItem:(BookmarkItem*)item forNode:(const BookmarkNode*)node; -@end - - -// Exposed only for unit tests. -@interface BookmarkManagerController (UnitTesting) - -- (void)forgetNode:(const BookmarkNode*)node; -@property (readonly) BookmarkTreeController* groupsController; -@property (readonly) BookmarkTreeController* listController; -@property (readonly) FakeBookmarkItem* searchGroup; -@property (readonly) FakeBookmarkItem* recentGroup; - -@end diff --git a/chrome/browser/cocoa/bookmark_manager_controller.mm b/chrome/browser/cocoa/bookmark_manager_controller.mm deleted file mode 100644 index 99f57b0..0000000 --- a/chrome/browser/cocoa/bookmark_manager_controller.mm +++ /dev/null @@ -1,577 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "chrome/browser/cocoa/bookmark_manager_controller.h" - -#include "app/l10n_util_mac.h" -#include "app/resource_bundle.h" -#include "base/logging.h" -#include "base/mac_util.h" -#include "base/sys_string_conversions.h" -#include "chrome/app/chrome_dll_resource.h" -#include "chrome/browser/bookmarks/bookmark_model.h" -#include "chrome/browser/bookmarks/bookmark_model_observer.h" -#include "chrome/browser/bookmarks/bookmark_utils.h" -#import "chrome/browser/cocoa/bookmark_item.h" -#import "chrome/browser/cocoa/bookmark_tree_controller.h" -#import "chrome/browser/cocoa/browser_window_controller.h" -#include "chrome/browser/pref_service.h" -#include "chrome/browser/profile.h" -#include "chrome/common/pref_names.h" -#include "grit/app_resources.h" -#include "grit/generated_resources.h" -#include "grit/theme_resources.h" - - -// Max number of recently-added bookmarks to show. -static const int kMaxRecents = 200; - -// There's at most one BookmarkManagerController at a time. This points to it. -static BookmarkManagerController* sInstance; - - -@interface BookmarkManagerController () -- (void)nodeChanged:(const BookmarkNode*)node - childrenChanged:(BOOL)childrenChanged; -- (void)updateRecents; -- (void)setupActionMenu; -@end - - -// Adapter to tell BookmarkManagerController when bookmarks change. -class BookmarkManagerBridge : public BookmarkModelObserver { - public: - BookmarkManagerBridge(BookmarkManagerController* manager) - :manager_(manager) { } - - virtual void Loaded(BookmarkModel* model) { - // Ignore this; model has already loaded by this point. - } - - virtual void BookmarkNodeMoved(BookmarkModel* model, - const BookmarkNode* old_parent, - int old_index, - const BookmarkNode* new_parent, - int new_index) { - [manager_ nodeChanged:old_parent childrenChanged:YES]; - [manager_ nodeChanged:new_parent childrenChanged:YES]; - } - - virtual void BookmarkNodeAdded(BookmarkModel* model, - const BookmarkNode* parent, - int index) { - [manager_ nodeChanged:parent childrenChanged:YES]; - } - - virtual void BookmarkNodeRemoved(BookmarkModel* model, - const BookmarkNode* parent, - int old_index, - const BookmarkNode* node) { - [manager_ nodeChanged:parent childrenChanged:YES]; - [manager_ forgetNode:node]; - } - - virtual void BookmarkNodeChanged(BookmarkModel* model, - const BookmarkNode* node) { - [manager_ nodeChanged:node childrenChanged:NO]; - } - - virtual void BookmarkNodeFavIconLoaded(BookmarkModel* model, - const BookmarkNode* node) { - [manager_ nodeChanged:node childrenChanged:NO]; - } - - virtual void BookmarkNodeChildrenReordered(BookmarkModel* model, - const BookmarkNode* node) { - [manager_ nodeChanged:node childrenChanged:YES]; - } - - private: - BookmarkManagerController* manager_; // weak -}; - - -@implementation BookmarkManagerController - - -@synthesize profile = profile_; - -// Private instance initialization method. -- (id)initWithProfile:(Profile*)profile { - // Use initWithWindowNibPath:: instead of initWithWindowNibName: so we - // can override it in a unit test. - NSString* nibPath = [mac_util::MainAppBundle() - pathForResource:@"BookmarkManager" - ofType:@"nib"]; - self = [super initWithWindowNibPath:nibPath owner:self]; - if (self != nil) { - // Never use an incognito Profile, which can be deleted at any moment when - // the user closes its browser window. Use the default one instead. - DCHECK(profile); - profile_ = profile->GetOriginalProfile(); - - bridge_.reset(new BookmarkManagerBridge(self)); - profile_->GetBookmarkModel()->AddObserver(bridge_.get()); - - // Initialize the Recents and Search Results groups: - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - NSImage* recentIcon = rb.GetNSImageNamed(IDR_BOOKMARK_MANAGER_RECENT_ICON); - recentGroup_.reset([[FakeBookmarkItem alloc] initWithTitle:@"Recently Added" - icon:recentIcon - manager:self]); - NSImage* searchIcon = rb.GetNSImageNamed(IDR_BOOKMARK_MANAGER_SEARCH_ICON); - searchGroup_.reset([[FakeBookmarkItem alloc] initWithTitle:@"Search Results" - icon:searchIcon - manager:self]); - } - return self; -} - -- (void)dealloc { - if (self == sInstance) { - sInstance = nil; - } - [groupsController_ removeObserver:self forKeyPath:@"selectedItem"]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; - if (bridge_.get()) - profile_->GetBookmarkModel()->RemoveObserver(bridge_.get()); - [super dealloc]; -} - -- (void)awakeFromNib { - // Set up the action button's menu. - [self setupActionMenu]; - - // Set the tooltips of the +/- buttons. Chrome's automatic UI localization - // doesn't know about tooltips of NSSegmentedCells. - NSSegmentedCell* cell = [addRemoveButton_ cell]; - [cell setToolTip:l10n_util::GetNSString( - IDS_BOOKMARK_MANAGER_TOOLTIP_NEW_FOLDER_MAC) - forSegment:0]; - [cell setToolTip:l10n_util::GetNSString( - IDS_BOOKMARK_MANAGER_TOOLTIP_DELETE_MAC) - forSegment:1]; - - // Synthesize the hierarchy of the left-hand outline view. - BookmarkModel* model = [self bookmarkModel]; - BookmarkItem* bar = [self itemFromNode:model->GetBookmarkBarNode()]; - BookmarkItem* other = [self itemFromNode:model->other_node()]; - NSArray* rootItems = [NSArray arrayWithObjects: - bar, - other, - recentGroup_.get(), - nil]; - root_.reset([[FakeBookmarkItem alloc] initWithTitle:@"" - icon:nil - manager:self]); - [root_ setChildren:rootItems]; - [recentGroup_ setParent:root_]; - [searchGroup_ setParent:root_]; - [groupsController_ setGroup:root_]; - - // Turning on autosave also loads and applies the settings, which we couldn't - // do until setting up the data model, above. - NSOutlineView* outline = [groupsController_ outline]; - [outline setAutosaveExpandedItems:YES]; - if (![outline isItemExpanded:bar] && ![outline isItemExpanded:other]) { - // By default, expand the Bookmarks Bar and Other: - [groupsController_ expandItem:bar]; - [groupsController_ expandItem:other]; - } - - // The Source-List style on the group outline has less space between rows, - // so compensate for this by increasing the spacing: - NSSize spacing = [[groupsController_ outline] intercellSpacing]; - spacing.height += 2; - [[groupsController_ outline] setIntercellSpacing:spacing]; - - [listController_ setShowsLeaves:YES]; - [listController_ setFlat:YES]; - - // Observe selection changes in the groups outline. - [groupsController_ addObserver:self - forKeyPath:@"selectedItem" - options:NSKeyValueObservingOptionInitial - context:NULL]; - - // Register windowDidUpdate: to be called after every user event. - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(windowDidUpdate:) - name:NSWindowDidUpdateNotification - object:[self window]]; -} - -// When window closes, get rid of myself too. (NSWindow delegate) -- (void)windowWillClose:(NSNotification*)n { - [self autorelease]; -} - - -#pragma mark - -#pragma mark ACCESSORS: - - -// can't synthesize category methods, unfortunately -- (BookmarkTreeController*)groupsController { - return groupsController_; -} - -- (BookmarkTreeController*)listController { - return listController_; -} - -// Returns the groups or list controller, whichever one has focus. -- (BookmarkTreeController*)focusedController { - id first = [[self window] firstResponder]; - if ([first isKindOfClass:[BookmarksOutlineView class]]) - return [(BookmarksOutlineView*)first bookmarkController]; - return nil; -} - -- (FakeBookmarkItem*)recentGroup { - return recentGroup_; -} - -- (FakeBookmarkItem*)searchGroup { - return searchGroup_; -} - -- (void)setSearchString:(NSString*)string { - [searchField_ setStringValue:string]; - [self searchFieldChanged:self]; -} - - -#pragma mark - -#pragma mark DATA MODEL: - - -// Getter for the |bookmarkModel| property. -- (BookmarkModel*)bookmarkModel { - return profile_->GetBookmarkModel(); -} - -// Maps a BookmarkNode to a table/outline row item placeholder. -- (BookmarkItem*)itemFromNode:(const BookmarkNode*)node { - if (!node) - return nil; - if (!nodeMap_) { - nodeMap_.reset([[NSMapTable alloc] - initWithKeyOptions:NSPointerFunctionsOpaqueMemory | - NSPointerFunctionsOpaquePersonality - valueOptions:NSPointerFunctionsStrongMemory - capacity:500]); - } - BookmarkItem* item = (BookmarkItem*)NSMapGet(nodeMap_, node); - if (!item) { - item = [[BookmarkItem alloc] initWithBookmarkNode:node manager:self]; - NSMapInsertKnownAbsent(nodeMap_, node, item); - [item release]; - } - return item; -} - -- (BookmarkItem*)bookmarkBarItem { - return [self itemFromNode:[self bookmarkModel]->GetBookmarkBarNode()]; -} - -- (BookmarkItem*)otherBookmarksItem { - return [self itemFromNode:[self bookmarkModel]->other_node()]; -} - -// Updates the mapping; called by a BookmarkItem if it changes its node. -- (void)remapItem:(BookmarkItem*)item forNode:(const BookmarkNode*)node { - NSMapInsert(nodeMap_, node, item); -} - -// Removes a BookmarkNode from the node<->item mapping table. -- (void)forgetNode:(const BookmarkNode*)node { - NSMapRemove(nodeMap_, node); - for (int i = node->GetChildCount() - 1 ; i >= 0 ; i--) { - [self forgetNode:node->GetChild(i)]; - } - - if (node == [preSearchGroup_ node]) - preSearchGroup_.reset(); -} - -// Called when the bookmark model changes; forwards to the sub-controllers. -- (void)itemChanged:(BookmarkItem*)item - childrenChanged:(BOOL)childrenChanged { - if (item) { - [item nodeChanged]; - [groupsController_ itemChanged:item childrenChanged:childrenChanged]; - [listController_ itemChanged:item childrenChanged:childrenChanged]; - } - - // Update the recents or search results if they're visible. - if ([groupsController_ selectedItem] == searchGroup_.get()) - [self searchFieldChanged:self]; - if ([groupsController_ selectedItem] == recentGroup_.get()) - [self updateRecents]; -} - -// Called when the bookmark model changes; forwards to the sub-controllers. -- (void)nodeChanged:(const BookmarkNode*)node - childrenChanged:(BOOL)childrenChanged { - BookmarkItem* item = (BookmarkItem*)NSMapGet(nodeMap_, node); - if (item) { - [self itemChanged:item childrenChanged:childrenChanged]; - } -} - -- (void)updateRecents { - typedef std::vector<const BookmarkNode*> NodeVector; - NodeVector nodes; - bookmark_utils::GetMostRecentlyAddedEntries( - [self bookmarkModel], kMaxRecents, &nodes); - - // Update recentGroup_: - NSMutableArray* result = [NSMutableArray arrayWithCapacity:nodes.size()]; - for (NodeVector::iterator it = nodes.begin(); it != nodes.end(); ++it) { - [result addObject:[self itemFromNode:*it]]; - } - if (![result isEqual:[recentGroup_ children]]) { - [recentGroup_ setChildren:result]; - [self itemChanged:recentGroup_ childrenChanged:YES]; - } -} - -- (void)updateSearch { - typedef std::vector<const BookmarkNode*> MatchVector; - MatchVector matches; - NSString* searchString = [searchField_ stringValue]; - if ([searchString length] > 0) { - // Search in the BookmarkModel: - std::wstring text = base::SysNSStringToWide(searchString); - bookmark_utils::GetBookmarksContainingText( - [self bookmarkModel], - base::SysNSStringToWide(searchString), - std::numeric_limits<int>::max(), // unlimited result count - profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), - &matches); - } - - // Update contents of searchGroup_: - NSMutableArray* result = [NSMutableArray arrayWithCapacity:matches.size()]; - for (MatchVector::iterator it = matches.begin(); it != matches.end(); ++it) { - [result addObject:[self itemFromNode:*it]]; - } - if (![result isEqual:[searchGroup_ children]]) { - [searchGroup_ setChildren:result]; - [self itemChanged:searchGroup_ childrenChanged:YES]; - } - - // Show searchGroup_ if it's not visible yet: - NSArray* rootItems = [root_ children]; - if (![rootItems containsObject:searchGroup_]) { - [root_ setChildren:[rootItems arrayByAddingObject:searchGroup_]]; - [self itemChanged:root_ childrenChanged:YES]; - } -} - -- (void)selectedGroupChanged { - BOOL showFolders = YES; - BookmarkItem* group = [groupsController_ selectedItem]; - if (group == recentGroup_.get()) - [self updateRecents]; - else if (group == searchGroup_.get()) - [self updateSearch]; - else - showFolders = NO; - [listController_ setGroup:group]; - [listController_ setShowsFolderColumn:showFolders]; -} - -- (void)observeValueForKeyPath:(NSString*)keyPath - ofObject:(id)object - change:(NSDictionary*)change - context:(void*)context { - if (object == groupsController_) - [self selectedGroupChanged]; -} - - -#pragma mark - -#pragma mark ACTIONS: - - -// Public entry point to open the bookmark manager. -+ (BookmarkManagerController*)showBookmarkManager:(Profile*)profile -{ - if (!sInstance) { - sInstance = [[self alloc] initWithProfile:profile]; - } - [sInstance showWindow:self]; - return sInstance; -} - -- (void)showGroup:(BookmarkItem*)group { - [groupsController_ revealItem:group]; -} - -// Makes an item visible and selects it. -- (BOOL)revealItem:(BookmarkItem*)item { - return [groupsController_ revealItem:[item parent]] && - [listController_ revealItem:item]; -} - -// Shows/hides the "Search Results" item. -- (void)setSearchGroupVisible:(BOOL)visible { - NSMutableArray* rootItems = [NSMutableArray arrayWithArray:[root_ children]]; - if (visible != [rootItems containsObject:searchGroup_]) { - if (visible) { - [rootItems addObject:searchGroup_]; - } else { - [rootItems removeObject:searchGroup_]; - } - [root_ setChildren:rootItems]; - [self itemChanged:root_ childrenChanged:YES]; - } -} - -// Called when the user modifies the search field. -- (IBAction)searchFieldChanged:(id)sender { - [self updateSearch]; - if ([[searchField_ stringValue] length]) { - // There is search text. Show searchGroup_ if it's not visible yet: - [self setSearchGroupVisible:YES]; - - BookmarkItem *sel = [groupsController_ selectedItem]; - if (sel != searchGroup_.get()) { - // Remember which group used to be selected. - preSearchGroup_.reset([sel retain]); - // And select searchGroup_. - [self showGroup:searchGroup_]; - } - - } else { - // No search text. Restore the pre-search group selction: - if (preSearchGroup_.get()) { - if ([groupsController_ selectedItem] == searchGroup_.get()) { - [self showGroup:preSearchGroup_]; - } - preSearchGroup_.reset(); - } - // Hide the Search Results group: - [self setSearchGroupVisible:NO]; - } -} - -- (IBAction)segmentedControlClicked:(id)sender { - BookmarkTreeController* controller = [self focusedController]; - DCHECK(controller); - NSSegmentedCell* cell = [sender cell]; - switch ([cell tagForSegment:[cell selectedSegment]]) { - case 0: - [controller newFolder:sender]; - break; - case 1: - [controller delete:sender]; - break; - default: - NOTREACHED(); - } -} - -- (IBAction)delete:(id)sender { - [[self focusedController] delete:sender]; -} - -- (IBAction)openItems:(id)sender { - [[self focusedController] openItems:sender]; -} - -- (IBAction)revealSelectedItem:(id)sender { - [[self focusedController] revealSelectedItem:sender]; -} - -- (IBAction)editTitle:(id)sender { - [[self focusedController] editTitle:sender]; -} - -// Called when the user picks a menu or toolbar item when this window is key. -- (void)commandDispatch:(id)sender { - // Copied from app_controller_mac.mm: - // Handle the case where we're dispatching a command from a sender that's in a - // browser window. This means that the command came from a background window - // and is getting here because the foreground window is not a browser window. - if ([sender respondsToSelector:@selector(window)]) { - id delegate = [[sender window] windowController]; - if ([delegate isKindOfClass:[BrowserWindowController class]]) { - [delegate commandDispatch:sender]; - return; - } - } - - switch ([sender tag]) { - case IDC_FIND: - [[self window] makeFirstResponder:searchField_]; - break; - case IDC_SHOW_BOOKMARK_MANAGER: - // The Bookmark Manager menu command _closes_ the window if it's frontmost. - [self close]; - break; - default: { - // Forward other commands to the AppController -- New Window etc. - [[NSApp delegate] commandDispatch:sender]; - break; - } - } -} - -- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item { - SEL action = [item action]; - if (action == @selector(commandDispatch:) || - action == @selector(commandDispatchUsingKeyModifiers:)) { - NSInteger tag = [item tag]; - if (tag == IDC_FIND || tag == IDC_SHOW_BOOKMARK_MANAGER) - return YES; - // Let the AppController validate other commands -- New Window etc. - return [[NSApp delegate] validateUserInterfaceItem:item]; - } else if (action == @selector(newFolder:) || - action == @selector(delete:) || - action == @selector(openItems:) || - action == @selector(revealSelectedItem:) || - action == @selector(editTitle:)) { - return [[self focusedController] validateUserInterfaceItem:item]; - } - return YES; -} - -- (void)windowDidUpdate:(NSNotification*)n { - // After any event, enable/disable the buttons: - BookmarkTreeController* tree = [self focusedController]; - [addRemoveButton_ setEnabled:[tree validateAction:@selector(newFolder:)] - forSegment:0]; - [addRemoveButton_ setEnabled:[tree validateAction:@selector(delete:)] - forSegment:1]; -} - - -// Generates the pull-down menu for the "action" (gear) button. -- (void)setupActionMenu { - static const int kMenuActionsCount = 3; - const struct {int title; SEL action;} kMenuActions[kMenuActionsCount] = { - {IDS_BOOMARK_BAR_OPEN_IN_NEW_TAB, @selector(openItems:)}, - {IDS_BOOKMARK_BAR_EDIT, @selector(editTitle:)}, - {IDS_BOOKMARK_MANAGER_SHOW_IN_FOLDER, @selector(revealSelectedItem:)}, - }; - - [actionButton_ setTarget:self]; - NSMenu* menu = [actionButton_ menu]; - for (int i = 0; i < kMenuActionsCount; i++) { - if (kMenuActions[i].action) { - NSString* title = l10n_util::GetNSStringWithFixup(kMenuActions[i].title); - [menu addItemWithTitle:title - action:kMenuActions[i].action - keyEquivalent:@""]; - [[[menu itemArray] lastObject] setTarget:self]; - } else { - [menu addItem:[NSMenuItem separatorItem]]; - } - } -} - -@end diff --git a/chrome/browser/cocoa/bookmark_manager_controller_unittest.mm b/chrome/browser/cocoa/bookmark_manager_controller_unittest.mm deleted file mode 100644 index 5f5c4cb..0000000 --- a/chrome/browser/cocoa/bookmark_manager_controller_unittest.mm +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/scoped_nsobject.h" -#import "chrome/browser/cocoa/bookmark_item.h" -#import "chrome/browser/cocoa/bookmark_manager_controller.h" -#import "chrome/browser/cocoa/bookmark_tree_controller.h" -#include "chrome/browser/cocoa/browser_test_helper.h" -#import "chrome/browser/cocoa/cocoa_test_helper.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" - -namespace { - -class BookmarkManagerControllerTest : public CocoaTest { - public: - void SetUp() { - CocoaTest::SetUp(); - controller_ = [BookmarkManagerController showBookmarkManager: - browser_test_helper_.profile()]; - ASSERT_TRUE(controller_); - } - - void TearDown() { - [controller_ close]; - CocoaTest::TearDown(); - } - - BookmarkItem* AddToBar(NSString*title, NSString* urlStr) { - BookmarkItem* bar = [controller_ bookmarkBarItem]; - return [bar addBookmarkWithTitle:title - URL:urlStr - atIndex:[bar numberOfChildren]]; - } - - NSSet* AddFixtureItems() { - return [NSSet setWithObjects: - AddToBar(@"Google", @"http://google.com"), - AddToBar(@"GMail", @"http://gmail.com"), - AddToBar(@"Google Sites", @"http://sites.google.com"), - nil]; - } - - bool SearchResultsVisible() { - NSOutlineView* outline = [[controller_ groupsController] outline]; - return [outline rowForItem:[controller_ searchGroup]] >= 0; - } - - BrowserTestHelper browser_test_helper_; - BookmarkManagerController* controller_; -}; - -TEST_F(BookmarkManagerControllerTest, IsThisThingTurnedOn) { - NSWindow* w = [controller_ window]; - ASSERT_TRUE(w); - EXPECT_TRUE([w isVisible]); - - ASSERT_TRUE([controller_ groupsController]); - ASSERT_TRUE([controller_ listController]); -} - -TEST_F(BookmarkManagerControllerTest, Model) { - BookmarkModel* model = [controller_ bookmarkModel]; - ASSERT_EQ(browser_test_helper_.profile()->GetBookmarkModel(), model); - - // Check the bookmarks-bar item: - const BookmarkNode* bar = model->GetBookmarkBarNode(); - ASSERT_TRUE(bar); - BookmarkItem* barItem = [controller_ itemFromNode:bar]; - ASSERT_TRUE(barItem); - ASSERT_EQ(barItem, [controller_ bookmarkBarItem]); - - // Check the 'others' item: - const BookmarkNode* other = model->other_node(); - ASSERT_TRUE(other); - EXPECT_NE(bar, other); - scoped_nsobject<BookmarkItem> otherItem( - [[controller_ itemFromNode:other] retain]); - ASSERT_TRUE(otherItem); - ASSERT_EQ(otherItem, [controller_ otherBookmarksItem]); - - EXPECT_NE(barItem, otherItem); - EXPECT_FALSE([barItem isEqual:otherItem]); - - EXPECT_EQ(bar, [barItem node]); - EXPECT_EQ(barItem, [controller_ itemFromNode:bar]); - EXPECT_EQ(other, [otherItem node]); - EXPECT_EQ(otherItem, [controller_ itemFromNode:other]); - - // Now tell it to forget 'other' and see if we get a different BookmarkItem: - [controller_ forgetNode:other]; - BookmarkItem* otherItem2 = [controller_ itemFromNode:other]; - EXPECT_TRUE(otherItem2); - EXPECT_NE(otherItem, otherItem2); -} - -TEST_F(BookmarkManagerControllerTest, Recents) { - NSSet* fixtures = AddFixtureItems(); - // Show the Recent Items group, so its contents will be updated. - FakeBookmarkItem* recents = [controller_ recentGroup]; - [controller_ showGroup:recents]; - NSSet* shown = [NSSet setWithArray:[recents children]]; - EXPECT_TRUE([fixtures isEqual:shown]); -} - -TEST_F(BookmarkManagerControllerTest, Search) { - AddFixtureItems(); - // Search for 'gmail': - [controller_ setSearchString:@"gmail"]; - FakeBookmarkItem* search = [controller_ searchGroup]; - EXPECT_EQ(search, [[controller_ groupsController] selectedItem]); - NSArray* shown = [search children]; - EXPECT_EQ(1U, [shown count]); - EXPECT_TRUE([@"GMail" isEqualToString:[[shown lastObject] title]]); - - // Search for 'google': - [controller_ setSearchString:@"google"]; - shown = [search children]; - EXPECT_EQ(2U, [shown count]); - - // Search for 'fnord': - [controller_ setSearchString:@"fnord"]; - shown = [search children]; - EXPECT_EQ(0U, [shown count]); -} - -TEST_F(BookmarkManagerControllerTest, SearchSelection) { - BookmarkTreeController* groupsController = [controller_ groupsController]; - AddFixtureItems(); - BookmarkItem* originalSelection = [controller_ bookmarkBarItem]; - EXPECT_FALSE(SearchResultsVisible()); - EXPECT_EQ(originalSelection, [groupsController selectedItem]); - - // Start a search and verify the search results group is selected. - [controller_ setSearchString:@"g"]; - EXPECT_TRUE(SearchResultsVisible()); - EXPECT_EQ([controller_ searchGroup], [groupsController selectedItem]); - - // Type some more, see if updating the search string works. - [controller_ setSearchString:@"gmail"]; - EXPECT_TRUE(SearchResultsVisible()); - EXPECT_EQ([controller_ searchGroup], [groupsController selectedItem]); - - // Clear search, verify search results are hidden and original sel restored. - [controller_ setSearchString:@""]; - EXPECT_FALSE(SearchResultsVisible()); - EXPECT_EQ(originalSelection, [groupsController selectedItem]); - - // Now search, then change the selection, then clear search: - [controller_ setSearchString:@"gmail"]; - EXPECT_TRUE(SearchResultsVisible()); - EXPECT_EQ([controller_ searchGroup], [groupsController selectedItem]); - BookmarkItem* newerSelection = [controller_ otherBookmarksItem]; - [controller_ showGroup:newerSelection]; - [controller_ setSearchString:@""]; - EXPECT_FALSE(SearchResultsVisible()); - EXPECT_EQ(newerSelection, [groupsController selectedItem]); -} - -} // namespace diff --git a/chrome/browser/cocoa/bookmark_tree_controller.h b/chrome/browser/cocoa/bookmark_tree_controller.h deleted file mode 100644 index 171e979..0000000 --- a/chrome/browser/cocoa/bookmark_tree_controller.h +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import <Cocoa/Cocoa.h> -#include <vector> - -@class BookmarkItem; -@class BookmarkManagerController; - - -// Controller for the bookmark tree view (the right pane). -@interface BookmarkTreeController : NSObject <NSUserInterfaceValidations> { - @private - IBOutlet NSOutlineView* outline_; - IBOutlet BookmarkManagerController* manager_; - BookmarkItem* group_; - BOOL showsLeaves_; - BOOL flat_; -} - -// If set, leaf (URL) bookmarks are shown; if not, they're hidden. -@property BOOL showsLeaves; -// If set, displays a flat list (no hierarchy). -@property BOOL flat; -// Controls the visibility of the "Folder" column (used with search/recents.) -@property BOOL showsFolderColumn; - -// The top-level bookmark folder used as the root of the outline's tree. -// Observable, bindable. -@property (assign) BookmarkItem* group; -// Controls whether leaf bookmarks or just folders are shown. -// The currently selected item(s) in the outline. (Observable.) -@property (retain) NSArray* selectedItems; -// The currently selected single item; nil on multiple selection. (Observable.) -@property (retain) BookmarkItem* selectedItem; -// The currently selected or right-clicked items, for commands to act on. -@property (readonly) NSArray* actionItems; - -// The parent folder and index at which items should be inserted/pasted. -// Returns NO if insertion is not allowed. -- (BOOL)getInsertionParent:(BookmarkItem**)outParent - index:(NSUInteger*)outIndex; -// Just returns whether insertion is allowed. -- (BOOL)canInsert; - -// Expands a folder item (including any parent folders). -// Returns YES on success, NO if it couldn't find the folder. -- (BOOL)expandItem:(BookmarkItem*)item; -// Expands parent folders, selects the item, and scrolls it into view: -// Returns YES on success, NO if it couldn't find the item. -- (BOOL)revealItem:(BookmarkItem*)item; - -// Action for the New Folder command. -- (IBAction)newFolder:(id)sender; - -// Action for the Delete command; also invoked by the delete key. -- (IBAction)delete:(id)sender; - -// Reveals the selected search/recent item in its real folder. -- (IBAction)revealSelectedItem:(id)sender; - -// Opens the selected bookmark(s) in new tabs. -- (IBAction)openItems:(id)sender; - -// Makes the selected bookmark's title editable. -- (IBAction)editTitle:(id)sender; - -// Returns YES if an action should be enabled. -- (BOOL)validateAction:(SEL)action; - -// Called by the BookmarkManagerController to notify the data model's changed. -- (void)itemChanged:(BookmarkItem*)nodeItem - childrenChanged:(BOOL)childrenChanged; - -@end - - -// Drag/drop and copy/paste methods -// (These are implemented in bookmark_tree_controller_paste.mm.) -@interface BookmarkTreeController (Pasteboard) -// One-time drag-n-drop setup; called from -awakeFromNib. -- (void)registerDragTypes; -- (IBAction)cut:(id)sender; -- (IBAction)copy:(id)sender; -- (IBAction)paste:(id)sender; -@end - - -// Exposed only for unit tests. -@interface BookmarkTreeController (UnitTesting) -@property (readonly) NSOutlineView* outline; -- (BookmarkItem*)newFolderWithTitle:(NSString*)title; -- (NSArray*)readPropertyListFromPasteboard:(NSPasteboard*)pb; -- (BOOL)copyToPasteboard:(NSPasteboard*)pb; -- (BOOL)pasteFromPasteboard:(NSPasteboard*)pb; -- (BookmarkItem*)itemForDropOnItem:(BookmarkItem*)item - proposedIndex:(NSInteger*)childIndex; -- (void)moveItems:(NSArray*)items - toFolder:(BookmarkItem*)dstParent - atIndex:(int)dstIndex; -@end - - -// Outline view for bookmark tree; handles Cut/Copy/Paste and Delete key. -@interface BookmarksOutlineView : NSOutlineView -// The owning BookmarkTreeController (same as the delegate). -@property (readonly) BookmarkTreeController* bookmarkController; -@end diff --git a/chrome/browser/cocoa/bookmark_tree_controller.mm b/chrome/browser/cocoa/bookmark_tree_controller.mm deleted file mode 100644 index fb0bc97..0000000 --- a/chrome/browser/cocoa/bookmark_tree_controller.mm +++ /dev/null @@ -1,536 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "chrome/browser/cocoa/bookmark_tree_controller.h" - -#include "app/l10n_util_mac.h" -#include "base/logging.h" -#import "chrome/browser/cocoa/bookmark_item.h" -#import "chrome/browser/cocoa/bookmark_manager_controller.h" -#include "grit/generated_resources.h" - -// Outline-view column identifiers. -static NSString* const kTitleColIdent = @"title"; -static NSString* const kURLColIdent = @"url"; -static NSString* const kFolderColIdent = @"folder"; - - -@implementation BookmarkTreeController - -@synthesize showsLeaves = showsLeaves_; - -// Initialization after the nib is loaded. -- (void)awakeFromNib { - [outline_ setTarget:self]; - [outline_ setDoubleAction:@selector(openItems:)]; - [outline_ setAutoresizesOutlineColumn:NO]; // Prevents issue 35031 - [self registerDragTypes]; -} - -- (BookmarkItem*)group { - return group_; -} - -- (void)setGroup:(BookmarkItem*)group { - if (group != group_) { - group_ = group; - - [outline_ deselectAll:self]; - [outline_ reloadData]; - [outline_ noteNumberOfRowsChanged]; - } -} - -- (NSOutlineView*)outline { - return outline_; -} - -- (BOOL)showsFolderColumn { - NSTableColumn* col = [outline_ tableColumnWithIdentifier:kFolderColIdent]; - return ![col isHidden]; -} - -- (void)setShowsFolderColumn:(BOOL)show { - NSTableColumn* col = [outline_ tableColumnWithIdentifier:kFolderColIdent]; - DCHECK(col); - if (show != ![col isHidden]) { - [col setHidden:!show]; - [outline_ sizeToFit]; - } -} - -- (BOOL)flat { - return flat_; -} - -- (void)setFlat:(BOOL)flat { - flat_ = flat; - [outline_ setIndentationPerLevel:flat ? 0.0 : 16.0]; -} - - -#pragma mark - -#pragma mark SELECTION: - -// Getter for the |selectedItems| property. -- (NSArray*)selectedItems { - NSMutableArray* items = [NSMutableArray array]; - NSIndexSet* selectedRows = [outline_ selectedRowIndexes]; - if (selectedRows != nil) { - for (NSInteger row = [selectedRows firstIndex]; row != NSNotFound; - row = [selectedRows indexGreaterThanIndex:row]) { - [items addObject:[outline_ itemAtRow:row]]; - } - } - return items; -} - -// Setter for the |selectedItems| property. -- (void)setSelectedItems:(NSArray*)items { - NSMutableIndexSet* newSelection = [NSMutableIndexSet indexSet]; - - for (NSUInteger i = 0; i < [items count]; i++) { - NSInteger row = [outline_ rowForItem:[items objectAtIndex:i]]; - if (row >= 0) { - [newSelection addIndex:row]; - } - } - - [outline_ selectRowIndexes:newSelection byExtendingSelection:NO]; -} - -- (BookmarkItem*)selectedItem { - BookmarkItem* selected = nil; - if ([outline_ numberOfSelectedRows] == 1) - selected = [outline_ itemAtRow:[outline_ selectedRow]]; - return selected; -} - -- (void)setSelectedItem:(BookmarkItem*)item { - [self setSelectedItems:item ? [NSArray arrayWithObject:item] : nil]; -} - -+ (NSArray*)keyPathsForValuesAffectingSelectedItem { - return [NSArray arrayWithObject:@"selectedItems"]; -} - -- (BOOL)selectionShouldChangeInOutlineView:(NSOutlineView*)outlineView { - [self willChangeValueForKey:@"selectedItems"]; - return YES; -} - -- (void)outlineViewSelectionDidChange:(NSNotification*)notification { - [self didChangeValueForKey:@"selectedItems"]; -} - -// Returns the selected/right-clicked item(s) for a command to act on. -- (NSArray*)actionItems { - int row = [outline_ clickedRow]; - if (row >= 0 && ![outline_ isRowSelected:row]) { - BookmarkItem* item = [outline_ itemAtRow:row]; - if (!item) - return nil; // clickedRow can occasionally return a nonexistent row - return [NSArray arrayWithObject:item]; - } - return [self selectedItems]; -} - -- (BOOL)expandItem:(BookmarkItem*)item { - if (!item) - return NO; - if (item == group_) - return YES; - if ([outline_ rowForItem:item] < 0) { - // If the item's not visible, expand its ancestors. - if (![self expandItem:[item parent]]) - return NO; - } - if (![outline_ isExpandable:item]) - return NO; - [outline_ expandItem:item]; - DCHECK([outline_ isItemExpanded:item]); - return YES; -} - -- (BOOL)revealItem:(BookmarkItem*)item { - if ([item parent] && ![self expandItem:[item parent]]) - return NO; - [outline_ scrollRowToVisible:[outline_ rowForItem:item]]; - [self setSelectedItems:[NSArray arrayWithObject:item]]; - return YES; -} - -- (BOOL)getInsertionParent:(BookmarkItem**)outParent - index:(NSUInteger*)outIndex { - NSArray* selItems = [self actionItems]; - NSUInteger numSelected = [selItems count]; - if (numSelected > 1) { - return NO; - } else if (numSelected == 1) { - // Insert at selected/clicked row. - BookmarkItem* selected = [selItems objectAtIndex:0]; - *outParent = [selected parent]; - if (*outParent && ![*outParent isFake]) - *outIndex = [*outParent indexOfChild:selected]; - else if ([selected isFolder]) { - // If root item like Bookmarks Bar selected, insert _into_ it. - *outParent = selected; - *outIndex = 0; - } - } else { - // Insert at very end if there's no selection: - *outParent = group_; - *outIndex = [group_ numberOfChildren]; - } - // Can't add to a fake group. - return *outParent && ![*outParent isFake]; -} - -- (BOOL)canInsert { - BookmarkItem* parent; - NSUInteger index; - return [self getInsertionParent:&parent index:&index]; -} - - -#pragma mark - -#pragma mark COMMANDS: - - -// Responds to a double-click by opening the selected URL(s). -- (IBAction)openItems:(id)sender { - for (BookmarkItem* item in [self actionItems]) { - if (![item isFolder]) { - [item open]; - } else if (flat_) { - [manager_ showGroup:item]; - } else { - if ([outline_ isItemExpanded:item]) - [outline_ collapseItem:item]; - else - [outline_ expandItem:item]; - } - } -} - -// The Delete command (also bound to the delete key.) -- (IBAction)delete:(id)sender { - NSArray* items = [self actionItems]; - // Iterate backwards so that any selected children are deleted before - // selected parents (opposite order could cause double-free!) - bool any = false; - if ([items count]) { - for (NSInteger i = [items count] - 1; i >= 0; i--) { - BookmarkItem* item = [items objectAtIndex:i]; - if ([[item parent] removeChild:item]) - any = true; - } - } - if (any) { - [outline_ reloadData]; - [outline_ deselectAll:self]; - } else { - NSBeep(); - } -} - -- (void)editTitleOfItem:(BookmarkItem*)item { - int row = [outline_ rowForItem:item]; - DCHECK(row >= 0); - [self setSelectedItem:item]; - [outline_ editColumn:[outline_ columnWithIdentifier:@"title"] - row:row - withEvent:[NSApp currentEvent] - select:YES]; -} - -- (IBAction)editTitle:(id)sender { - NSArray* items = [self actionItems]; - if ([items count] == 1) - [self editTitleOfItem:[items objectAtIndex:0]]; - else - NSBeep(); -} - -- (BookmarkItem*)newFolderWithTitle:(NSString*)title { - BookmarkItem* parent; - NSUInteger index; - if (![self getInsertionParent:&parent index:&index]) { - NSBeep(); - return nil; - } - // Create the folder, then select it and make the title editable: - BookmarkItem* folder = [parent addFolderWithTitle:title atIndex:index]; - [self revealItem:folder]; - return folder; -} - -- (IBAction)newFolder:(id)sender { - BookmarkItem* folder = [self newFolderWithTitle:@""]; - if (folder) - [self editTitleOfItem:folder]; -} - -- (IBAction)revealSelectedItem:(id)sender { - NSArray* selItems = [self actionItems]; - if ([selItems count] != 1 || - ![manager_ revealItem:[selItems objectAtIndex:0]]) - NSBeep(); - [[outline_ window] makeFirstResponder:outline_]; -} - -static void addItem(NSMenu* menu, int command, SEL action) { - [menu addItemWithTitle:l10n_util::GetNSStringWithFixup(command) - action:action - keyEquivalent:@""]; -} - -// Generates a context menu for the outline view. -- (NSMenu*)menu { - NSMenu* menu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - addItem(menu, IDS_BOOMARK_BAR_OPEN_IN_NEW_TAB, @selector(openItems:)); - if (showsLeaves_) { - addItem(menu, IDS_BOOKMARK_MANAGER_SHOW_IN_FOLDER, - @selector(revealSelectedItem:)); - } - [menu addItem:[NSMenuItem separatorItem]]; - addItem(menu, IDS_BOOKMARK_BAR_EDIT, @selector(editTitle:)); - addItem(menu, IDS_BOOKMARK_BAR_REMOVE, @selector(delete:)); - [menu addItem:[NSMenuItem separatorItem]]; - addItem(menu, IDS_BOOMARK_BAR_NEW_FOLDER, @selector(newFolder:)); - for (NSMenuItem* item in [menu itemArray]) - [item setTarget:self]; - return menu; -} - -// Selectively enables/disables menu commands. -- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item { - return [self validateAction:[item action]]; -} - -- (BOOL)validateAction:(SEL)action { - NSArray* selected = [self actionItems]; - NSUInteger selCount = [selected count]; - if (action == @selector(copy:)) { - return selCount > 0; - - } else if (action == @selector(cut:) || action == @selector(delete:)) { - if (selCount == 0) - return NO; - for(BookmarkItem* item in selected) { - if ([item isFixed]) - return NO; - } - return YES; - - } else if (action == @selector(paste:)) { - return [self canInsert] && - [[NSPasteboard generalPasteboard] availableTypeFromArray: - [outline_ registeredDraggedTypes]] != nil; - - } else if (action == @selector(openItems:)) { - if (selCount == 0) - return NO; - // Disable if folder selected (if only because title says "Open In Tab".) - for (BookmarkItem* item in selected) { - if (![item URLString]) - return NO; - } - return YES; - - } else if (action == @selector(editTitle:)) { - return selCount == 1 && ![[selected lastObject] isFixed]; - - } else if (action == @selector(newFolder:)) { - return [self canInsert]; - - } else if (action == @selector(revealSelectedItem:)) { - // Enable Show In Folder only in the flat list when - // showing Recents or Search, and a URL is selected. - return flat_ && [group_ isFake] && - selCount == 1 && [[selected lastObject] URLString]; - - } else { - return YES; - } -} - - -#pragma mark - -#pragma mark DATA SOURCE: - - -// Returns the number of children of an item (NSOutlineView data source) -- (NSInteger) outlineView:(NSOutlineView*)outlineView - numberOfChildrenOfItem:(id)item { - item = (item ? item : group_); - return showsLeaves_ ? [item numberOfChildren] : [item numberOfChildFolders]; -} - -// Returns a child of an item (NSOutlineView data source) -- (id)outlineView:(NSOutlineView*)outlineView - child:(NSInteger)index - ofItem:(id)item { - item = (item ? item : group_); - if (showsLeaves_) - return [item childAtIndex:index]; - else - return [item childFolderAtIndex:index]; -} - -// Returns whether an item is expandable (NSOutlineView data source) -- (BOOL)outlineView:(NSOutlineView*)outlineView isItemExpandable:(id)item { - if (flat_ || ![(item ? item : group_) isFolder]) - return NO; - // In leafless mode, a folder with no subfolders isn't expandable. - if (!showsLeaves_ && [item numberOfChildFolders] == 0) - return NO; - return YES; -} - -- (id) outlineView:(NSOutlineView*)outlineView - itemForPersistentObject:(id)persistentID { - return [group_ itemWithPersistentID:persistentID]; -} - -- (id) outlineView:(NSOutlineView*)outlineView - persistentObjectForItem:(id)item { - item = (item ? item : group_); - return [item persistentID]; -} - - -// Returns the value to display in a cell (NSOutlineView data source) -- (id) outlineView:(NSOutlineView*)outlineView - objectValueForTableColumn:(NSTableColumn*)tableColumn - byItem:(id)item { - item = (item ? item : group_); - NSString* ident = [tableColumn identifier]; - if ([ident isEqualToString:kTitleColIdent]) { - return [item title]; - } else if ([ident isEqualToString:kURLColIdent]) { - return [item URLString]; - } else if ([ident isEqualToString:kFolderColIdent]) { - return [item folderPath]; - } else { - NOTREACHED(); - return nil; - } -} - -// Stores the edited value of a cell (NSOutlineView data source) -- (void)outlineView:(NSOutlineView*)outlineView - setObjectValue:(id)value - forTableColumn:(NSTableColumn*)tableColumn - byItem:(id)item -{ - item = (item ? item : group_); - NSString* ident = [tableColumn identifier]; - if ([ident isEqualToString:kTitleColIdent]) { - [item setTitle:value]; - } else if ([ident isEqualToString:kURLColIdent]) { - if ([value length]) - [item setURLString:value]; - } -} - -// Returns whether a cell is editable (NSOutlineView data source) -- (BOOL) outlineView:(NSOutlineView*)outlineView - shouldEditTableColumn:(NSTableColumn*)tableColumn - item:(id)item { - NSString* ident = [tableColumn identifier]; - if ([item isFixed]) - return NO; - if ([ident isEqualToString:kURLColIdent] && [item isFolder]) - return NO; - return YES; -} - -// Sets a cell's icon before it's drawn (NSOutlineView data source) -- (void)outlineView:(NSOutlineView*)outlineView - willDisplayCell:(id)cell - forTableColumn:(NSTableColumn*)tableColumn - item:(id)item -{ - // Use the bookmark/folder's icon. - if ([[tableColumn identifier] isEqualToString:kTitleColIdent]) { - item = (item ? item : group_); - [cell setImage:[item icon]]; - } -} - -// Updates the tree after the data model has changed. -- (void)itemChanged:(BookmarkItem*)nodeItem - childrenChanged:(BOOL)childrenChanged { - if (nodeItem == group_) - nodeItem = nil; - NSArray* sel = [self selectedItems]; - [outline_ reloadItem:nodeItem reloadChildren:childrenChanged]; - [self setSelectedItems:sel]; -} - -@end - - -@implementation BookmarksOutlineView - -- (BookmarkTreeController*)bookmarkController { - return (BookmarkTreeController*)[self delegate]; -} - -- (NSRect)frameOfOutlineCellAtRow:(NSInteger)row { - // If the controller is in flat view, don't reserve space for the triangles. - BookmarkTreeController* controller = [self bookmarkController]; - if ([controller flat]) - return NSZeroRect; - return [super frameOfOutlineCellAtRow:row]; -} - -- (IBAction)cut:(id)sender { - [[self bookmarkController] cut:sender]; -} - -- (IBAction)copy:(id)sender { - [[self bookmarkController] copy:sender]; -} - -- (IBAction)paste:(id)sender { - [[self bookmarkController] paste:sender]; -} - -- (IBAction)delete:(id)sender { - [[self bookmarkController] delete:sender]; -} - -- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item { - return [[self bookmarkController] validateUserInterfaceItem:item]; -} - -- (void)keyDown:(NSEvent*)event { - NSString* chars = [event charactersIgnoringModifiers]; - if ([chars length] == 1) { - switch ([chars characterAtIndex:0]) { - case NSDeleteCharacter: - case NSDeleteFunctionKey: - [self delete:self]; - return; - case NSCarriageReturnCharacter: - case NSEnterCharacter: - [[self bookmarkController] editTitle:self]; - return; - case NSTabCharacter: - // For some reason NSTableView responds to the tab key by editing - // the selected row. Override this with the normal behavior. - [[self window] selectNextKeyView:self]; - return; - } - } - [super keyDown:event]; -} - -- (NSMenu*)menu { - return [[self bookmarkController] menu]; -} - -@end diff --git a/chrome/browser/cocoa/bookmark_tree_controller_pasteboard.mm b/chrome/browser/cocoa/bookmark_tree_controller_pasteboard.mm deleted file mode 100644 index 9032657d..0000000 --- a/chrome/browser/cocoa/bookmark_tree_controller_pasteboard.mm +++ /dev/null @@ -1,426 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "chrome/browser/cocoa/bookmark_tree_controller.h" -#import "base/logging.h" -#import "chrome/browser/cocoa/bookmark_item.h" - - -// Safari uses this type, though it's not declared in any header. -static NSString* const BookmarkDictionaryListPboardType = - @"BookmarkDictionaryListPboardType"; - -// Mac WebKit uses this type, declared in WebKit/mac/History/WebURLsWithTitles.h -static NSString* const WebURLsWithTitlesPboardType = - @"WebURLsWithTitlesPboardType"; - -// Used internally to identify intra-outline drags. -static NSString* const kCustomPboardType = - @"ChromeBookmarkTreeControllerPlaceholderType"; - -// Remembers which items are being dragged, during a drag. Static because -// there's by definition only one drag at a time, but multiple controllers. -static scoped_nsobject<NSArray> sDraggedItems; - - -@implementation BookmarkTreeController (Pasteboard) - - -// One-time dnd setup; called from -awakeFromNib. -- (void)registerDragTypes { - [outline_ registerForDraggedTypes:[NSArray arrayWithObjects: - BookmarkDictionaryListPboardType, - WebURLsWithTitlesPboardType, - NSURLPboardType, nil]]; - [outline_ setDraggingSourceOperationMask:NSDragOperationCopy | - NSDragOperationMove - forLocal:YES]; - [outline_ setDraggingSourceOperationMask:NSDragOperationCopy - forLocal:NO]; -} - -// Selects a range of items in a parent item. -- (void)selectItemsInFolder:(BookmarkItem*)parent - atIndexes:(NSRange)childRange { - DCHECK(NSMaxRange(childRange) <= (NSUInteger)[parent numberOfChildren]); - if (parent != group_) { - // If parent is not the root, need to offset range by parent's index: - int startRow = [outline_ rowForItem:parent]; - if (startRow < 0) { - return; - } - if ([outline_ isItemExpanded:parent]) { - childRange.location += startRow + 1; - } else { - childRange.location = startRow; - childRange.length = 1; - } - } - NSIndexSet* indexes = [NSIndexSet indexSetWithIndexesInRange:childRange]; - [outline_ selectRowIndexes:indexes byExtendingSelection:NO]; -} - - -#pragma mark - -#pragma mark DRAGGING OUT AND COPYING: - - -// Generates parallel arrays of URLs and titles for contents of an item. -static void flattenItem(BookmarkItem* item, - NSMutableArray* urlStrings, - NSMutableArray* titles) { - if ([item isFolder]) { - NSUInteger n = [item numberOfChildren]; - for (NSUInteger i = 0; i < n; i++) { - flattenItem([item childAtIndex:i], urlStrings, titles); - } - } else { - NSString* urlStr = [item URLString]; - if (urlStr) { - [urlStrings addObject:urlStr]; - [titles addObject:[item title]]; - } - } -} - -// Writes data to the pasteboard given a list of row items. -- (BOOL)writeItems:(NSArray*)items - toPasteboard:(NSPasteboard*)pb - canMove:(BOOL)canMove { - if ([items count] == 0) { - return NO; - } - - [pb declareTypes:[NSMutableArray arrayWithObjects: - WebURLsWithTitlesPboardType, - NSStringPboardType, nil] - owner:self]; - - // Add URLs and titles: - NSMutableArray* urls = [NSMutableArray array]; - NSMutableArray* titles = [NSMutableArray array]; - for (BookmarkItem* item in items) { - flattenItem(item, urls, titles); - } - [pb setPropertyList:[NSArray arrayWithObjects:urls, titles, nil] - forType:WebURLsWithTitlesPboardType]; - - // Add plain text, as one URL per line: - [pb setString:[urls componentsJoinedByString:@"\n"] - forType:NSStringPboardType]; - - // If moves are allowed, remember the actual BookmarkItems in sDraggedItems, - // and add a special pasteboard type to signal that they're there. - if (canMove) { - [pb addTypes:[NSArray arrayWithObject:kCustomPboardType] owner:self]; - [pb setData:[NSData data] forType:kCustomPboardType]; - } - - // Add single URL: - if ([urls count] == 1) { - [pb addTypes:[NSArray arrayWithObject:NSURLPboardType] owner:self]; - NSString* firstURLStr = [urls objectAtIndex:0]; - [pb setString:firstURLStr forType:NSURLPboardType]; - } - return YES; -} - -// Called after the pasteboard I've written to is no longer in use. -- (void)pasteboardChangedOwner:(NSPasteboard*)sender { - sDraggedItems.reset(nil); -} - -// Invoked when dragging outline-view rows. -- (BOOL)outlineView:(NSOutlineView*)outlineView - writeItems:(NSArray*)items - toPasteboard:(NSPasteboard*)pb { - // Special items (bookmark bar, Recents...) cannot be moved. - BOOL canMove = YES; - for (BookmarkItem* item in items) { - if ([item isFixed]) { - canMove = NO; - break; - } - } - - sDraggedItems.reset(canMove ? [items copy] : nil); - - [self writeItems:items toPasteboard:pb canMove:canMove]; - return YES; -} - - -// The Cut command. -- (IBAction)cut:(id)sender { - if ([self writeItems:[self actionItems] - toPasteboard:[NSPasteboard generalPasteboard] - canMove:NO]) { - [self delete:self]; - } else { - NSBeep(); - } -} - -// The Copy command. -- (IBAction)copy:(id)sender { - if (![self copyToPasteboard:[NSPasteboard generalPasteboard]]) - NSBeep(); -} - -// Copy to any pasteboard. -- (BOOL)copyToPasteboard:(NSPasteboard*)pb { - return [self writeItems:[self actionItems] - toPasteboard:pb - canMove:NO]; -} - - -#pragma mark - -#pragma mark INCOMING DRAGS AND PASTING: - - -// BookmarkDictionaryListPboardType represents bookmarks as dictionaries, -// which have the following keys. -// Strangely, folder items (whose WebBookmarkType is WebBookmarkTypeLeaf) have -// their title under 'Title', while leaf items have it in 'URIDictionary.title'. -static const NSString* kTitleKey = @"Title"; -static const NSString* kURIDictionaryKey = @"URIDictionary"; -static const NSString* kURIDictTitleKey = @"title"; -static const NSString* kURLStringKey = @"URLString"; -static const NSString* kTypeKey = @"WebBookmarkType"; -static const NSString* kLeafType = @"WebBookmarkTypeLeaf"; -//static const NSString* kListType = @"WebBookmarkTypeList"; // unused for now -static const NSString* kChildrenKey = @"Children"; - -// Helper that creates a dictionary in BookmarkDictionaryListPboardType format. -// |name| may be nil, but |urlStr| is required. -static NSDictionary* makeBookmarkPlistEntry(NSString* name, NSString* urlStr) { - if (!name) { - name = urlStr; - } - NSDictionary* nameDict = [NSDictionary dictionaryWithObject:name - forKey:kURIDictTitleKey]; - return [NSDictionary dictionaryWithObjectsAndKeys: - kLeafType, kTypeKey, - nameDict, kURIDictionaryKey, - urlStr, kURLStringKey, - nil]; -} - -// Reads URL(s) off the pasteboard and returns them in BookmarkDictionaryList- -// PboardType format, or nil on failure. -- (NSArray*)readPropertyListFromPasteboard:(NSPasteboard*)pb { - NSString* type = [pb availableTypeFromArray: - [outline_ registeredDraggedTypes]]; - if ([type isEqualToString:BookmarkDictionaryListPboardType]) { - // Safari's full bookmark plist type: - return [pb propertyListForType:type]; - - } else if ([type isEqualToString:WebURLsWithTitlesPboardType]) { - // Safari's parallel-URLs-and-titles type: - NSArray* contents = [pb propertyListForType:type]; - NSArray* urlStrings = [contents objectAtIndex:0]; - NSArray* titles = [contents objectAtIndex:1]; - NSUInteger n = [urlStrings count]; - if (n == 0 || [titles count] != n) { - return nil; - } - NSMutableArray* plist = [NSMutableArray array]; - for (NSUInteger i = 0; i < n; i++) { - [plist addObject:makeBookmarkPlistEntry([titles objectAtIndex:i], - [urlStrings objectAtIndex:i])]; - } - return plist; - - } else if ([type isEqualToString:NSURLPboardType]) { - // Standard URL type: - NSString* urlStr = [[NSURL URLFromPasteboard:pb] absoluteString]; - if (!urlStr) { - return nil; - } - NSString* title = [pb stringForType:@"public.url-name"]; - if (!title) - title = [pb stringForType:NSStringPboardType]; - return [NSArray arrayWithObject:makeBookmarkPlistEntry(title, urlStr)]; - - } else { - return nil; - } -} - -- (BOOL)isDirectDrag:(id<NSDraggingInfo>)info { - if (!sDraggedItems) - return NO; - if (![[[info draggingPasteboard] types] containsObject:kCustomPboardType]) - return NO; - id source = [info draggingSource]; - return [source isKindOfClass:[BookmarksOutlineView class]]; -} - -// Moves BookmarkItems into a parent folder, then selects them. -- (void)moveItems:(NSArray*)items - toFolder:(BookmarkItem*)dstParent - atIndex:(int)dstIndex { - for (BookmarkItem* srcItem in items) { - // Use an autorelease pool to clean up after the various observers that - // get called after each individual bookmark change. - NSAutoreleasePool* pool = [NSAutoreleasePool new]; - BookmarkItem* srcParent = [srcItem parent]; - int srcIndex = [srcParent indexOfChild:srcItem]; - [dstParent moveItem:srcItem toIndex:dstIndex]; - if (srcParent != dstParent || srcIndex >= dstIndex) { - dstIndex++; - } - [pool drain]; - } - - NSRange selRange = {dstIndex - [items count], [items count]}; - [self selectItemsInFolder:dstParent atIndexes:selRange]; -} - -// Inserts bookmarks in BookmarkDictionaryListPboardType into a folder item. -- (BOOL)insertPropertyList:(NSArray*)plist - inFolder:(BookmarkItem*)dstParent - atIndex:(NSInteger)dstIndex { - if (!plist || !dstParent || dstIndex < 0) - return NO; - NSInteger i = 0; - for (NSDictionary* plistItem in plist) { - // Use an autorelease pool to clean up after the various observers that - // get called after each individual bookmark change. - NSAutoreleasePool* pool = [NSAutoreleasePool new]; - if ([[plistItem objectForKey:kTypeKey] isEqual:kLeafType]) { - NSString* title = [[plistItem objectForKey:kURIDictionaryKey] - objectForKey:kURIDictTitleKey]; - NSString* urlStr = [plistItem objectForKey:kURLStringKey]; - if (title && urlStr) { - BookmarkItem* newItem = [dstParent addBookmarkWithTitle:title - URL:urlStr - atIndex:dstIndex + i]; - // It is possible for that call to fail if urlStr isn't a valid URL. - if (newItem) - ++i; - } - } else { - NSString* title = [plistItem objectForKey:kTitleKey]; - NSArray* children = [plistItem objectForKey:kChildrenKey]; - if (title && children) { - BookmarkItem* newFolder = [dstParent addFolderWithTitle:title - atIndex:dstIndex + i]; - ++i; - [self insertPropertyList:children - inFolder:newFolder - atIndex:0]; - } - } - [pool drain]; - } - [self selectItemsInFolder:dstParent - atIndexes:NSMakeRange(dstIndex, i)]; - return YES; -} - -// Determine the parent to insert into and the child index to insert at. -- (BookmarkItem*)itemForDropOnItem:(BookmarkItem*)item - proposedIndex:(NSInteger*)childIndex { - BookmarkItem* targetItem = item ? item : group_; - if ([targetItem isFolder]) { - if (*childIndex == NSOutlineViewDropOnItemIndex) { - // Insert it at the end, if we were dropping on it - *childIndex = [targetItem numberOfChildren]; - } - } else { - if (*childIndex == NSOutlineViewDropOnItemIndex) { - // Can't drop directly on a leaf. - return nil; - } else { - // We will be dropping on the item's parent at the target index - // of this child, plus one. - BookmarkItem* oldTargetItem = targetItem; - targetItem = [targetItem parent]; - *childIndex = [targetItem indexOfChild:oldTargetItem] + 1; - } - } - if ([targetItem isFake]) { - targetItem = nil; - } - return targetItem; -} - -// Validates whether or not the proposed drop is valid. -- (NSDragOperation)outlineView:(NSOutlineView*)outlineView - validateDrop:(id <NSDraggingInfo>)info - proposedItem:(id)item - proposedChildIndex:(NSInteger)childIndex { - // Determine the parent to insert into and the child index to insert at. - BookmarkItem* targetItem = [self itemForDropOnItem:item - proposedIndex:&childIndex]; - if (!targetItem) - return NSDragOperationNone; - - // Dragging within the outline? - if ([self isDirectDrag:info]) { - // If dragging within the tree, we see if we are dragging from ourselves - // and dropping into a descendant, which wouldn't be allowed... - for (BookmarkItem* draggedItem in sDraggedItems.get()) { - if ([draggedItem hasDescendant:targetItem]) { - return NSDragOperationNone; - } - } - return NSDragOperationMove; - } - - // Drag from elsewhere is a copy. - return NSDragOperationCopy; -} - -// Actually handles the drop. -- (BOOL)outlineView:(NSOutlineView*)outlineView - acceptDrop:(id <NSDraggingInfo>)info - item:(id)item - childIndex:(NSInteger)childIndex -{ - // Determine the parent to insert into and the child index to insert at. - BookmarkItem* targetItem = [self itemForDropOnItem:item - proposedIndex:&childIndex]; - if (!targetItem) - return NO; - - if ([self isDirectDrag:info]) { - // If the source was ourselves, move the selected items. - [self moveItems:sDraggedItems - toFolder:targetItem - atIndex:childIndex]; - return YES; - } else { - // Else copy. - NSArray* plist = [self readPropertyListFromPasteboard: - [info draggingPasteboard]]; - return [self insertPropertyList:plist - inFolder:targetItem - atIndex:childIndex]; - } -} - - -// The Paste command. -- (IBAction)paste:(id)sender { - if (![self pasteFromPasteboard:[NSPasteboard generalPasteboard]]) - NSBeep(); -} - -- (BOOL)pasteFromPasteboard:(NSPasteboard*)pb { - NSArray* plist = [self readPropertyListFromPasteboard:pb]; - if (!plist) - return NO; - - BookmarkItem* parentItem; - NSUInteger childIndex; - return [self getInsertionParent:&parentItem index:&childIndex] && - [self insertPropertyList:plist - inFolder:parentItem - atIndex:childIndex]; -} - -@end diff --git a/chrome/browser/cocoa/bookmark_tree_controller_unittest.mm b/chrome/browser/cocoa/bookmark_tree_controller_unittest.mm deleted file mode 100644 index b33fd8e..0000000 --- a/chrome/browser/cocoa/bookmark_tree_controller_unittest.mm +++ /dev/null @@ -1,360 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/scoped_nsobject.h" -#import "chrome/browser/cocoa/bookmark_item.h" -#import "chrome/browser/cocoa/bookmark_manager_controller.h" -#import "chrome/browser/cocoa/bookmark_tree_controller.h" -#include "chrome/browser/cocoa/browser_test_helper.h" -#import "chrome/browser/cocoa/cocoa_test_helper.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" - -// Mac WebKit uses this type, declared in WebKit/mac/History/WebURLsWithTitles.h -static NSString* const WebURLsWithTitlesPboardType = - @"WebURLsWithTitlesPboardType"; - -namespace { - -class BookmarkTreeControllerTest : public CocoaTest { - public: - void SetUp() { - CocoaTest::SetUp(); - pasteboard_ = [NSPasteboard pasteboardWithUniqueName]; - manager_ = [BookmarkManagerController showBookmarkManager: - browser_test_helper_.profile()]; - ASSERT_TRUE(manager_); - listController_ = [manager_ listController]; - ASSERT_TRUE(listController_); - groupsController_ = [manager_ groupsController]; - ASSERT_TRUE(groupsController_); - } - - void TearDown() { - [manager_ close]; - [pasteboard_ releaseGlobally]; - CocoaTest::TearDown(); - } - - BookmarkItem* SelectBar() { - BookmarkItem* bar = [manager_ bookmarkBarItem]; - EXPECT_TRUE(bar); - [[manager_ groupsController] setSelectedItem:bar]; - return bar; - } - - BookmarkItem* AddToBar(NSString*title, NSString* urlStr) { - BookmarkItem* bar = [manager_ bookmarkBarItem]; - return [bar addBookmarkWithTitle:title - URL:urlStr - atIndex:[bar numberOfChildren]]; - } - - BookmarkItem* AddFolderToBar(NSString* title) { - BookmarkItem* bar = [manager_ bookmarkBarItem]; - return [bar addFolderWithTitle:title - atIndex:[bar numberOfChildren]]; - } - - BrowserTestHelper browser_test_helper_; - BookmarkManagerController* manager_; - BookmarkTreeController* listController_; - BookmarkTreeController* groupsController_; - NSPasteboard* pasteboard_; -}; - -TEST_F(BookmarkTreeControllerTest, Model) { - // Select nothing in the group list and check tree is empty: - BookmarkTreeController* groupsController = [manager_ groupsController]; - [groupsController setSelectedItem:nil]; - EXPECT_EQ(nil, [listController_ group]); - - // Select the bookmarks bar and check that it's shown in the tree: - BookmarkItem* bar = SelectBar(); - EXPECT_EQ(bar, [listController_ group]); -} - -TEST_F(BookmarkTreeControllerTest, Selection) { - SelectBar(); - BookmarkItem* test1 = AddToBar(@"Test 1", @"http://example.com/test1"); - BookmarkItem* test2 = AddToBar(@"Test 2", @"http://example.com/test2"); - BookmarkItem* test3 = AddToBar(@"Test 3", @"http://example.com/test3"); - EXPECT_EQ(0U, [[listController_ selectedItems] count]); - - NSArray* sel = [NSArray arrayWithObject:test2]; - [listController_ setSelectedItems:sel]; - EXPECT_TRUE([sel isEqual:[listController_ selectedItems]]); - sel = [NSArray arrayWithObjects:test1, test3, nil]; - [listController_ setSelectedItems:sel]; - EXPECT_TRUE([sel isEqual:[listController_ selectedItems]]); - sel = [NSArray arrayWithObjects:test1, test2, test3, nil]; - [listController_ setSelectedItems:sel]; - EXPECT_TRUE([sel isEqual:[listController_ selectedItems]]); - sel = [NSArray array]; - [listController_ setSelectedItems:sel]; - EXPECT_TRUE([sel isEqual:[listController_ selectedItems]]); -} - -TEST_F(BookmarkTreeControllerTest, NewFolder) { - // Select Bookmark Bar in tree and create a new folder: - BookmarkItem* bar = SelectBar(); - EXPECT_EQ(0U, [bar numberOfChildren]); - BookmarkItem* parent = nil; - NSUInteger index = 0; - EXPECT_TRUE([groupsController_ getInsertionParent:&parent index:&index]); - EXPECT_EQ(bar, parent); - EXPECT_EQ(0U, index); - BookmarkItem* newFolder = [groupsController_ newFolderWithTitle:@""]; - - // Verify the new folder exists and is selected: - ASSERT_EQ(1U, [bar numberOfChildren]); - EXPECT_EQ(newFolder, [bar childAtIndex:0]); - EXPECT_EQ(newFolder, [groupsController_ selectedItem]); - - // Do New Folder again: - EXPECT_TRUE([groupsController_ getInsertionParent:&parent index:&index]); - EXPECT_EQ(bar, parent); - EXPECT_EQ(0U, index); - EXPECT_TRUE([listController_ getInsertionParent:&parent index:&index]); - EXPECT_EQ(newFolder, parent); - EXPECT_EQ(0U, index); - newFolder = [groupsController_ newFolderWithTitle:@""]; - - // Verify the new folder exists and is selected: - ASSERT_EQ(2U, [bar numberOfChildren]); - EXPECT_EQ(newFolder, [bar childAtIndex:0]); - EXPECT_EQ(newFolder, [groupsController_ selectedItem]); - - // Verify it's possible to add to Other Bookmarks: - [groupsController_ setSelectedItem:[manager_ otherBookmarksItem]]; - EXPECT_TRUE([groupsController_ canInsert]); - EXPECT_TRUE([listController_ canInsert]); - - // Verify it's not possible to add to Recents: - [groupsController_ setSelectedItem:[manager_ recentGroup]]; - EXPECT_FALSE([groupsController_ canInsert]); - EXPECT_FALSE([listController_ canInsert]); -} - -TEST_F(BookmarkTreeControllerTest, Deletion) { - // Create a new folder in the bookmarks bar: - SelectBar(); - BookmarkItem* newFolder = [groupsController_ newFolderWithTitle:@""]; - ASSERT_TRUE(newFolder); - ASSERT_EQ(newFolder, [groupsController_ selectedItem]); - - // Now delete the folder and make sure it's not still selected/shown: - [groupsController_ delete:nil]; - ASSERT_EQ(0U, [[manager_ bookmarkBarItem] numberOfChildren]); - BookmarkItem* newSel = [groupsController_ selectedItem]; - EXPECT_NE(newFolder, newSel); - EXPECT_EQ(newSel, [listController_ group]); -} - -TEST_F(BookmarkTreeControllerTest, MoveItems) { - NSOutlineView* outline = [groupsController_ outline]; - ASSERT_TRUE(outline); - - // Add three folders and another one we'll drop some into: - BookmarkItem* bookmarkBar = SelectBar(); - BookmarkItem* test1 = AddFolderToBar(@"Test 1"); - BookmarkItem* test2 = AddFolderToBar(@"Test 2"); - BookmarkItem* folder = AddFolderToBar(@"Folder"); - BookmarkItem* test3 = AddFolderToBar(@"Test 3"); - EXPECT_TRUE([groupsController_ expandItem:bookmarkBar]); - - // Verify NSOutlineView hierarchy. - EXPECT_EQ(0, [outline rowForItem:bookmarkBar]); - EXPECT_EQ(1, [outline rowForItem:test1]); - EXPECT_EQ(2, [outline rowForItem:test2]); - EXPECT_EQ(3, [outline rowForItem:folder]); - EXPECT_EQ(4, [outline rowForItem:test3]); - EXPECT_EQ(bookmarkBar, [outline parentForItem:test1]); - EXPECT_EQ(bookmarkBar, [outline parentForItem:test2]); - EXPECT_EQ(bookmarkBar, [outline parentForItem:folder]); - EXPECT_EQ(bookmarkBar, [outline parentForItem:test3]); - - // Check where dropped URLs would go: - NSInteger dropIndex = 0; - BookmarkItem* target = [groupsController_ itemForDropOnItem:folder - proposedIndex:&dropIndex]; - EXPECT_EQ(folder, target); - EXPECT_EQ(0, dropIndex); - - dropIndex = NSOutlineViewDropOnItemIndex; - target = [groupsController_ itemForDropOnItem:folder - proposedIndex:&dropIndex]; - EXPECT_EQ(folder, target); - EXPECT_EQ(0, dropIndex); - - // Move the first and third item into the folder. - [groupsController_ moveItems:[NSMutableArray arrayWithObjects:test1, test3, nil] - toFolder:folder - atIndex:0]; - - // Verify bookmark model hierarchy. - EXPECT_EQ(folder, [test1 parent]); - EXPECT_EQ(folder, [test3 parent]); - EXPECT_EQ(bookmarkBar, [folder parent]); - EXPECT_EQ(bookmarkBar, [test2 parent]); - - // Verify NSOutlineView hierarchy. test1 and test3 should be in the folder. - EXPECT_TRUE([groupsController_ expandItem:folder]); - EXPECT_TRUE([outline isItemExpanded:folder]); - EXPECT_EQ(bookmarkBar, [outline parentForItem:test2]); - EXPECT_EQ(bookmarkBar, [outline parentForItem:folder]); - EXPECT_EQ(folder, [outline parentForItem:test1]); - EXPECT_EQ(folder, [outline parentForItem:test3]); - - // Verify the folder is selected. - EXPECT_TRUE([[outline selectedRowIndexes] - isEqual:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(2, 1)]]); - NSArray* sel = [groupsController_ selectedItems]; - EXPECT_TRUE([sel isEqual:([NSArray arrayWithObject:folder])]); -} - -TEST_F(BookmarkTreeControllerTest, MoveItemsFlat) { - // Add three bookmarks and a folder. - NSOutlineView* outline = [listController_ outline]; - SelectBar(); - BookmarkItem* test1 = AddToBar(@"Test 1", @"http://example.com/test1"); - BookmarkItem* test2 = AddToBar(@"Test 2", @"http://example.com/test2"); - BookmarkItem* folder = AddFolderToBar(@"Folder"); - BookmarkItem* test3 = AddToBar(@"Test 3", @"http://example.com/test3"); - - BookmarkItem* group = [listController_ group]; - - // Check where dropped URLs would go: - NSInteger dropIndex = NSOutlineViewDropOnItemIndex; - BookmarkItem* target = [listController_ itemForDropOnItem:test1 - proposedIndex:&dropIndex]; - EXPECT_EQ(nil, target); - dropIndex = 0; - target = [listController_ itemForDropOnItem:test1 - proposedIndex:&dropIndex]; - EXPECT_EQ(group, target); - EXPECT_EQ(1, dropIndex); - dropIndex = 0; - target = [listController_ itemForDropOnItem:folder - proposedIndex:&dropIndex]; - EXPECT_EQ(folder, target); - EXPECT_EQ(0, dropIndex); - dropIndex = NSOutlineViewDropOnItemIndex; - target = [listController_ itemForDropOnItem:folder - proposedIndex:&dropIndex]; - EXPECT_EQ(folder, target); - EXPECT_EQ(0, dropIndex); - - // Move the first and third item into the folder. - [listController_ moveItems:[NSArray arrayWithObjects:test1, test3, nil] - toFolder:folder - atIndex:0]; - - // Verify bookmark model hierarchy. - EXPECT_EQ(folder, [test1 parent]); - EXPECT_EQ(folder, [test3 parent]); - EXPECT_EQ(group, [folder parent]); - EXPECT_EQ(group, [test2 parent]); - - // Verify NSOutlineView hierarchy. test1 and test3 should be gone now. - EXPECT_EQ(-1, [outline rowForItem:test1]); - EXPECT_EQ(-1, [outline rowForItem:test3]); - EXPECT_EQ(nil, [outline parentForItem:test2]); - EXPECT_EQ(nil, [outline parentForItem:folder]); -} - -TEST_F(BookmarkTreeControllerTest, CopyURLs) { - SelectBar(); - AddToBar(@"Test 1", @"http://example.com/test1"); - AddToBar(@"Test 2", @"http://example.com/test2"); - AddToBar(@"Test 3", @"http://example.com/test3"); - [[listController_ outline] selectAll:listController_]; - - ASSERT_TRUE([listController_ copyToPasteboard:pasteboard_]); - - NSArray* contents = [pasteboard_ propertyListForType: - WebURLsWithTitlesPboardType]; - ASSERT_TRUE([contents isKindOfClass:[NSArray class]]); - NSArray* urlStrings = [contents objectAtIndex:0]; - EXPECT_TRUE([urlStrings isKindOfClass:[NSArray class]]); - NSArray* expectedURLStrings = [NSArray arrayWithObjects: - @"http://example.com/test1", - @"http://example.com/test2", - @"http://example.com/test3", nil]; - EXPECT_TRUE([urlStrings isEqual:expectedURLStrings]); - NSArray* titles = [contents objectAtIndex:1]; - EXPECT_TRUE([titles isKindOfClass:[NSArray class]]); - NSArray* expectedTitles = [NSArray arrayWithObjects: - @"Test 1", - @"Test 2", - @"Test 3", nil]; - EXPECT_TRUE([titles isEqual:expectedTitles]); - - NSString* str = [pasteboard_ stringForType:NSStringPboardType]; - EXPECT_TRUE([str isEqual: - @"http://example.com/test1\n" - "http://example.com/test2\n" - "http://example.com/test3"]); - - EXPECT_FALSE([pasteboard_ dataForType:NSURLPboardType]); -} - -TEST_F(BookmarkTreeControllerTest, PasteSingleURL) { - [pasteboard_ declareTypes:[NSArray arrayWithObjects: - NSURLPboardType, @"public.url-name", nil] - owner:nil]; - [[NSURL URLWithString:@"http://google.com/"] writeToPasteboard:pasteboard_]; - [pasteboard_ setString:@"Gooooogle" forType:@"public.url-name"]; - - SelectBar(); - AddToBar(@"Test 1", @"http://example.com/test1"); - AddToBar(@"Test 2", @"http://example.com/test2"); - AddToBar(@"Test 3", @"http://example.com/test3"); - - ASSERT_TRUE([listController_ pasteFromPasteboard:pasteboard_]); - EXPECT_EQ(4, [[listController_ outline] numberOfRows]); - EXPECT_EQ(3, [[listController_ outline] selectedRow]); - NSArray* sel = [listController_ selectedItems]; - ASSERT_EQ(1U, [sel count]); - BookmarkItem* item = [sel objectAtIndex:0]; - EXPECT_TRUE([@"http://google.com/" isEqual:[item URLString]]); - EXPECT_TRUE([@"Gooooogle" isEqual:[item title]]); -} - -TEST_F(BookmarkTreeControllerTest, PasteMultipleURLs) { - [pasteboard_ declareTypes:[NSArray arrayWithObjects: - WebURLsWithTitlesPboardType, - NSURLPboardType, nil] - owner:nil]; - NSMutableArray* urls = [NSArray arrayWithObjects: - @"http://google.com/", @"http://chromium.org/", nil]; - NSMutableArray* titles = [NSArray arrayWithObjects: - @"Gooooogle", @"Chrooooomium", nil]; - [pasteboard_ setPropertyList:[NSArray arrayWithObjects:urls, titles, nil] - forType:WebURLsWithTitlesPboardType]; - [[NSURL URLWithString:@"http://example.com"] writeToPasteboard:pasteboard_]; - - SelectBar(); - AddToBar(@"Test 1", @"http://example.com/test1"); - BookmarkItem* test2 = AddToBar(@"Test 2", @"http://example.com/test2"); - AddToBar(@"Test 3", @"http://example.com/test3"); - [listController_ setSelectedItems:[NSArray arrayWithObject:test2]]; - - EXPECT_TRUE([listController_ readPropertyListFromPasteboard:pasteboard_]); - ASSERT_TRUE([listController_ pasteFromPasteboard:pasteboard_]); - EXPECT_EQ(5, [[listController_ outline] numberOfRows]); - EXPECT_TRUE([[[listController_ outline] selectedRowIndexes] - isEqual:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 2)]]); - NSArray* sel = [listController_ selectedItems]; - ASSERT_EQ(2U, [sel count]); - - BookmarkItem* item = [sel objectAtIndex:0]; - EXPECT_TRUE([@"http://google.com/" isEqual:[item URLString]]); - EXPECT_TRUE([@"Gooooogle" isEqual:[item title]]); - item = [sel objectAtIndex:1]; - EXPECT_TRUE([@"http://chromium.org/" isEqual:[item URLString]]); - EXPECT_TRUE([@"Chrooooomium" isEqual:[item title]]); -} - -} // namespace diff --git a/chrome/browser/cocoa/browser_window_cocoa.mm b/chrome/browser/cocoa/browser_window_cocoa.mm index 7df9ee1..0de692f 100644 --- a/chrome/browser/cocoa/browser_window_cocoa.mm +++ b/chrome/browser/cocoa/browser_window_cocoa.mm @@ -11,7 +11,6 @@ #include "chrome/app/chrome_dll_resource.h" #include "chrome/browser/bookmarks/bookmark_utils.h" #include "chrome/browser/browser_list.h" -#import "chrome/browser/cocoa/bookmark_manager_controller.h" #import "chrome/browser/cocoa/browser_window_controller.h" #import "chrome/browser/cocoa/bug_report_window_controller.h" #import "chrome/browser/cocoa/chrome_browser_window.h" @@ -266,7 +265,8 @@ void BrowserWindowCocoa::ShowTaskManager() { } void BrowserWindowCocoa::ShowBookmarkManager() { - [BookmarkManagerController showBookmarkManager:browser_->profile()]; + // TODO(viettrungluu): Remove function when no callers remain. crbug.com/38908 + NOTIMPLEMENTED(); } void BrowserWindowCocoa::ShowBookmarkBubble(const GURL& url, |