| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/scoped_nsobject.h" | 8 #include "base/scoped_nsobject.h" |
| 9 #import "chrome/browser/cocoa/bookmark_bubble_controller.h" | 9 #import "chrome/browser/cocoa/bookmark_bubble_controller.h" |
| 10 #include "chrome/browser/cocoa/browser_test_helper.h" | 10 #include "chrome/browser/cocoa/browser_test_helper.h" |
| 11 #import "chrome/browser/cocoa/cocoa_test_helper.h" | 11 #import "chrome/browser/cocoa/cocoa_test_helper.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 #include "testing/platform_test.h" | 13 #include "testing/platform_test.h" |
| 14 | 14 |
| 15 @interface BBDelegate : NSObject<BookmarkBubbleControllerDelegate> { | 15 @interface BBDelegate : NSObject<BookmarkBubbleControllerDelegate> { |
| 16 NSWindow* window_; // weak | 16 @private |
| 17 BOOL windowClosed_; |
| 17 int edits_; | 18 int edits_; |
| 18 int dones_; | |
| 19 } | 19 } |
| 20 |
| 20 @property (readonly) int edits; | 21 @property (readonly) int edits; |
| 21 @property (readonly) int dones; | 22 @property (readonly) BOOL windowClosed; |
| 22 @property (readonly) NSWindow* window; | 23 |
| 23 @end | 24 @end |
| 24 | 25 |
| 25 @implementation BBDelegate | 26 @implementation BBDelegate |
| 26 | 27 |
| 27 @synthesize edits = edits_; | 28 @synthesize edits = edits_; |
| 28 @synthesize window = window_; | 29 @synthesize windowClosed = windowClosed_; |
| 29 @synthesize dones = dones_; | 30 |
| 31 - (void)dealloc { |
| 32 NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; |
| 33 [nc removeObserver:self]; |
| 34 [super dealloc]; |
| 35 } |
| 30 | 36 |
| 31 - (NSPoint)topLeftForBubble { | 37 - (NSPoint)topLeftForBubble { |
| 32 return NSMakePoint(10, 300); | 38 return NSMakePoint(10, 300); |
| 33 } | 39 } |
| 34 | 40 |
| 35 - (void)editBookmarkNode:(const BookmarkNode*)node { | 41 - (void)editBookmarkNode:(const BookmarkNode*)node { |
| 36 edits_++; | 42 edits_++; |
| 37 } | 43 } |
| 38 | 44 |
| 39 - (void)doneWithBubbleController:(BookmarkBubbleController*)controller { | 45 - (void)setWindowController:(NSWindowController *)controller { |
| 40 dones_++; | 46 NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; |
| 47 [nc removeObserver:self]; |
| 48 if (controller) { |
| 49 [nc addObserver:self |
| 50 selector:@selector(windowWillClose:) |
| 51 name:NSWindowWillCloseNotification |
| 52 object:[controller window]]; |
| 53 } |
| 54 windowClosed_ = NO; |
| 41 } | 55 } |
| 42 | 56 |
| 43 - (void)clear { | 57 - (void)windowWillClose:(NSNotification*)notification { |
| 44 edits_ = 0; | 58 windowClosed_ = YES; |
| 45 dones_ = 0; | |
| 46 } | 59 } |
| 47 | |
| 48 @end | 60 @end |
| 49 | 61 |
| 50 namespace { | 62 namespace { |
| 51 | 63 |
| 52 class BookmarkBubbleControllerTest : public PlatformTest { | 64 class BookmarkBubbleControllerTest : public CocoaTest { |
| 53 public: | 65 public: |
| 54 CocoaTestHelper cocoa_helper_; // Inits Cocoa, creates window, etc... | |
| 55 BrowserTestHelper helper_; | 66 BrowserTestHelper helper_; |
| 56 scoped_nsobject<BBDelegate> delegate_; | 67 scoped_nsobject<BBDelegate> delegate_; |
| 57 scoped_nsobject<BookmarkBubbleController> controller_; | 68 BookmarkBubbleController* controller_; |
| 58 | 69 |
| 59 BookmarkBubbleControllerTest() { | 70 BookmarkBubbleControllerTest() : controller_(nil) { |
| 60 delegate_.reset([[BBDelegate alloc] init]); | 71 delegate_.reset([[BBDelegate alloc] init]); |
| 61 } | 72 } |
| 62 | 73 |
| 74 virtual void TearDown() { |
| 75 [controller_ close]; |
| 76 CocoaTest::TearDown(); |
| 77 } |
| 78 |
| 63 // Returns a controller but ownership not transferred. | 79 // Returns a controller but ownership not transferred. |
| 64 // Only one of these will be valid at a time. | 80 // Only one of these will be valid at a time. |
| 65 BookmarkBubbleController* ControllerForNode(const BookmarkNode* node) { | 81 BookmarkBubbleController* ControllerForNode(const BookmarkNode* node) { |
| 66 controller_.reset([[BookmarkBubbleController alloc] | 82 DCHECK(controller_ == nil); |
| 67 initWithDelegate:delegate_.get() | 83 controller_ = [[BookmarkBubbleController alloc] |
| 68 parentWindow:cocoa_helper_.window() | 84 initWithDelegate:delegate_.get() |
| 69 topLeftForBubble:[delegate_ topLeftForBubble] | 85 parentWindow:test_window() |
| 70 model:helper_.profile()->GetBookmarkModel() | 86 topLeftForBubble:[delegate_ topLeftForBubble] |
| 71 node:node | 87 model:helper_.profile()->GetBookmarkModel() |
| 72 alreadyBookmarked:YES]); | 88 node:node |
| 73 [controller_ view]; // force nib load | 89 alreadyBookmarked:YES]; |
| 74 return controller_.get(); | 90 EXPECT_TRUE([controller_ window]); |
| 91 [delegate_ setWindowController:controller_]; |
| 92 return controller_; |
| 75 } | 93 } |
| 76 | 94 |
| 77 BookmarkModel* GetBookmarkModel() { | 95 BookmarkModel* GetBookmarkModel() { |
| 78 return helper_.profile()->GetBookmarkModel(); | 96 return helper_.profile()->GetBookmarkModel(); |
| 79 } | 97 } |
| 80 }; | 98 }; |
| 81 | 99 |
| 82 // Confirm basics about the bubble window (e.g. that it is inside the | 100 // Confirm basics about the bubble window (e.g. that it is inside the |
| 83 // parent window) | 101 // parent window) |
| 84 TEST_F(BookmarkBubbleControllerTest, TestBubbleWindow) { | 102 TEST_F(BookmarkBubbleControllerTest, TestBubbleWindow) { |
| 85 BookmarkModel* model = GetBookmarkModel(); | 103 BookmarkModel* model = GetBookmarkModel(); |
| 86 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), | 104 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 87 0, | 105 0, |
| 88 L"Bookie markie title", | 106 L"Bookie markie title", |
| 89 GURL("http://www.google.com")); | 107 GURL("http://www.google.com")); |
| 90 BookmarkBubbleController* controller = ControllerForNode(node); | 108 BookmarkBubbleController* controller = ControllerForNode(node); |
| 91 EXPECT_TRUE(controller); | 109 EXPECT_TRUE(controller); |
| 92 NSWindow* window = [controller createBubbleWindow]; | 110 NSWindow* window = [controller window]; |
| 93 EXPECT_TRUE(window); | 111 EXPECT_TRUE(window); |
| 94 EXPECT_TRUE(NSContainsRect([cocoa_helper_.window() frame], | 112 EXPECT_TRUE(NSContainsRect([test_window() frame], |
| 95 [window frame])); | 113 [window frame])); |
| 96 } | 114 } |
| 97 | 115 |
| 98 // Confirm population of folder list | 116 // Confirm population of folder list |
| 99 TEST_F(BookmarkBubbleControllerTest, TestFillInFolder) { | 117 TEST_F(BookmarkBubbleControllerTest, TestFillInFolder) { |
| 100 // Create some folders, including a nested folder | 118 // Create some folders, including a nested folder |
| 101 BookmarkModel* model = GetBookmarkModel(); | 119 BookmarkModel* model = GetBookmarkModel(); |
| 102 const BookmarkNode* node1 = model->AddGroup(model->GetBookmarkBarNode(), | 120 const BookmarkNode* node1 = model->AddGroup(model->GetBookmarkBarNode(), |
| 103 0, L"one"); | 121 0, L"one"); |
| 104 const BookmarkNode* node2 = model->AddGroup(model->GetBookmarkBarNode(), | 122 const BookmarkNode* node2 = model->AddGroup(model->GetBookmarkBarNode(), |
| (...skipping 12 matching lines...) Expand all Loading... |
| 117 NSArray* items = [[controller folderComboBox] objectValues]; | 135 NSArray* items = [[controller folderComboBox] objectValues]; |
| 118 EXPECT_TRUE([items containsObject:@"one"]); | 136 EXPECT_TRUE([items containsObject:@"one"]); |
| 119 EXPECT_TRUE([items containsObject:@"two"]); | 137 EXPECT_TRUE([items containsObject:@"two"]); |
| 120 EXPECT_TRUE([items containsObject:@"three"]); | 138 EXPECT_TRUE([items containsObject:@"three"]); |
| 121 EXPECT_TRUE([items containsObject:@"sub"]); | 139 EXPECT_TRUE([items containsObject:@"sub"]); |
| 122 EXPECT_FALSE([items containsObject:@"title1"]); | 140 EXPECT_FALSE([items containsObject:@"title1"]); |
| 123 EXPECT_FALSE([items containsObject:@"title2"]); | 141 EXPECT_FALSE([items containsObject:@"title2"]); |
| 124 } | 142 } |
| 125 | 143 |
| 126 // Click on edit; bubble gets closed. | 144 // Click on edit; bubble gets closed. |
| 127 TEST_F(BookmarkBubbleControllerTest, TestSimpleActions) { | 145 TEST_F(BookmarkBubbleControllerTest, TestEdit) { |
| 128 BookmarkModel* model = GetBookmarkModel(); | 146 BookmarkModel* model = GetBookmarkModel(); |
| 129 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), | 147 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 130 0, | 148 0, |
| 131 L"Bookie markie title", | 149 L"Bookie markie title", |
| 132 GURL("http://www.google.com")); | 150 GURL("http://www.google.com")); |
| 133 BookmarkBubbleController* controller = ControllerForNode(node); | 151 BookmarkBubbleController* controller = ControllerForNode(node); |
| 134 EXPECT_TRUE(controller); | 152 EXPECT_TRUE(controller); |
| 135 | 153 |
| 136 EXPECT_EQ([delegate_ edits], 0); | 154 EXPECT_EQ([delegate_ edits], 0); |
| 137 EXPECT_EQ([delegate_ dones], 0); | 155 EXPECT_FALSE([delegate_ windowClosed]); |
| 138 EXPECT_FALSE([controller windowHasBeenClosed]); | |
| 139 [controller edit:controller]; | 156 [controller edit:controller]; |
| 140 EXPECT_EQ([delegate_ edits], 1); | 157 EXPECT_EQ([delegate_ edits], 1); |
| 141 EXPECT_EQ([delegate_ dones], 1); | 158 EXPECT_TRUE([delegate_ windowClosed]); |
| 142 EXPECT_TRUE([controller windowHasBeenClosed]); | 159 } |
| 143 | 160 |
| 144 [delegate_ clear]; | 161 // CallClose; bubble gets closed. |
| 162 TEST_F(BookmarkBubbleControllerTest, TestClose) { |
| 163 BookmarkModel* model = GetBookmarkModel(); |
| 164 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 165 0, |
| 166 L"Bookie markie title", |
| 167 GURL("http://www.google.com")); |
| 145 EXPECT_EQ([delegate_ edits], 0); | 168 EXPECT_EQ([delegate_ edits], 0); |
| 146 EXPECT_EQ([delegate_ dones], 0); | |
| 147 | 169 |
| 148 controller = ControllerForNode(node); | 170 BookmarkBubbleController* controller = ControllerForNode(node); |
| 149 EXPECT_TRUE(controller); | 171 EXPECT_TRUE(controller); |
| 150 EXPECT_FALSE([controller windowHasBeenClosed]); | 172 EXPECT_FALSE([delegate_ windowClosed]); |
| 151 [controller close:controller]; | 173 [controller ok:controller]; |
| 152 EXPECT_EQ([delegate_ edits], 0); | 174 EXPECT_EQ([delegate_ edits], 0); |
| 153 EXPECT_EQ([delegate_ dones], 1); | 175 EXPECT_TRUE([delegate_ windowClosed]); |
| 154 EXPECT_TRUE([controller windowHasBeenClosed]); | |
| 155 } | 176 } |
| 156 | 177 |
| 157 // User changes title and parent folder in the UI | 178 // User changes title and parent folder in the UI |
| 158 TEST_F(BookmarkBubbleControllerTest, TestUserEdit) { | 179 TEST_F(BookmarkBubbleControllerTest, TestUserEdit) { |
| 159 BookmarkModel* model = GetBookmarkModel(); | 180 BookmarkModel* model = GetBookmarkModel(); |
| 160 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), | 181 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 161 0, | 182 0, |
| 162 L"short-title", | 183 L"short-title", |
| 163 GURL("http://www.google.com")); | 184 GURL("http://www.google.com")); |
| 164 model->AddGroup(model->GetBookmarkBarNode(), 0, L"grandma"); | 185 model->AddGroup(model->GetBookmarkBarNode(), 0, L"grandma"); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 182 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), | 203 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 183 0, | 204 0, |
| 184 L"Bookie markie title", | 205 L"Bookie markie title", |
| 185 gurl); | 206 gurl); |
| 186 BookmarkBubbleController* controller = ControllerForNode(node); | 207 BookmarkBubbleController* controller = ControllerForNode(node); |
| 187 EXPECT_TRUE(controller); | 208 EXPECT_TRUE(controller); |
| 188 EXPECT_TRUE(model->IsBookmarked(gurl)); | 209 EXPECT_TRUE(model->IsBookmarked(gurl)); |
| 189 | 210 |
| 190 [controller remove:controller]; | 211 [controller remove:controller]; |
| 191 EXPECT_FALSE(model->IsBookmarked(gurl)); | 212 EXPECT_FALSE(model->IsBookmarked(gurl)); |
| 192 EXPECT_TRUE([controller windowHasBeenClosed]); | 213 EXPECT_TRUE([delegate_ windowClosed]); |
| 193 EXPECT_EQ([delegate_ dones], 1); | |
| 194 } | 214 } |
| 195 | 215 |
| 196 // Confirm picking "choose another folder" caused edit: to be called. | 216 // Confirm picking "choose another folder" caused edit: to be called. |
| 197 TEST_F(BookmarkBubbleControllerTest, ComboSelectionChanged) { | 217 TEST_F(BookmarkBubbleControllerTest, ComboSelectionChanged) { |
| 198 BookmarkModel* model = GetBookmarkModel(); | 218 BookmarkModel* model = GetBookmarkModel(); |
| 199 GURL gurl("http://www.google.com"); | 219 GURL gurl("http://www.google.com"); |
| 200 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), | 220 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 201 0, L"super-title", | 221 0, L"super-title", |
| 202 gurl); | 222 gurl); |
| 203 BookmarkBubbleController* controller = ControllerForNode(node); | 223 BookmarkBubbleController* controller = ControllerForNode(node); |
| 204 EXPECT_TRUE(controller); | 224 EXPECT_TRUE(controller); |
| 205 | 225 |
| 206 NSString* chooseAnotherFolder = [controller chooseAnotherFolderString]; | 226 NSString* chooseAnotherFolder = [controller chooseAnotherFolderString]; |
| 207 EXPECT_EQ([delegate_ edits], 0); | 227 EXPECT_EQ([delegate_ edits], 0); |
| 208 [controller setTitle:@"DOH!" parentFolder:chooseAnotherFolder]; | 228 [controller setTitle:@"DOH!" parentFolder:chooseAnotherFolder]; |
| 209 EXPECT_EQ([delegate_ edits], 1); | 229 EXPECT_EQ([delegate_ edits], 1); |
| 210 } | 230 } |
| 211 | 231 |
| 212 // Create a controller that simulates the bookmark just now being created by | 232 // Create a controller that simulates the bookmark just now being created by |
| 213 // the user clicking the star, then sending the "cancel" command to represent | 233 // the user clicking the star, then sending the "cancel" command to represent |
| 214 // them pressing escape. The bookmark should not be there. | 234 // them pressing escape. The bookmark should not be there. |
| 215 TEST_F(BookmarkBubbleControllerTest, EscapeRemovesNewBookmark) { | 235 TEST_F(BookmarkBubbleControllerTest, EscapeRemovesNewBookmark) { |
| 216 BookmarkModel* model = GetBookmarkModel(); | 236 BookmarkModel* model = GetBookmarkModel(); |
| 217 GURL gurl("http://www.google.com"); | 237 GURL gurl("http://www.google.com"); |
| 218 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), | 238 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 219 0, | 239 0, |
| 220 L"Bookie markie title", | 240 L"Bookie markie title", |
| 221 gurl); | 241 gurl); |
| 222 scoped_nsobject<BookmarkBubbleController> controller( | 242 BookmarkBubbleController* controller = |
| 223 [[BookmarkBubbleController alloc] | 243 [[BookmarkBubbleController alloc] |
| 224 initWithDelegate:delegate_.get() | 244 initWithDelegate:delegate_.get() |
| 225 parentWindow:cocoa_helper_.window() | 245 parentWindow:test_window() |
| 226 topLeftForBubble:[delegate_ topLeftForBubble] | 246 topLeftForBubble:[delegate_ topLeftForBubble] |
| 227 model:helper_.profile()->GetBookmarkModel() | 247 model:helper_.profile()->GetBookmarkModel() |
| 228 node:node | 248 node:node |
| 229 alreadyBookmarked:NO]); // The last param is the key difference. | 249 alreadyBookmarked:NO]; // The last param is the key difference. |
| 230 EXPECT_TRUE(controller); | 250 EXPECT_TRUE([controller window]); |
| 231 | 251 // Calls release on controller. |
| 232 [controller cancel:nil]; | 252 [controller cancel:nil]; |
| 233 EXPECT_FALSE(model->IsBookmarked(gurl)); | 253 EXPECT_FALSE(model->IsBookmarked(gurl)); |
| 234 } | 254 } |
| 235 | 255 |
| 236 // Create a controller where the bookmark already existed prior to clicking | 256 // Create a controller where the bookmark already existed prior to clicking |
| 237 // the star and test that sending a cancel command doesn't change the state | 257 // the star and test that sending a cancel command doesn't change the state |
| 238 // of the bookmark. | 258 // of the bookmark. |
| 239 TEST_F(BookmarkBubbleControllerTest, EscapeDoesntTouchExistingBookmark) { | 259 TEST_F(BookmarkBubbleControllerTest, EscapeDoesntTouchExistingBookmark) { |
| 240 BookmarkModel* model = GetBookmarkModel(); | 260 BookmarkModel* model = GetBookmarkModel(); |
| 241 GURL gurl("http://www.google.com"); | 261 GURL gurl("http://www.google.com"); |
| 242 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), | 262 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 243 0, | 263 0, |
| 244 L"Bookie markie title", | 264 L"Bookie markie title", |
| 245 gurl); | 265 gurl); |
| 246 BookmarkBubbleController* controller = ControllerForNode(node); | 266 BookmarkBubbleController* controller = ControllerForNode(node); |
| 247 EXPECT_TRUE(controller); | 267 EXPECT_TRUE(controller); |
| 248 | 268 |
| 249 [(id)controller cancel:nil]; | 269 [(id)controller cancel:nil]; |
| 250 EXPECT_TRUE(model->IsBookmarked(gurl)); | 270 EXPECT_TRUE(model->IsBookmarked(gurl)); |
| 251 } | 271 } |
| 252 | 272 |
| 253 } // namespace | 273 } // namespace |
| OLD | NEW |