diff options
author | shrike <shrike@chromium.org> | 2015-04-15 10:42:55 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-15 17:43:25 +0000 |
commit | 3d0f62159e9655f42bbdb80dae29f0e2d40db0c9 (patch) | |
tree | 4225bc306a240f3ab996602f4e6218da2d87f444 | |
parent | a460cbb69ccd575bb70ec36874a13f802fabe429 (diff) | |
download | chromium_src-3d0f62159e9655f42bbdb80dae29f0e2d40db0c9.zip chromium_src-3d0f62159e9655f42bbdb80dae29f0e2d40db0c9.tar.gz chromium_src-3d0f62159e9655f42bbdb80dae29f0e2d40db0c9.tar.bz2 |
Prevent bookmarks bar toggling from decreasing window height to 0.
Toggling the bookmarks bar changes the height of the browser window
when viewing a regular web page but does not change its height when
viewing a NTP. As a result, it is possible for the browser window to
creep taller or shorter with the right sequence of steps. When the
browser window gets shorter, it's possible to decrease its height to
0.
This change does not address the difference in behavior between NTPs
and regular web pages with the bookmarks bar, but it prevents the
browser window from programmatically dropping below its min height.
Added a unit test, and also had to adjust a unit test that created browser
windows with a height < 200 (min height for a browser window is 272).
BUG=230400
TEST=Create a browser window, confirm that View -> Always Show Bookmarks
Bar is checked, navigate to www.google.com, resize the window to its
minimum height, choose View -> Always Show Bookmarks Bar - the browser
window's bookmarks bar should disappear, but the browser window's height
should not change.
Review URL: https://codereview.chromium.org/1052123006
Cr-Commit-Position: refs/heads/master@{#325267}
-rw-r--r-- | chrome/browser/ui/cocoa/browser_window_controller.mm | 13 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/browser_window_controller_unittest.mm | 42 |
2 files changed, 45 insertions, 10 deletions
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.mm b/chrome/browser/ui/cocoa/browser_window_controller.mm index f349fbb..0dc17f1 100644 --- a/chrome/browser/ui/cocoa/browser_window_controller.mm +++ b/chrome/browser/ui/cocoa/browser_window_controller.mm @@ -838,6 +838,19 @@ using content::WebContents; NSRect windowFrame = [window frame]; NSRect workarea = [[window screen] visibleFrame]; + // Prevent the window from growing smaller than its minimum height: + // http://crbug.com/230400 . + if (deltaH < 0) { + CGFloat minWindowHeight = [window minSize].height; + if (windowFrame.size.height + deltaH < minWindowHeight) { + // |deltaH| + |windowFrame.size.height| = |minWindowHeight|. + deltaH = minWindowHeight - windowFrame.size.height; + } + if (deltaH == 0) { + return NO; + } + } + // If the window is not already fully in the workarea, do not adjust its frame // at all. if (!NSContainsRect(workarea, windowFrame)) diff --git a/chrome/browser/ui/cocoa/browser_window_controller_unittest.mm b/chrome/browser/ui/cocoa/browser_window_controller_unittest.mm index e1a1cbf..891483f 100644 --- a/chrome/browser/ui/cocoa/browser_window_controller_unittest.mm +++ b/chrome/browser/ui/cocoa/browser_window_controller_unittest.mm @@ -1,4 +1,4 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -124,7 +124,7 @@ TEST_F(BrowserWindowControllerTest, TestNormal) { Browser* popup_browser(new Browser( Browser::CreateParams(Browser::TYPE_POPUP, profile(), chrome::GetActiveDesktop()))); - NSWindow *cocoaWindow = popup_browser->window()->GetNativeWindow(); + NSWindow* cocoaWindow = popup_browser->window()->GetNativeWindow(); BrowserWindowController* controller = static_cast<BrowserWindowController*>([cocoaWindow windowController]); ASSERT_TRUE([controller isKindOfClass:[BrowserWindowController class]]); @@ -141,7 +141,7 @@ TEST_F(BrowserWindowControllerTest, TestSetBounds) { chrome::GetActiveDesktop()); params.initial_bounds = gfx::Rect(0, 0, 50, 50); Browser* browser = new Browser(params); - NSWindow *cocoaWindow = browser->window()->GetNativeWindow(); + NSWindow* cocoaWindow = browser->window()->GetNativeWindow(); BrowserWindowController* controller = static_cast<BrowserWindowController*>([cocoaWindow windowController]); @@ -167,7 +167,7 @@ TEST_F(BrowserWindowControllerTest, TestSetBoundsPopup) { chrome::GetActiveDesktop()); params.initial_bounds = gfx::Rect(0, 0, 50, 50); Browser* browser = new Browser(params); - NSWindow *cocoaWindow = browser->window()->GetNativeWindow(); + NSWindow* cocoaWindow = browser->window()->GetNativeWindow(); BrowserWindowController* controller = static_cast<BrowserWindowController*>([cocoaWindow windowController]); @@ -203,6 +203,28 @@ TEST_F(BrowserWindowControllerTest, BookmarkBarControllerIndirection) { EXPECT_TRUE([controller_ isBookmarkBarVisible]); } +TEST_F(BrowserWindowControllerTest, BookmarkBarToggleRespectMinWindowHeight) { + Browser::CreateParams params(Browser::TYPE_TABBED, profile(), + chrome::GetActiveDesktop()); + params.initial_bounds = gfx::Rect(0, 0, 50, 280); + Browser* browser = new Browser(params); + NSWindow* cocoaWindow = browser->window()->GetNativeWindow(); + BrowserWindowController* controller = + static_cast<BrowserWindowController*>([cocoaWindow windowController]); + BrowserWindow* browser_window = [controller browserWindow]; + gfx::Rect bounds = browser_window->GetBounds(); + EXPECT_EQ(280, bounds.height()); + + // Try to set the bounds smaller than the minimum. + // Explicitly show the bar. Can't use chrome::ToggleBookmarkBarWhenVisible() + // because of the notification issues. + [controller adjustWindowHeightBy:-20]; + bounds = browser_window->GetBounds(); + EXPECT_EQ(272, bounds.height()); + + [controller close]; +} + #if 0 // TODO(jrg): This crashes trying to create the BookmarkBarController, adding // an observer to the BookmarkModel. @@ -311,7 +333,7 @@ TEST_F(BrowserWindowControllerTest, TestAdjustWindowHeight) { // height. It should change appropriately (and only downwards). Then get it to // shrink by the same amount; it should return to its original state. NSRect initialFrame = NSMakeRect(workarea.origin.x, workarea.origin.y + 100, - 200, 200); + 200, 280); [window setFrame:initialFrame display:YES]; [controller_ resetWindowGrowthState]; [controller_ adjustWindowHeightBy:40]; @@ -328,7 +350,7 @@ TEST_F(BrowserWindowControllerTest, TestAdjustWindowHeight) { // should still change, but it should not grow down below the work area; it // should instead move upwards. Then shrink it and make sure it goes back to // the way it was. - initialFrame = NSMakeRect(workarea.origin.x, workarea.origin.y, 200, 200); + initialFrame = NSMakeRect(workarea.origin.x, workarea.origin.y, 200, 280); [window setFrame:initialFrame display:YES]; [controller_ resetWindowGrowthState]; [controller_ adjustWindowHeightBy:40]; @@ -343,7 +365,7 @@ TEST_F(BrowserWindowControllerTest, TestAdjustWindowHeight) { // Put the window slightly offscreen and try again. The height should not // change this time. - initialFrame = NSMakeRect(workarea.origin.x - 10, 0, 200, 200); + initialFrame = NSMakeRect(workarea.origin.x - 10, 0, 200, 280); [window setFrame:initialFrame display:YES]; [controller_ resetWindowGrowthState]; [controller_ adjustWindowHeightBy:40]; @@ -365,7 +387,7 @@ TEST_F(BrowserWindowControllerTest, TestAdjustWindowHeight) { // then continue to grow up. Then shrink it, and it should return to where it // was. initialFrame = NSMakeRect(workarea.origin.x, workarea.origin.y + 5, - 200, 200); + 200, 280); [window setFrame:initialFrame display:YES]; [controller_ resetWindowGrowthState]; [controller_ adjustWindowHeightBy:40]; @@ -394,7 +416,7 @@ TEST_F(BrowserWindowControllerTest, TestAdjustWindowHeight) { // Place the window at the bottom of the screen and grow; it should grow // upwards. Move the window off the bottom, then shrink. It should then shrink // from the bottom. - initialFrame = NSMakeRect(workarea.origin.x, workarea.origin.y, 200, 200); + initialFrame = NSMakeRect(workarea.origin.x, workarea.origin.y, 200, 280); [window setFrame:initialFrame display:YES]; [controller_ resetWindowGrowthState]; [controller_ adjustWindowHeightBy:40]; @@ -708,7 +730,7 @@ class BrowserWindowFullScreenControllerTest : public CocoaProfileTest { // Check if the window is front most or if one of its child windows (such // as a status bubble) is front most. -static bool IsFrontWindow(NSWindow *window) { +static bool IsFrontWindow(NSWindow* window) { NSWindow* frontmostWindow = [[NSApp orderedWindows] objectAtIndex:0]; return [frontmostWindow isEqual:window] || [[frontmostWindow parentWindow] isEqual:window]; |