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 |