Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(525)

Side by Side Diff: chrome/browser/cocoa/bookmark_bubble_controller_unittest.mm

Issue 333017: Fixes up bookmark bubbles and the browser window so that they shut down corre... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698