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

Side by Side Diff: chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller_unittest.mm

Issue 5694001: Rework how bookmark bar folder menus and submenus are layed out when scrollin... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "chrome/browser/bookmarks/bookmark_model.h" 10 #include "chrome/browser/bookmarks/bookmark_model.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 // For testing. 57 // For testing.
58 @interface BookmarkBarFolderControllerNoLevel : BookmarkBarFolderController 58 @interface BookmarkBarFolderControllerNoLevel : BookmarkBarFolderController
59 @end 59 @end
60 60
61 @implementation BookmarkBarFolderControllerNoLevel 61 @implementation BookmarkBarFolderControllerNoLevel
62 - (void)configureWindowLevel { 62 - (void)configureWindowLevel {
63 // Intentionally empty. 63 // Intentionally empty.
64 } 64 }
65 @end 65 @end
66 66
67 // No window level and the ability to fake the "top left" point of the window. 67 @interface BookmarkBarFolderControllerPong : BookmarkBarFolderController {
68 // For testing.
69 @interface BookmarkBarFolderControllerLow : BookmarkBarFolderControllerNoLevel {
70 BOOL realTopLeft_; // Use the real windowTopLeft call?
71 }
72 @property (nonatomic) BOOL realTopLeft;
73 @end
74
75
76 @implementation BookmarkBarFolderControllerLow
77
78 @synthesize realTopLeft = realTopLeft_;
79
80 - (NSPoint)windowTopLeftForWidth:(int)width {
81 return realTopLeft_ ? [super windowTopLeftForWidth:width] :
82 NSMakePoint(200,200);
83 }
84
85 @end
86
87
88 @interface BookmarkBarFolderControllerPong : BookmarkBarFolderControllerLow {
89 BOOL childFolderWillShow_; 68 BOOL childFolderWillShow_;
90 BOOL childFolderWillClose_; 69 BOOL childFolderWillClose_;
91 } 70 }
92 @property (nonatomic, readonly) BOOL childFolderWillShow; 71 @property (nonatomic, readonly) BOOL childFolderWillShow;
93 @property (nonatomic, readonly) BOOL childFolderWillClose; 72 @property (nonatomic, readonly) BOOL childFolderWillClose;
94 @end 73 @end
95 74
96 @implementation BookmarkBarFolderControllerPong 75 @implementation BookmarkBarFolderControllerPong
97 @synthesize childFolderWillShow = childFolderWillShow_; 76 @synthesize childFolderWillShow = childFolderWillShow_;
98 @synthesize childFolderWillClose = childFolderWillClose_; 77 @synthesize childFolderWillClose = childFolderWillClose_;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 153
175 bar_.reset( 154 bar_.reset(
176 [[BookmarkBarControllerChildFolderRedirect alloc] 155 [[BookmarkBarControllerChildFolderRedirect alloc]
177 initWithBrowser:helper_.browser() 156 initWithBrowser:helper_.browser()
178 initialWidth:300 157 initialWidth:300
179 delegate:nil 158 delegate:nil
180 resizeDelegate:nil]); 159 resizeDelegate:nil]);
181 [bar_ loaded:model]; 160 [bar_ loaded:model];
182 // Make parent frame for bookmark bar then open it. 161 // Make parent frame for bookmark bar then open it.
183 NSRect frame = [[test_window() contentView] frame]; 162 NSRect frame = [[test_window() contentView] frame];
184 frame = NSInsetRect(frame, 100, 200); 163 frame = NSMakeRect(frame.origin.x,
164 frame.size.height - bookmarks::kNTPBookmarkBarHeight,
165 frame.size.width, bookmarks::kNTPBookmarkBarHeight);
185 NSView* fakeToolbarView = [[[NSView alloc] initWithFrame:frame] 166 NSView* fakeToolbarView = [[[NSView alloc] initWithFrame:frame]
186 autorelease]; 167 autorelease];
187 [[test_window() contentView] addSubview:fakeToolbarView]; 168 [[test_window() contentView] addSubview:fakeToolbarView];
188 [fakeToolbarView addSubview:[bar_ view]]; 169 [fakeToolbarView addSubview:[bar_ view]];
189 [bar_ setBookmarkBarEnabled:YES]; 170 [bar_ setBookmarkBarEnabled:YES];
190 } 171 }
191 172
192 // Remove the bookmark with the long title. 173 // Remove the bookmark with the long title.
193 void RemoveLongTitleNode() { 174 void RemoveLongTitleNode() {
194 BookmarkModel* model = helper_.profile()->GetBookmarkModel(); 175 BookmarkModel* model = helper_.profile()->GetBookmarkModel();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 // Make sure none of the buttons overlap, that all are inside 209 // Make sure none of the buttons overlap, that all are inside
229 // the content frame, and their cells are of the proper class. 210 // the content frame, and their cells are of the proper class.
230 NSArray* buttons = [bbfc buttons]; 211 NSArray* buttons = [bbfc buttons];
231 EXPECT_TRUE([buttons count]); 212 EXPECT_TRUE([buttons count]);
232 for (unsigned int i = 0; i < ([buttons count]-1); i++) { 213 for (unsigned int i = 0; i < ([buttons count]-1); i++) {
233 EXPECT_FALSE(NSContainsRect([[buttons objectAtIndex:i] frame], 214 EXPECT_FALSE(NSContainsRect([[buttons objectAtIndex:i] frame],
234 [[buttons objectAtIndex:i+1] frame])); 215 [[buttons objectAtIndex:i+1] frame]));
235 } 216 }
236 Class cellClass = [BookmarkBarFolderButtonCell class]; 217 Class cellClass = [BookmarkBarFolderButtonCell class];
237 for (BookmarkButton* button in buttons) { 218 for (BookmarkButton* button in buttons) {
238 NSRect r = [[bbfc mainView] convertRect:[button frame] fromView:button]; 219 NSRect r = [[bbfc folderView] convertRect:[button frame] fromView:button];
239 // TODO(jrg): remove this adjustment. 220 // TODO(jrg): remove this adjustment.
240 NSRect bigger = NSInsetRect([[bbfc mainView] frame], -2, 0); 221 NSRect bigger = NSInsetRect([[bbfc folderView] frame], -2, 0);
241 EXPECT_TRUE(NSContainsRect(bigger, r)); 222 EXPECT_TRUE(NSContainsRect(bigger, r));
242 EXPECT_TRUE([[button cell] isKindOfClass:cellClass]); 223 EXPECT_TRUE([[button cell] isKindOfClass:cellClass]);
243 } 224 }
244 225
245 // Confirm folder buttons have no tooltip. The important thing 226 // Confirm folder buttons have no tooltip. The important thing
246 // really is that we insure folders and non-folders are treated 227 // really is that we insure folders and non-folders are treated
247 // differently; not sure of any other generic way to do this. 228 // differently; not sure of any other generic way to do this.
248 for (BookmarkButton* button in buttons) { 229 for (BookmarkButton* button in buttons) {
249 if ([button isFolder]) 230 if ([button isFolder])
250 EXPECT_FALSE([button toolTip]); 231 EXPECT_FALSE([button toolTip]);
(...skipping 11 matching lines...) Expand all
262 243
263 [bbfc retain]; // stop the scoped_nsobject from doing anything 244 [bbfc retain]; // stop the scoped_nsobject from doing anything
264 [[bbfc window] close]; // trigger an autorelease of bbfc.get() 245 [[bbfc window] close]; // trigger an autorelease of bbfc.get()
265 } 246 }
266 247
267 TEST_F(BookmarkBarFolderControllerTest, BasicPosition) { 248 TEST_F(BookmarkBarFolderControllerTest, BasicPosition) {
268 BookmarkButton* parentButton = [[bar_ buttons] objectAtIndex:0]; 249 BookmarkButton* parentButton = [[bar_ buttons] objectAtIndex:0];
269 EXPECT_TRUE(parentButton); 250 EXPECT_TRUE(parentButton);
270 251
271 // If parent is a BookmarkBarController, grow down. 252 // If parent is a BookmarkBarController, grow down.
272 scoped_nsobject<BookmarkBarFolderControllerLow> bbfc; 253 scoped_nsobject<BookmarkBarFolderController> bbfc;
273 bbfc.reset([[BookmarkBarFolderControllerLow alloc] 254 bbfc.reset([[BookmarkBarFolderController alloc]
274 initWithParentButton:parentButton 255 initWithParentButton:parentButton
275 parentController:nil 256 parentController:nil
276 barController:bar_]); 257 barController:bar_]);
277 [bbfc window]; 258 [bbfc window];
278 [bbfc setRealTopLeft:YES];
279 NSPoint pt = [bbfc windowTopLeftForWidth:0]; // screen coords 259 NSPoint pt = [bbfc windowTopLeftForWidth:0]; // screen coords
280 NSPoint buttonOriginInScreen = 260 NSPoint buttonOriginInScreen =
281 [[parentButton window] 261 [[parentButton window]
282 convertBaseToScreen:[parentButton 262 convertBaseToScreen:[parentButton
283 convertRectToBase:[parentButton frame]].origin]; 263 convertRectToBase:[parentButton frame]].origin];
284 // Within margin 264 // Within margin
285 EXPECT_LE(abs(pt.x - buttonOriginInScreen.x), 265 EXPECT_LE(abs(pt.x - buttonOriginInScreen.x),
286 bookmarks::kBookmarkMenuOverlap+1); 266 bookmarks::kBookmarkMenuOverlap+1);
287 EXPECT_LE(abs(pt.y - buttonOriginInScreen.y), 267 EXPECT_LE(abs(pt.y - buttonOriginInScreen.y),
288 bookmarks::kBookmarkMenuOverlap+1); 268 bookmarks::kBookmarkMenuOverlap+1);
289 269
290 // Make sure we see the window shift left if it spills off the screen 270 // Make sure we see the window shift left if it spills off the screen
291 pt = [bbfc windowTopLeftForWidth:0]; 271 pt = [bbfc windowTopLeftForWidth:0];
292 NSPoint shifted = [bbfc windowTopLeftForWidth:9999999]; 272 NSPoint shifted = [bbfc windowTopLeftForWidth:9999999];
293 EXPECT_LT(shifted.x, pt.x); 273 EXPECT_LT(shifted.x, pt.x);
294 274
295 // If parent is a BookmarkBarFolderController, grow right. 275 // If parent is a BookmarkBarFolderController, grow right.
296 scoped_nsobject<BookmarkBarFolderControllerLow> bbfc2; 276 scoped_nsobject<BookmarkBarFolderController> bbfc2;
297 bbfc2.reset([[BookmarkBarFolderControllerLow alloc] 277 bbfc2.reset([[BookmarkBarFolderController alloc]
298 initWithParentButton:[[bbfc buttons] objectAtIndex:0] 278 initWithParentButton:[[bbfc buttons] objectAtIndex:0]
299 parentController:bbfc.get() 279 parentController:bbfc.get()
300 barController:bar_]); 280 barController:bar_]);
301 [bbfc2 window]; 281 [bbfc2 window];
302 [bbfc2 setRealTopLeft:YES];
303 pt = [bbfc2 windowTopLeftForWidth:0]; 282 pt = [bbfc2 windowTopLeftForWidth:0];
304 // We're now overlapping the window a bit. 283 // We're now overlapping the window a bit.
305 EXPECT_EQ(pt.x, NSMaxX([[bbfc.get() window] frame]) - 284 EXPECT_EQ(pt.x, NSMaxX([[bbfc.get() window] frame]) -
306 bookmarks::kBookmarkMenuOverlap); 285 bookmarks::kBookmarkMenuOverlap);
307 } 286 }
308 287
309 // Confirm we grow right until end of screen, then start growing left 288 // Confirm we grow right until end of screen, then start growing left
310 // until end of screen again, then right. 289 // until end of screen again, then right.
311 TEST_F(BookmarkBarFolderControllerTest, PositionRightLeftRight) { 290 TEST_F(BookmarkBarFolderControllerTest, PositionRightLeftRight) {
312 BookmarkModel* model = helper_.profile()->GetBookmarkModel(); 291 BookmarkModel* model = helper_.profile()->GetBookmarkModel();
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 // (No need to EXPECT a final "grow right"; if we didn't find one 348 // (No need to EXPECT a final "grow right"; if we didn't find one
370 // we'd get a C++ array bounds exception). 349 // we'd get a C++ array bounds exception).
371 } 350 }
372 351
373 TEST_F(BookmarkBarFolderControllerTest, DropDestination) { 352 TEST_F(BookmarkBarFolderControllerTest, DropDestination) {
374 scoped_nsobject<BookmarkBarFolderController> bbfc; 353 scoped_nsobject<BookmarkBarFolderController> bbfc;
375 bbfc.reset(SimpleBookmarkBarFolderController()); 354 bbfc.reset(SimpleBookmarkBarFolderController());
376 EXPECT_TRUE(bbfc.get()); 355 EXPECT_TRUE(bbfc.get());
377 356
378 // Confirm "off the top" and "off the bottom" match no buttons. 357 // Confirm "off the top" and "off the bottom" match no buttons.
379 NSPoint p = NSMakePoint(NSMidX([[bbfc mainView] frame]), 10000); 358 NSPoint p = NSMakePoint(NSMidX([[bbfc folderView] frame]), 10000);
380 EXPECT_FALSE([bbfc buttonForDroppingOnAtPoint:p]); 359 EXPECT_FALSE([bbfc buttonForDroppingOnAtPoint:p]);
381 EXPECT_TRUE([bbfc shouldShowIndicatorShownForPoint:p]); 360 EXPECT_TRUE([bbfc shouldShowIndicatorShownForPoint:p]);
382 p = NSMakePoint(NSMidX([[bbfc mainView] frame]), -1); 361 p = NSMakePoint(NSMidX([[bbfc folderView] frame]), -1);
383 EXPECT_FALSE([bbfc buttonForDroppingOnAtPoint:p]); 362 EXPECT_FALSE([bbfc buttonForDroppingOnAtPoint:p]);
384 EXPECT_TRUE([bbfc shouldShowIndicatorShownForPoint:p]); 363 EXPECT_TRUE([bbfc shouldShowIndicatorShownForPoint:p]);
385 364
386 // Confirm "right in the center" (give or take a pixel) is a match, 365 // Confirm "right in the center" (give or take a pixel) is a match,
387 // and confirm "just barely in the button" is not. Anything more 366 // and confirm "just barely in the button" is not. Anything more
388 // specific seems likely to be tweaked. We don't loop over all 367 // specific seems likely to be tweaked. We don't loop over all
389 // buttons because the scroll view makes them not visible. 368 // buttons because the scroll view makes them not visible.
390 for (BookmarkButton* button in [bbfc buttons]) { 369 for (BookmarkButton* button in [bbfc buttons]) {
391 CGFloat x = NSMidX([button frame]); 370 CGFloat x = NSMidX([button frame]);
392 CGFloat y = NSMidY([button frame]); 371 CGFloat y = NSMidY([button frame]);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 EXPECT_TRUE(bbfc.get()); 442 EXPECT_TRUE(bbfc.get());
464 CGFloat thinWidth = NSWidth([[bbfc window] frame]); 443 CGFloat thinWidth = NSWidth([[bbfc window] frame]);
465 444
466 // Make sure window size changed as expected. 445 // Make sure window size changed as expected.
467 EXPECT_GT(wideWidth, thinWidth); 446 EXPECT_GT(wideWidth, thinWidth);
468 } 447 }
469 448
470 // Simple scrolling tests. 449 // Simple scrolling tests.
471 TEST_F(BookmarkBarFolderControllerTest, SimpleScroll) { 450 TEST_F(BookmarkBarFolderControllerTest, SimpleScroll) {
472 scoped_nsobject<BookmarkBarFolderController> bbfc; 451 scoped_nsobject<BookmarkBarFolderController> bbfc;
473 452 NSRect screenFrame = [[NSScreen mainScreen] frame];
453 CGFloat screenHeight = NSHeight(screenFrame);
474 int nodecount = AddLotsOfNodes(); 454 int nodecount = AddLotsOfNodes();
475 bbfc.reset(SimpleBookmarkBarFolderController()); 455 bbfc.reset(SimpleBookmarkBarFolderController());
476 EXPECT_TRUE(bbfc.get()); 456 EXPECT_TRUE(bbfc.get());
477 [bbfc showWindow:bbfc.get()]; 457 [bbfc showWindow:bbfc.get()];
458 NSWindow* window = [bbfc window];
478 459
479 // Make sure the window fits on the screen. 460 // The window should be shorter than the screen but reach exactly to the
480 EXPECT_LT(NSHeight([[bbfc window] frame]), 461 // bottom of the screen since it's scrollable.
481 NSHeight([[NSScreen mainScreen] frame])); 462 EXPECT_LT(NSHeight([window frame]), screenHeight);
463 EXPECT_CGFLOAT_EQ(0.0, [window frame].origin.y);
482 464
483 // Verify the logic used by the scroll arrow code. 465 // Initially, should show scroll-up but not scroll-down.
484 EXPECT_TRUE([bbfc canScrollUp]); 466 EXPECT_TRUE([bbfc canScrollUp]);
485 EXPECT_FALSE([bbfc canScrollDown]); 467 EXPECT_FALSE([bbfc canScrollDown]);
486 468
487 // Scroll it up. Make sure the window has gotten bigger each time. 469 // Scroll up a bit. Make sure the window has gotten bigger each time.
488 // Also, for each scroll, make sure our hit test finds a new button 470 // Also, for each scroll, make sure our hit test finds a new button
489 // (to confirm the content area changed). 471 // (to confirm the content area changed).
490 NSView* savedHit = nil; 472 NSView* savedHit = nil;
491 for (int i=0; i<3; i++) { 473 NSView* scrollView = [bbfc scrollView];
492 CGFloat height = NSHeight([[bbfc window] frame]); 474
475 // Find the next-to-last button showing at the bottom of the window and
476 // us its center for hit testing.
477 BookmarkButton* targetButton = nil;
478 NSPoint scrollPoint = [[bbfc scrollView] documentVisibleRect].origin;
479 for (BookmarkButton* button in [bbfc buttons]) {
480 NSRect buttonFrame = [button frame];
481 buttonFrame.origin.y -= scrollPoint.y;
482 if (buttonFrame.origin.y < 0.0)
483 break;
484 targetButton = button;
485 }
486 NSPoint hitPoint = [targetButton frame].origin;
487 hitPoint.x += 50.0;
488 hitPoint.y += (bookmarks::kBookmarkButtonHeight / 2.0) - scrollPoint.y;
489
490 for (int i = 0; i < 3; i++) {
491 CGFloat height = NSHeight([window frame]);
493 [bbfc performOneScroll:60]; 492 [bbfc performOneScroll:60];
494 EXPECT_GT(NSHeight([[bbfc window] frame]), height); 493 EXPECT_GT(NSHeight([window frame]), height);
495 NSView* hit = [[[bbfc window] contentView] hitTest:NSMakePoint(22, 22)]; 494 NSView* hit = [scrollView hitTest:hitPoint];
495 // We should hit a bookmark button.
496 EXPECT_TRUE([[hit className] isEqualToString:@"BookmarkButton"]);
496 EXPECT_NE(hit, savedHit); 497 EXPECT_NE(hit, savedHit);
497 savedHit = hit; 498 savedHit = hit;
498 } 499 }
499 500
500 // Keep scrolling up; make sure we never get bigger than the screen. 501 // Keep scrolling up; make sure we never get bigger than the screen.
501 // Also confirm we never scroll the window off the screen. 502 // Also confirm we never scroll the window off the screen.
502 bool bothAtOnce = false; 503 bool bothAtOnce = false;
503 NSRect screenFrame = [[NSScreen mainScreen] frame]; 504 while ([bbfc canScrollUp]) {
504 for (int i = 0; i < nodecount; i++) {
505 [bbfc performOneScroll:60]; 505 [bbfc performOneScroll:60];
506 EXPECT_TRUE(NSContainsRect(screenFrame, 506 EXPECT_TRUE(NSContainsRect(screenFrame, [window frame]));
507 [[bbfc window] frame]));
508 // Make sure, sometime during our scroll, we have the ability to 507 // Make sure, sometime during our scroll, we have the ability to
509 // scroll in either direction. 508 // scroll in either direction.
510 if ([bbfc canScrollUp] && 509 if ([bbfc canScrollUp] &&
511 [bbfc canScrollDown]) 510 [bbfc canScrollDown])
512 bothAtOnce = true; 511 bothAtOnce = true;
513 } 512 }
514 EXPECT_TRUE(bothAtOnce); 513 EXPECT_TRUE(bothAtOnce);
515 514
516 // Once we've scrolled to the end, our only option should be to scroll back. 515 // Once we've scrolled to the end, our only option should be to scroll back.
517 EXPECT_FALSE([bbfc canScrollUp]); 516 EXPECT_FALSE([bbfc canScrollUp]);
518 EXPECT_TRUE([bbfc canScrollDown]); 517 EXPECT_TRUE([bbfc canScrollDown]);
519 518
520 // Now scroll down and make sure the window size does not change. 519 // Now scroll down and make sure the window size does not change.
521 // Also confirm we never scroll the window off the screen the other 520 // Also confirm we never scroll the window off the screen the other
522 // way. 521 // way.
523 for (int i=0; i<nodecount+50; i++) { 522 for (int i = 0; i < nodecount+50; ++i) {
524 CGFloat height = NSHeight([[bbfc window] frame]);
525 [bbfc performOneScroll:-60]; 523 [bbfc performOneScroll:-60];
526 EXPECT_EQ(height, NSHeight([[bbfc window] frame])); 524 // Once we can no longer scroll down the window height changes.
527 EXPECT_TRUE(NSContainsRect(screenFrame, 525 if (![bbfc canScrollDown])
528 [[bbfc window] frame])); 526 break;
527 EXPECT_EQ(screenHeight, NSHeight([window frame]));
528 EXPECT_TRUE(NSContainsRect(screenFrame, [window frame]));
529 } 529 }
530 // The final height should be offset from the top of the screen and still
531 // within the screen.
532 CGFloat height = screenHeight - bookmarks::kScrollWindowVerticalMargin;
533 EXPECT_CGFLOAT_EQ(height, NSHeight([window frame]));
534 EXPECT_TRUE(NSContainsRect(screenFrame, [window frame]));
530 } 535 }
531 536
532 // Folder menu sizing and placementwhile deleting bookmarks and scrolling tests. 537 // Folder menu sizing and placement while deleting bookmarks
538 // and scrolling tests.
533 TEST_F(BookmarkBarFolderControllerTest, MenuPlacementWhileScrollingDeleting) { 539 TEST_F(BookmarkBarFolderControllerTest, MenuPlacementWhileScrollingDeleting) {
534 scoped_nsobject<BookmarkBarFolderController> bbfc; 540 scoped_nsobject<BookmarkBarFolderController> bbfc;
535 AddLotsOfNodes(); 541 AddLotsOfNodes();
536 bbfc.reset(SimpleBookmarkBarFolderController()); 542 bbfc.reset(SimpleBookmarkBarFolderController());
537 [bbfc showWindow:bbfc.get()]; 543 [bbfc showWindow:bbfc.get()];
538 NSWindow* menuWindow = [bbfc window]; 544 NSWindow* menuWindow = [bbfc window];
539 BookmarkBarFolderController* folder = [bar_ folderController]; 545 BookmarkBarFolderController* folder = [bar_ folderController];
540 NSArray* buttons = [folder buttons]; 546 NSArray* buttons = [folder buttons];
541 547
542 // Before scrolling any, delete a bookmark and make sure the window top has 548 // Before scrolling any, delete a bookmark and make sure the window top has
(...skipping 29 matching lines...) Expand all
572 // Scroll so that the top scroll arrow is no longer showing, make sure 578 // Scroll so that the top scroll arrow is no longer showing, make sure
573 // the top of the window has not moved, then delete a visible button and 579 // the top of the window has not moved, then delete a visible button and
574 // make sure the top has not moved. 580 // make sure the top has not moved.
575 while ([bbfc canScrollDown]) { 581 while ([bbfc canScrollDown]) {
576 [bbfc performOneScroll:-scrollOneBookmark]; 582 [bbfc performOneScroll:-scrollOneBookmark];
577 --buttonCounter; 583 --buttonCounter;
578 } 584 }
579 button = [buttons objectAtIndex:buttonCounter + 3]; 585 button = [buttons objectAtIndex:buttonCounter + 3];
580 [folder deleteBookmark:button]; 586 [folder deleteBookmark:button];
581 newTop = [menuWindow frame].origin.y + NSHeight([menuWindow frame]); 587 newTop = [menuWindow frame].origin.y + NSHeight([menuWindow frame]);
582 EXPECT_CGFLOAT_EQ(oldTop, newTop); 588 EXPECT_CGFLOAT_EQ(oldTop - bookmarks::kScrollWindowVerticalMargin, newTop);
583 } 589 }
584 590
585 @interface FakedDragInfo : NSObject { 591 @interface FakedDragInfo : NSObject {
586 @public 592 @public
587 NSPoint dropLocation_; 593 NSPoint dropLocation_;
588 NSDragOperation sourceMask_; 594 NSDragOperation sourceMask_;
589 } 595 }
590 @property (nonatomic, assign) NSPoint dropLocation; 596 @property (nonatomic, assign) NSPoint dropLocation;
591 - (void)setDraggingSourceOperationMask:(NSDragOperation)mask; 597 - (void)setDraggingSourceOperationMask:(NSDragOperation)mask;
592 @end 598 @end
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 resizeDelegate:resizeDelegate_.get()]); 655 resizeDelegate:resizeDelegate_.get()]);
650 InstallAndToggleBar(bar_.get()); 656 InstallAndToggleBar(bar_.get());
651 } 657 }
652 658
653 void InstallAndToggleBar(BookmarkBarController* bar) { 659 void InstallAndToggleBar(BookmarkBarController* bar) {
654 // Force loading of the nib. 660 // Force loading of the nib.
655 [bar view]; 661 [bar view];
656 // Awkwardness to look like we've been installed. 662 // Awkwardness to look like we've been installed.
657 [parent_view_ addSubview:[bar view]]; 663 [parent_view_ addSubview:[bar view]];
658 NSRect frame = [[[bar view] superview] frame]; 664 NSRect frame = [[[bar view] superview] frame];
659 frame.origin.y = 100; 665 frame.origin.y = 400;
660 [[[bar view] superview] setFrame:frame]; 666 [[[bar view] superview] setFrame:frame];
661 667
662 // Make sure it's on in a window so viewDidMoveToWindow is called 668 // Make sure it's on in a window so viewDidMoveToWindow is called
663 [[test_window() contentView] addSubview:parent_view_]; 669 [[test_window() contentView] addSubview:parent_view_];
664 670
665 // Make sure it's open so certain things aren't no-ops. 671 // Make sure it's open so certain things aren't no-ops.
666 [bar updateAndShowNormalBar:YES 672 [bar updateAndShowNormalBar:YES
667 showDetachedBar:NO 673 showDetachedBar:NO
668 withAnimation:NO]; 674 withAnimation:NO];
669 } 675 }
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 [folderController validateMenuSpacing]; 869 [folderController validateMenuSpacing];
864 [subfolderController validateMenuSpacing]; 870 [subfolderController validateMenuSpacing];
865 871
866 // Check the window layouts. The folder window should not have changed, 872 // Check the window layouts. The folder window should not have changed,
867 // but the subfolder window should have shifted vertically and grown. 873 // but the subfolder window should have shifted vertically and grown.
868 NSRect newToWindowFrame = [toWindow frame]; 874 NSRect newToWindowFrame = [toWindow frame];
869 EXPECT_NSRECT_EQ(oldToWindowFrame, newToWindowFrame); 875 EXPECT_NSRECT_EQ(oldToWindowFrame, newToWindowFrame);
870 NSRect newToSubwindowFrame = [toSubwindow frame]; 876 NSRect newToSubwindowFrame = [toSubwindow frame];
871 NSRect expectedToSubwindowFrame = oldToSubwindowFrame; 877 NSRect expectedToSubwindowFrame = oldToSubwindowFrame;
872 expectedToSubwindowFrame.origin.y -= 878 expectedToSubwindowFrame.origin.y -=
873 bookmarks::kBookmarkBarHeight + bookmarks::kVisualHeightOffset; 879 (bookmarks::kBookmarkButtonHeight + bookmarks::kVisualHeightOffset);
874 expectedToSubwindowFrame.size.height += 880 expectedToSubwindowFrame.size.height +=
875 bookmarks::kBookmarkBarHeight + bookmarks::kVisualHeightOffset; 881 (bookmarks::kBookmarkButtonHeight + bookmarks::kVisualHeightOffset);
876 EXPECT_NSRECT_EQ(expectedToSubwindowFrame, newToSubwindowFrame); 882 EXPECT_NSRECT_EQ(expectedToSubwindowFrame, newToSubwindowFrame);
877 } 883 }
878 884
879 TEST_F(BookmarkBarFolderControllerMenuTest, DragMoveWithinFolder) { 885 TEST_F(BookmarkBarFolderControllerMenuTest, DragMoveWithinFolder) {
880 BookmarkModel& model(*helper_.profile()->GetBookmarkModel()); 886 BookmarkModel& model(*helper_.profile()->GetBookmarkModel());
881 const BookmarkNode* root = model.GetBookmarkBarNode(); 887 const BookmarkNode* root = model.GetBookmarkBarNode();
882 const std::string model_string("1b 2f:[ 2f1b 2f2f:[ 2f2f1b 2f2f2b " 888 const std::string model_string("1b 2f:[ 2f1b 2f2f:[ 2f2f1b 2f2f2b "
883 "2f2f3b ] 2f3b ] 3b 4f:[ 4f1f:[ 4f1f1b 4f1f2b 4f1f3b ] 4f2f:[ 4f2f1b " 889 "2f2f3b ] 2f3b ] 3b 4f:[ 4f1f:[ 4f1f1b 4f1f2b 4f1f3b ] 4f2f:[ 4f2f1b "
884 "4f2f2b 4f2f3b ] 4f3f:[ 4f3f1b 4f3f2b 4f3f3b ] ] 5b "); 890 "4f2f2b 4f2f3b ] 4f3f:[ 4f3f1b 4f3f2b 4f3f3b ] ] 5b ");
885 model_test_utils::AddNodesFromModelString(model, root, model_string); 891 model_test_utils::AddNodesFromModelString(model, root, model_string);
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
1166 const BookmarkNode* folder = model.AddGroup(parent, 1172 const BookmarkNode* folder = model.AddGroup(parent,
1167 parent->GetChildCount(), 1173 parent->GetChildCount(),
1168 ASCIIToUTF16("BIG")); 1174 ASCIIToUTF16("BIG"));
1169 1175
1170 // Pop open the new folder window and verify it has one (empty) item. 1176 // Pop open the new folder window and verify it has one (empty) item.
1171 BookmarkButton* button = [bar_ buttonWithTitleEqualTo:@"BIG"]; 1177 BookmarkButton* button = [bar_ buttonWithTitleEqualTo:@"BIG"];
1172 [[button target] performSelector:@selector(openBookmarkFolderFromButton:) 1178 [[button target] performSelector:@selector(openBookmarkFolderFromButton:)
1173 withObject:button]; 1179 withObject:button];
1174 BookmarkBarFolderController* folderController = [bar_ folderController]; 1180 BookmarkBarFolderController* folderController = [bar_ folderController];
1175 EXPECT_TRUE(folderController); 1181 EXPECT_TRUE(folderController);
1176 NSWindow* folderMenu = [folderController window]; 1182 NSWindow* folderWindow = [folderController window];
1177 EXPECT_TRUE(folderMenu); 1183 EXPECT_TRUE(folderWindow);
1178 CGFloat expectedHeight = (CGFloat)bookmarks::kBookmarkButtonHeight + 1184 CGFloat expectedHeight = (CGFloat)bookmarks::kBookmarkButtonHeight +
1179 (2*bookmarks::kBookmarkVerticalPadding); 1185 (2*bookmarks::kBookmarkVerticalPadding);
1180 NSRect menuFrame = [folderMenu frame]; 1186 NSRect windowFrame = [folderWindow frame];
1181 CGFloat menuHeight = NSHeight(menuFrame); 1187 CGFloat windowHeight = NSHeight(windowFrame);
1182 EXPECT_CGFLOAT_EQ(expectedHeight, menuHeight); 1188 EXPECT_CGFLOAT_EQ(expectedHeight, windowHeight);
1183 EXPECT_FALSE([folderController scrollable]); 1189 EXPECT_FALSE([folderController canScrollUp]);
1190 EXPECT_FALSE([folderController canScrollDown]);
1184 1191
1185 // Now add a real bookmark and reopen. 1192 // Now add a real bookmark and reopen.
1186 model.AddURL(folder, folder->GetChildCount(), ASCIIToUTF16("a"), 1193 model.AddURL(folder, folder->GetChildCount(), ASCIIToUTF16("a"),
1187 GURL("http://a.com/")); 1194 GURL("http://a.com/"));
1188 folderController = [bar_ folderController]; 1195 folderController = [bar_ folderController];
1189 EXPECT_TRUE(folderController); 1196 EXPECT_TRUE(folderController);
1190 folderMenu = [folderController window]; 1197 NSView* folderView = [folderController folderView];
1191 EXPECT_TRUE(folderMenu); 1198 EXPECT_TRUE(folderView);
1192 menuFrame = [folderMenu frame]; 1199 NSRect menuFrame = [folderView frame];
1193 menuHeight = NSHeight(menuFrame); 1200 NSView* visibleView = [folderController visibleView];
1201 NSRect visibleFrame = [visibleView frame];
1202 NSView* scrollView = [folderController scrollView];
1203 NSRect scrollFrame = [scrollView frame];
1204
1205 // Determine the margins between the scroll frame and the visible frame.
1206 CGFloat widthDelta = NSWidth(visibleFrame) - NSWidth(scrollFrame);
1207
1208 CGFloat menuHeight = NSHeight(menuFrame);
1194 EXPECT_CGFLOAT_EQ(expectedHeight, menuHeight); 1209 EXPECT_CGFLOAT_EQ(expectedHeight, menuHeight);
1195 CGFloat menuWidth = NSWidth(menuFrame); 1210 CGFloat scrollerWidth = NSWidth(scrollFrame);
1196 button = [folderController buttonWithTitleEqualTo:@"a"]; 1211 button = [folderController buttonWithTitleEqualTo:@"a"];
1197 CGFloat buttonWidth = NSWidth([button frame]); 1212 CGFloat buttonWidth = NSWidth([button frame]);
1198 CGFloat expectedWidth = 1213 EXPECT_CGFLOAT_EQ(scrollerWidth, buttonWidth);
1199 buttonWidth + (2 * bookmarks::kBookmarkSubMenuHorizontalPadding); 1214 CGFloat visibleWidth = NSWidth(visibleFrame);
1200 EXPECT_CGFLOAT_EQ(expectedWidth, menuWidth); 1215 EXPECT_CGFLOAT_EQ(visibleWidth - widthDelta, buttonWidth);
1216 EXPECT_LT(scrollerWidth, NSWidth([folderView frame]));
1201 1217
1202 // Add a wider bookmark and make sure the button widths match. 1218 // Add a wider bookmark and make sure the button widths match.
1203 model.AddURL(folder, folder->GetChildCount(), 1219 int reallyWideButtonNumber = folder->GetChildCount();
1204 ASCIIToUTF16("A really, really long name"), 1220 model.AddURL(folder, reallyWideButtonNumber,
1221 ASCIIToUTF16("A really, really, really, really, really, "
1222 "really long name"),
1205 GURL("http://www.google.com/a")); 1223 GURL("http://www.google.com/a"));
1206 EXPECT_LT(menuWidth, NSWidth([folderMenu frame])); 1224 BookmarkButton* bigButton =
1207 EXPECT_LT(buttonWidth, NSWidth([button frame])); 1225 [folderController buttonWithTitleEqualTo:
1208 buttonWidth = NSWidth([button frame]); 1226 @"A really, really, really, really, really, really long name"];
1209 BookmarkButton* buttonB = 1227 EXPECT_TRUE(bigButton);
1210 [folderController buttonWithTitleEqualTo:@"A really, really long name"]; 1228 CGFloat buttonWidthB = NSWidth([bigButton frame]);
1211 EXPECT_TRUE(buttonB); 1229 EXPECT_LT(buttonWidth, buttonWidthB);
1212 CGFloat buttonWidthB = NSWidth([buttonB frame]); 1230 // Add a bunch of bookmarks until the window becomes scrollable, then check
1213 EXPECT_CGFLOAT_EQ(buttonWidth, buttonWidthB); 1231 // for a scroll up arrow.
1214 // Add a bunch of bookmarks until the window grows no more, then check for
1215 // a scroll down arrow.
1216 CGFloat oldMenuHeight = 0.0; // It just has to be different for first run.
1217 menuHeight = NSHeight([folderMenu frame]);
1218 NSUInteger tripWire = 0; // Prevent a runaway. 1232 NSUInteger tripWire = 0; // Prevent a runaway.
1219 while (![folderController scrollable] && ++tripWire < 100) { 1233 while (![folderController canScrollUp] && ++tripWire < 1000) {
1220 model.AddURL(folder, folder->GetChildCount(), ASCIIToUTF16("B"), 1234 model.AddURL(folder, folder->GetChildCount(), ASCIIToUTF16("B"),
1221 GURL("http://b.com/")); 1235 GURL("http://b.com/"));
1222 oldMenuHeight = menuHeight;
1223 menuHeight = NSHeight([folderMenu frame]);
1224 } 1236 }
1225 EXPECT_TRUE([folderController scrollable]);
1226 EXPECT_TRUE([folderController canScrollUp]); 1237 EXPECT_TRUE([folderController canScrollUp]);
1227 1238
1228 // Remove one bookmark and make sure the scroll down arrow has been removed. 1239 // Remove one bookmark and make sure the scroll down arrow has been removed.
1229 // We'll remove the really long node so we can see if the buttons get resized. 1240 // We'll remove the really long node so we can see if the buttons get resized.
1230 menuWidth = NSWidth([folderMenu frame]); 1241 scrollerWidth = NSWidth([folderView frame]);
1231 buttonWidth = NSWidth([button frame]); 1242 buttonWidth = NSWidth([button frame]);
1232 model.Remove(folder, 1); 1243 model.Remove(folder, reallyWideButtonNumber);
1233 EXPECT_FALSE([folderController scrollable]);
1234 EXPECT_FALSE([folderController canScrollUp]); 1244 EXPECT_FALSE([folderController canScrollUp]);
1235 EXPECT_FALSE([folderController canScrollDown]); 1245 EXPECT_FALSE([folderController canScrollDown]);
1236 1246
1237 // Check the size. It should have reduced. 1247 // Check the size. It should have reduced.
1238 EXPECT_GT(menuWidth, NSWidth([folderMenu frame])); 1248 EXPECT_GT(scrollerWidth, NSWidth([folderView frame]));
1239 EXPECT_GT(buttonWidth, NSWidth([button frame])); 1249 EXPECT_GT(buttonWidth, NSWidth([button frame]));
1240 1250
1241 // Check button spacing. 1251 // Check button spacing.
1242 [folderController validateMenuSpacing]; 1252 [folderController validateMenuSpacing];
1243 } 1253 }
1244 1254
1245 // See http://crbug.com/46101 1255 // See http://crbug.com/46101
1246 TEST_F(BookmarkBarFolderControllerMenuTest, HoverThenDeleteBookmark) { 1256 TEST_F(BookmarkBarFolderControllerMenuTest, HoverThenDeleteBookmark) {
1247 BookmarkModel& model(*helper_.profile()->GetBookmarkModel()); 1257 BookmarkModel& model(*helper_.profile()->GetBookmarkModel());
1248 const BookmarkNode* root = model.GetBookmarkBarNode(); 1258 const BookmarkNode* root = model.GetBookmarkBarNode();
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1355 ASSERT_TRUE(targetButton); 1365 ASSERT_TRUE(targetButton);
1356 newNode = other->GetChild(2); // Should be O4f. 1366 newNode = other->GetChild(2); // Should be O4f.
1357 EXPECT_EQ(newNode->GetTitle(), ASCIIToUTF16("O4f")); 1367 EXPECT_EQ(newNode->GetTitle(), ASCIIToUTF16("O4f"));
1358 [folderController setDragDataNode:newNode]; 1368 [folderController setDragDataNode:newNode];
1359 [dragInfo setDropLocation:[targetButton center]]; 1369 [dragInfo setDropLocation:[targetButton center]];
1360 [folderController dragBookmarkData:(id<NSDraggingInfo>)dragInfo.get()]; 1370 [folderController dragBookmarkData:(id<NSDraggingInfo>)dragInfo.get()];
1361 1371
1362 // Verify the model. 1372 // Verify the model.
1363 const std::string expectedA("1b 2f:[ O3f:[ O3f1b O3f2f ] 2f1b 2f2f:[ " 1373 const std::string expectedA("1b 2f:[ O3f:[ O3f1b O3f2f ] 2f1b 2f2f:[ "
1364 "2f2f1b 2f2f2b 2f2f3b O4f:[ O4f1b O4f2f ] ] " 1374 "2f2f1b 2f2f2b 2f2f3b O4f:[ O4f1b O4f2f ] ] "
1365 "2f3b ] 3b 4b "); 1375 "2f3b ] 3b 4b ");
1366 actual = model_test_utils::ModelStringFromNode(root); 1376 actual = model_test_utils::ModelStringFromNode(root);
1367 EXPECT_EQ(expectedA, actual); 1377 EXPECT_EQ(expectedA, actual);
1368 1378
1369 // Check button spacing. 1379 // Check button spacing.
1370 [folderController validateMenuSpacing]; 1380 [folderController validateMenuSpacing];
1371 } 1381 }
1372 1382
1373 TEST_F(BookmarkBarFolderControllerMenuTest, DragBookmarkDataToTrash) { 1383 TEST_F(BookmarkBarFolderControllerMenuTest, DragBookmarkDataToTrash) {
1374 BookmarkModel& model(*helper_.profile()->GetBookmarkModel()); 1384 BookmarkModel& model(*helper_.profile()->GetBookmarkModel());
1375 const BookmarkNode* root = model.GetBookmarkBarNode(); 1385 const BookmarkNode* root = model.GetBookmarkBarNode();
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1543 [folder deleteBookmark:folder]; 1553 [folder deleteBookmark:folder];
1544 EXPECT_FALSE([folder folderController]); 1554 EXPECT_FALSE([folder folderController]);
1545 } 1555 }
1546 1556
1547 // TODO(jrg): draggingEntered: and draggingExited: trigger timers so 1557 // TODO(jrg): draggingEntered: and draggingExited: trigger timers so
1548 // they are hard to test. Factor out "fire timers" into routines 1558 // they are hard to test. Factor out "fire timers" into routines
1549 // which can be overridden to fire immediately to make behavior 1559 // which can be overridden to fire immediately to make behavior
1550 // confirmable. 1560 // confirmable.
1551 // There is a similar problem with mouseEnteredButton: and 1561 // There is a similar problem with mouseEnteredButton: and
1552 // mouseExitedButton:. 1562 // mouseExitedButton:.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698