Index: chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm |
=================================================================== |
--- chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm (revision 75353) |
+++ chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm (working copy) |
@@ -458,7 +458,8 @@ |
// coordinates). The top left is positioned in a manner similar to |
// cascading menus. Windows may grow to either the right or left of |
// their parent (if a sub-folder) so we need to know |windowWidth|. |
-- (NSPoint)windowTopLeftForWidth:(int)windowWidth { |
+- (NSPoint)windowTopLeftForWidth:(int)windowWidth height:(int)windowHeight { |
+ CGFloat kMinSqueezedMenuHeight = bookmarks::kBookmarkFolderButtonHeight * 2.0; |
NSPoint newWindowTopLeft; |
if (![parentController_ isKindOfClass:[self class]]) { |
// If we're not popping up from one of ourselves, we must be |
@@ -485,6 +486,18 @@ |
newWindowTopLeft.x = std::max(newWindowTopLeft.x - spillOff, |
NSMinX(screenFrame)); |
} |
+ // The menu looks bad when it is squeezed up against the bottom of the |
+ // screen and ends up being only a few pixels tall. If it meets the |
+ // threshold for this case, instead show the menu above the button. |
+ NSRect visFrame = [[[parentButton_ window] screen] visibleFrame]; |
+ CGFloat availableVerticalSpace = newWindowTopLeft.y - |
+ (NSMinY(visFrame) + bookmarks::kScrollWindowVerticalMargin); |
+ if ((availableVerticalSpace < kMinSqueezedMenuHeight) && |
+ (windowHeight > availableVerticalSpace)) { |
+ newWindowTopLeft.y = std::min( |
+ newWindowTopLeft.y + windowHeight + NSHeight([parentButton_ frame]), |
+ NSMaxY(visFrame)); |
+ } |
} else { |
// Parent is a folder: expose as much as we can vertically; grow right/left. |
newWindowTopLeft.x = [self childFolderWindowLeftForWidth:windowWidth]; |
@@ -702,7 +715,8 @@ |
folderFrame.size.height += deltaMenuHeight; |
[folderView_ setFrameSize:folderFrame.size]; |
CGFloat windowWidth = [self adjustButtonWidths] + padding_; |
- NSPoint newWindowTopLeft = [self windowTopLeftForWidth:windowWidth]; |
+ NSPoint newWindowTopLeft = [self windowTopLeftForWidth:windowWidth |
+ height:deltaMenuHeight]; |
CGFloat left = newWindowTopLeft.x; |
NSSize newSize = NSMakeSize(windowWidth, deltaMenuHeight); |
[self adjustWindowLeft:left size:newSize scrollingBy:0.0]; |
@@ -762,7 +776,8 @@ |
// base the window width on this ideal button width. |
CGFloat buttonWidth = [self adjustButtonWidths]; |
CGFloat windowWidth = buttonWidth + padding_; |
- NSPoint newWindowTopLeft = [self windowTopLeftForWidth:windowWidth]; |
+ NSPoint newWindowTopLeft = [self windowTopLeftForWidth:windowWidth |
+ height:height]; |
// Make sure as much of a submenu is exposed (which otherwise would be a |
// problem if the parent button is close to the bottom of the screen). |
if ([parentController_ isKindOfClass:[self class]]) { |