Index: chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller_unittest.mm |
=================================================================== |
--- chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller_unittest.mm (revision 70424) |
+++ chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller_unittest.mm (working copy) |
@@ -64,28 +64,7 @@ |
} |
@end |
-// No window level and the ability to fake the "top left" point of the window. |
-// For testing. |
-@interface BookmarkBarFolderControllerLow : BookmarkBarFolderControllerNoLevel { |
- BOOL realTopLeft_; // Use the real windowTopLeft call? |
-} |
-@property (nonatomic) BOOL realTopLeft; |
-@end |
- |
- |
-@implementation BookmarkBarFolderControllerLow |
- |
-@synthesize realTopLeft = realTopLeft_; |
- |
-- (NSPoint)windowTopLeftForWidth:(int)width { |
- return realTopLeft_ ? [super windowTopLeftForWidth:width] : |
- NSMakePoint(200,200); |
-} |
- |
-@end |
- |
- |
-@interface BookmarkBarFolderControllerPong : BookmarkBarFolderControllerLow { |
+@interface BookmarkBarFolderControllerPong : BookmarkBarFolderController { |
BOOL childFolderWillShow_; |
BOOL childFolderWillClose_; |
} |
@@ -181,7 +160,9 @@ |
[bar_ loaded:model]; |
// Make parent frame for bookmark bar then open it. |
NSRect frame = [[test_window() contentView] frame]; |
- frame = NSInsetRect(frame, 100, 200); |
+ frame = NSMakeRect(frame.origin.x, |
+ frame.size.height - bookmarks::kNTPBookmarkBarHeight, |
+ frame.size.width, bookmarks::kNTPBookmarkBarHeight); |
NSView* fakeToolbarView = [[[NSView alloc] initWithFrame:frame] |
autorelease]; |
[[test_window() contentView] addSubview:fakeToolbarView]; |
@@ -235,9 +216,9 @@ |
} |
Class cellClass = [BookmarkBarFolderButtonCell class]; |
for (BookmarkButton* button in buttons) { |
- NSRect r = [[bbfc mainView] convertRect:[button frame] fromView:button]; |
+ NSRect r = [[bbfc folderView] convertRect:[button frame] fromView:button]; |
// TODO(jrg): remove this adjustment. |
- NSRect bigger = NSInsetRect([[bbfc mainView] frame], -2, 0); |
+ NSRect bigger = NSInsetRect([[bbfc folderView] frame], -2, 0); |
EXPECT_TRUE(NSContainsRect(bigger, r)); |
EXPECT_TRUE([[button cell] isKindOfClass:cellClass]); |
} |
@@ -269,13 +250,12 @@ |
EXPECT_TRUE(parentButton); |
// If parent is a BookmarkBarController, grow down. |
- scoped_nsobject<BookmarkBarFolderControllerLow> bbfc; |
- bbfc.reset([[BookmarkBarFolderControllerLow alloc] |
+ scoped_nsobject<BookmarkBarFolderController> bbfc; |
+ bbfc.reset([[BookmarkBarFolderController alloc] |
initWithParentButton:parentButton |
parentController:nil |
barController:bar_]); |
[bbfc window]; |
- [bbfc setRealTopLeft:YES]; |
NSPoint pt = [bbfc windowTopLeftForWidth:0]; // screen coords |
NSPoint buttonOriginInScreen = |
[[parentButton window] |
@@ -293,13 +273,12 @@ |
EXPECT_LT(shifted.x, pt.x); |
// If parent is a BookmarkBarFolderController, grow right. |
- scoped_nsobject<BookmarkBarFolderControllerLow> bbfc2; |
- bbfc2.reset([[BookmarkBarFolderControllerLow alloc] |
+ scoped_nsobject<BookmarkBarFolderController> bbfc2; |
+ bbfc2.reset([[BookmarkBarFolderController alloc] |
initWithParentButton:[[bbfc buttons] objectAtIndex:0] |
parentController:bbfc.get() |
barController:bar_]); |
[bbfc2 window]; |
- [bbfc2 setRealTopLeft:YES]; |
pt = [bbfc2 windowTopLeftForWidth:0]; |
// We're now overlapping the window a bit. |
EXPECT_EQ(pt.x, NSMaxX([[bbfc.get() window] frame]) - |
@@ -376,10 +355,10 @@ |
EXPECT_TRUE(bbfc.get()); |
// Confirm "off the top" and "off the bottom" match no buttons. |
- NSPoint p = NSMakePoint(NSMidX([[bbfc mainView] frame]), 10000); |
+ NSPoint p = NSMakePoint(NSMidX([[bbfc folderView] frame]), 10000); |
EXPECT_FALSE([bbfc buttonForDroppingOnAtPoint:p]); |
EXPECT_TRUE([bbfc shouldShowIndicatorShownForPoint:p]); |
- p = NSMakePoint(NSMidX([[bbfc mainView] frame]), -1); |
+ p = NSMakePoint(NSMidX([[bbfc folderView] frame]), -1); |
EXPECT_FALSE([bbfc buttonForDroppingOnAtPoint:p]); |
EXPECT_TRUE([bbfc shouldShowIndicatorShownForPoint:p]); |
@@ -470,29 +449,51 @@ |
// Simple scrolling tests. |
TEST_F(BookmarkBarFolderControllerTest, SimpleScroll) { |
scoped_nsobject<BookmarkBarFolderController> bbfc; |
- |
+ NSRect screenFrame = [[NSScreen mainScreen] frame]; |
+ CGFloat screenHeight = NSHeight(screenFrame); |
int nodecount = AddLotsOfNodes(); |
bbfc.reset(SimpleBookmarkBarFolderController()); |
EXPECT_TRUE(bbfc.get()); |
[bbfc showWindow:bbfc.get()]; |
+ NSWindow* window = [bbfc window]; |
- // Make sure the window fits on the screen. |
- EXPECT_LT(NSHeight([[bbfc window] frame]), |
- NSHeight([[NSScreen mainScreen] frame])); |
+ // The window should be shorter than the screen but reach exactly to the |
+ // bottom of the screen since it's scrollable. |
+ EXPECT_LT(NSHeight([window frame]), screenHeight); |
+ EXPECT_CGFLOAT_EQ(0.0, [window frame].origin.y); |
- // Verify the logic used by the scroll arrow code. |
+ // Initially, should show scroll-up but not scroll-down. |
EXPECT_TRUE([bbfc canScrollUp]); |
EXPECT_FALSE([bbfc canScrollDown]); |
- // Scroll it up. Make sure the window has gotten bigger each time. |
+ // Scroll up a bit. Make sure the window has gotten bigger each time. |
// Also, for each scroll, make sure our hit test finds a new button |
// (to confirm the content area changed). |
NSView* savedHit = nil; |
- for (int i=0; i<3; i++) { |
- CGFloat height = NSHeight([[bbfc window] frame]); |
+ NSView* scrollView = [bbfc scrollView]; |
+ |
+ // Find the next-to-last button showing at the bottom of the window and |
+ // us its center for hit testing. |
+ BookmarkButton* targetButton = nil; |
+ NSPoint scrollPoint = [[bbfc scrollView] documentVisibleRect].origin; |
+ for (BookmarkButton* button in [bbfc buttons]) { |
+ NSRect buttonFrame = [button frame]; |
+ buttonFrame.origin.y -= scrollPoint.y; |
+ if (buttonFrame.origin.y < 0.0) |
+ break; |
+ targetButton = button; |
+ } |
+ NSPoint hitPoint = [targetButton frame].origin; |
+ hitPoint.x += 50.0; |
+ hitPoint.y += (bookmarks::kBookmarkButtonHeight / 2.0) - scrollPoint.y; |
+ |
+ for (int i = 0; i < 3; i++) { |
+ CGFloat height = NSHeight([window frame]); |
[bbfc performOneScroll:60]; |
- EXPECT_GT(NSHeight([[bbfc window] frame]), height); |
- NSView* hit = [[[bbfc window] contentView] hitTest:NSMakePoint(22, 22)]; |
+ EXPECT_GT(NSHeight([window frame]), height); |
+ NSView* hit = [scrollView hitTest:hitPoint]; |
+ // We should hit a bookmark button. |
+ EXPECT_TRUE([[hit className] isEqualToString:@"BookmarkButton"]); |
EXPECT_NE(hit, savedHit); |
savedHit = hit; |
} |
@@ -500,11 +501,9 @@ |
// Keep scrolling up; make sure we never get bigger than the screen. |
// Also confirm we never scroll the window off the screen. |
bool bothAtOnce = false; |
- NSRect screenFrame = [[NSScreen mainScreen] frame]; |
- for (int i = 0; i < nodecount; i++) { |
+ while ([bbfc canScrollUp]) { |
[bbfc performOneScroll:60]; |
- EXPECT_TRUE(NSContainsRect(screenFrame, |
- [[bbfc window] frame])); |
+ EXPECT_TRUE(NSContainsRect(screenFrame, [window frame])); |
// Make sure, sometime during our scroll, we have the ability to |
// scroll in either direction. |
if ([bbfc canScrollUp] && |
@@ -520,16 +519,23 @@ |
// Now scroll down and make sure the window size does not change. |
// Also confirm we never scroll the window off the screen the other |
// way. |
- for (int i=0; i<nodecount+50; i++) { |
- CGFloat height = NSHeight([[bbfc window] frame]); |
+ for (int i = 0; i < nodecount+50; ++i) { |
[bbfc performOneScroll:-60]; |
- EXPECT_EQ(height, NSHeight([[bbfc window] frame])); |
- EXPECT_TRUE(NSContainsRect(screenFrame, |
- [[bbfc window] frame])); |
+ // Once we can no longer scroll down the window height changes. |
+ if (![bbfc canScrollDown]) |
+ break; |
+ EXPECT_EQ(screenHeight, NSHeight([window frame])); |
+ EXPECT_TRUE(NSContainsRect(screenFrame, [window frame])); |
} |
+ // The final height should be offset from the top of the screen and still |
+ // within the screen. |
+ CGFloat height = screenHeight - bookmarks::kScrollWindowVerticalMargin; |
+ EXPECT_CGFLOAT_EQ(height, NSHeight([window frame])); |
+ EXPECT_TRUE(NSContainsRect(screenFrame, [window frame])); |
} |
-// Folder menu sizing and placementwhile deleting bookmarks and scrolling tests. |
+// Folder menu sizing and placement while deleting bookmarks |
+// and scrolling tests. |
TEST_F(BookmarkBarFolderControllerTest, MenuPlacementWhileScrollingDeleting) { |
scoped_nsobject<BookmarkBarFolderController> bbfc; |
AddLotsOfNodes(); |
@@ -579,7 +585,7 @@ |
button = [buttons objectAtIndex:buttonCounter + 3]; |
[folder deleteBookmark:button]; |
newTop = [menuWindow frame].origin.y + NSHeight([menuWindow frame]); |
- EXPECT_CGFLOAT_EQ(oldTop, newTop); |
+ EXPECT_CGFLOAT_EQ(oldTop - bookmarks::kScrollWindowVerticalMargin, newTop); |
} |
@interface FakedDragInfo : NSObject { |
@@ -656,7 +662,7 @@ |
// Awkwardness to look like we've been installed. |
[parent_view_ addSubview:[bar view]]; |
NSRect frame = [[[bar view] superview] frame]; |
- frame.origin.y = 100; |
+ frame.origin.y = 400; |
[[[bar view] superview] setFrame:frame]; |
// Make sure it's on in a window so viewDidMoveToWindow is called |
@@ -870,9 +876,9 @@ |
NSRect newToSubwindowFrame = [toSubwindow frame]; |
NSRect expectedToSubwindowFrame = oldToSubwindowFrame; |
expectedToSubwindowFrame.origin.y -= |
- bookmarks::kBookmarkBarHeight + bookmarks::kVisualHeightOffset; |
+ (bookmarks::kBookmarkButtonHeight + bookmarks::kVisualHeightOffset); |
expectedToSubwindowFrame.size.height += |
- bookmarks::kBookmarkBarHeight + bookmarks::kVisualHeightOffset; |
+ (bookmarks::kBookmarkButtonHeight + bookmarks::kVisualHeightOffset); |
EXPECT_NSRECT_EQ(expectedToSubwindowFrame, newToSubwindowFrame); |
} |
@@ -1173,69 +1179,73 @@ |
withObject:button]; |
BookmarkBarFolderController* folderController = [bar_ folderController]; |
EXPECT_TRUE(folderController); |
- NSWindow* folderMenu = [folderController window]; |
- EXPECT_TRUE(folderMenu); |
+ NSWindow* folderWindow = [folderController window]; |
+ EXPECT_TRUE(folderWindow); |
CGFloat expectedHeight = (CGFloat)bookmarks::kBookmarkButtonHeight + |
(2*bookmarks::kBookmarkVerticalPadding); |
- NSRect menuFrame = [folderMenu frame]; |
- CGFloat menuHeight = NSHeight(menuFrame); |
- EXPECT_CGFLOAT_EQ(expectedHeight, menuHeight); |
- EXPECT_FALSE([folderController scrollable]); |
+ NSRect windowFrame = [folderWindow frame]; |
+ CGFloat windowHeight = NSHeight(windowFrame); |
+ EXPECT_CGFLOAT_EQ(expectedHeight, windowHeight); |
+ EXPECT_FALSE([folderController canScrollUp]); |
+ EXPECT_FALSE([folderController canScrollDown]); |
// Now add a real bookmark and reopen. |
model.AddURL(folder, folder->GetChildCount(), ASCIIToUTF16("a"), |
GURL("http://a.com/")); |
folderController = [bar_ folderController]; |
EXPECT_TRUE(folderController); |
- folderMenu = [folderController window]; |
- EXPECT_TRUE(folderMenu); |
- menuFrame = [folderMenu frame]; |
- menuHeight = NSHeight(menuFrame); |
+ NSView* folderView = [folderController folderView]; |
+ EXPECT_TRUE(folderView); |
+ NSRect menuFrame = [folderView frame]; |
+ NSView* visibleView = [folderController visibleView]; |
+ NSRect visibleFrame = [visibleView frame]; |
+ NSView* scrollView = [folderController scrollView]; |
+ NSRect scrollFrame = [scrollView frame]; |
+ |
+ // Determine the margins between the scroll frame and the visible frame. |
+ CGFloat widthDelta = NSWidth(visibleFrame) - NSWidth(scrollFrame); |
+ |
+ CGFloat menuHeight = NSHeight(menuFrame); |
EXPECT_CGFLOAT_EQ(expectedHeight, menuHeight); |
- CGFloat menuWidth = NSWidth(menuFrame); |
+ CGFloat scrollerWidth = NSWidth(scrollFrame); |
button = [folderController buttonWithTitleEqualTo:@"a"]; |
CGFloat buttonWidth = NSWidth([button frame]); |
- CGFloat expectedWidth = |
- buttonWidth + (2 * bookmarks::kBookmarkSubMenuHorizontalPadding); |
- EXPECT_CGFLOAT_EQ(expectedWidth, menuWidth); |
+ EXPECT_CGFLOAT_EQ(scrollerWidth, buttonWidth); |
+ CGFloat visibleWidth = NSWidth(visibleFrame); |
+ EXPECT_CGFLOAT_EQ(visibleWidth - widthDelta, buttonWidth); |
+ EXPECT_LT(scrollerWidth, NSWidth([folderView frame])); |
// Add a wider bookmark and make sure the button widths match. |
- model.AddURL(folder, folder->GetChildCount(), |
- ASCIIToUTF16("A really, really long name"), |
+ int reallyWideButtonNumber = folder->GetChildCount(); |
+ model.AddURL(folder, reallyWideButtonNumber, |
+ ASCIIToUTF16("A really, really, really, really, really, " |
+ "really long name"), |
GURL("http://www.google.com/a")); |
- EXPECT_LT(menuWidth, NSWidth([folderMenu frame])); |
- EXPECT_LT(buttonWidth, NSWidth([button frame])); |
- buttonWidth = NSWidth([button frame]); |
- BookmarkButton* buttonB = |
- [folderController buttonWithTitleEqualTo:@"A really, really long name"]; |
- EXPECT_TRUE(buttonB); |
- CGFloat buttonWidthB = NSWidth([buttonB frame]); |
- EXPECT_CGFLOAT_EQ(buttonWidth, buttonWidthB); |
- // Add a bunch of bookmarks until the window grows no more, then check for |
- // a scroll down arrow. |
- CGFloat oldMenuHeight = 0.0; // It just has to be different for first run. |
- menuHeight = NSHeight([folderMenu frame]); |
+ BookmarkButton* bigButton = |
+ [folderController buttonWithTitleEqualTo: |
+ @"A really, really, really, really, really, really long name"]; |
+ EXPECT_TRUE(bigButton); |
+ CGFloat buttonWidthB = NSWidth([bigButton frame]); |
+ EXPECT_LT(buttonWidth, buttonWidthB); |
+ // Add a bunch of bookmarks until the window becomes scrollable, then check |
+ // for a scroll up arrow. |
NSUInteger tripWire = 0; // Prevent a runaway. |
- while (![folderController scrollable] && ++tripWire < 100) { |
+ while (![folderController canScrollUp] && ++tripWire < 1000) { |
model.AddURL(folder, folder->GetChildCount(), ASCIIToUTF16("B"), |
GURL("http://b.com/")); |
- oldMenuHeight = menuHeight; |
- menuHeight = NSHeight([folderMenu frame]); |
} |
- EXPECT_TRUE([folderController scrollable]); |
EXPECT_TRUE([folderController canScrollUp]); |
// Remove one bookmark and make sure the scroll down arrow has been removed. |
// We'll remove the really long node so we can see if the buttons get resized. |
- menuWidth = NSWidth([folderMenu frame]); |
+ scrollerWidth = NSWidth([folderView frame]); |
buttonWidth = NSWidth([button frame]); |
- model.Remove(folder, 1); |
- EXPECT_FALSE([folderController scrollable]); |
+ model.Remove(folder, reallyWideButtonNumber); |
EXPECT_FALSE([folderController canScrollUp]); |
EXPECT_FALSE([folderController canScrollDown]); |
// Check the size. It should have reduced. |
- EXPECT_GT(menuWidth, NSWidth([folderMenu frame])); |
+ EXPECT_GT(scrollerWidth, NSWidth([folderView frame])); |
EXPECT_GT(buttonWidth, NSWidth([button frame])); |
// Check button spacing. |
@@ -1362,7 +1372,7 @@ |
// Verify the model. |
const std::string expectedA("1b 2f:[ O3f:[ O3f1b O3f2f ] 2f1b 2f2f:[ " |
"2f2f1b 2f2f2b 2f2f3b O4f:[ O4f1b O4f2f ] ] " |
- "2f3b ] 3b 4b "); |
+ "2f3b ] 3b 4b "); |
actual = model_test_utils::ModelStringFromNode(root); |
EXPECT_EQ(expectedA, actual); |