summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshrike <shrike@chromium.org>2015-04-15 10:42:55 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-15 17:43:25 +0000
commit3d0f62159e9655f42bbdb80dae29f0e2d40db0c9 (patch)
tree4225bc306a240f3ab996602f4e6218da2d87f444
parenta460cbb69ccd575bb70ec36874a13f802fabe429 (diff)
downloadchromium_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.mm13
-rw-r--r--chrome/browser/ui/cocoa/browser_window_controller_unittest.mm42
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];