summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorrfevang@chromium.org <rfevang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-06 05:08:43 +0000
committerrfevang@chromium.org <rfevang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-06 05:08:43 +0000
commit0026387d76bcab8405a73038c5734b05f0f786fe (patch)
tree88d8c1ac8280954b7e253c1c3663e4548054920f /chrome/browser
parent4e7cca2801c90284b97d4809e3861798f178dcf4 (diff)
downloadchromium_src-0026387d76bcab8405a73038c5734b05f0f786fe.zip
chromium_src-0026387d76bcab8405a73038c5734b05f0f786fe.tar.gz
chromium_src-0026387d76bcab8405a73038c5734b05f0f786fe.tar.bz2
Limit constrained windows to the size of the parent view.
Constrained windows would get drawn partially outside the browser window, obscuring some of the contents. This CL limits their size so everything is in view. This mimics the behavior of the old style dialogs. This CL also changes the size request to use the current preferred size of the view, instead of reusing the existing size. Some dialogs (like the print preview) changes their size preferences when the browser window size changes, so the old size might not be optimal any more. Additionally, added a GetMinimumSize to the bubble frame view, as previously GetPreferredSize would get used, effectively undoing the additional restrictions placed based on Window sizes. BUG=272760,274236,276150 Review URL: https://chromiumcodereview.appspot.com/22903022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221573 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/chromeos/login/webui_login_view.cc4
-rw-r--r--chrome/browser/chromeos/login/webui_login_view.h1
-rw-r--r--chrome/browser/extensions/extension_host.cc6
-rw-r--r--chrome/browser/extensions/extension_host.h1
-rw-r--r--chrome/browser/printing/print_preview_test.cc4
-rw-r--r--chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h1
-rw-r--r--chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm5
-rw-r--r--chrome/browser/ui/gtk/apps/native_app_window_gtk.cc7
-rw-r--r--chrome/browser/ui/gtk/apps/native_app_window_gtk.h1
-rw-r--r--chrome/browser/ui/views/apps/native_app_window_views.cc4
-rw-r--r--chrome/browser/ui/views/apps/native_app_window_views.h1
-rw-r--r--chrome/browser/ui/views/constrained_window_views.cc12
-rw-r--r--chrome/browser/ui/views/constrained_window_views_unittest.cc134
-rw-r--r--chrome/browser/ui/views/frame/browser_view_layout.cc14
14 files changed, 193 insertions, 2 deletions
diff --git a/chrome/browser/chromeos/login/webui_login_view.cc b/chrome/browser/chromeos/login/webui_login_view.cc
index 28fcd18..bbe4795 100644
--- a/chrome/browser/chromeos/login/webui_login_view.cc
+++ b/chrome/browser/chromeos/login/webui_login_view.cc
@@ -230,6 +230,10 @@ gfx::Point WebUILoginView::GetDialogPosition(const gfx::Size& size) {
widget_size.height() / 2 - size.height() / 2);
}
+gfx::Size WebUILoginView::GetMaximumDialogSize() {
+ return GetWidget()->GetWindowBoundsInScreen().size();
+}
+
void WebUILoginView::AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) {
if (observer && !observer_list_.HasObserver(observer))
diff --git a/chrome/browser/chromeos/login/webui_login_view.h b/chrome/browser/chromeos/login/webui_login_view.h
index f159842..534aa36 100644
--- a/chrome/browser/chromeos/login/webui_login_view.h
+++ b/chrome/browser/chromeos/login/webui_login_view.h
@@ -63,6 +63,7 @@ class WebUILoginView : public views::View,
// Overridden from web_modal::WebContentsModalDialogHost:
virtual gfx::NativeView GetHostView() const OVERRIDE;
virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE;
+ virtual gfx::Size GetMaximumDialogSize() OVERRIDE;
virtual void AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE;
virtual void RemoveObserver(
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index bd43928..286be86 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -311,6 +311,12 @@ gfx::Point ExtensionHost::GetDialogPosition(const gfx::Size& size) {
std::max(0, (bounds.height() - size.height()) / 2));
}
+gfx::Size ExtensionHost::GetMaximumDialogSize() {
+ if (!GetVisibleWebContents())
+ return gfx::Size();
+ return GetVisibleWebContents()->GetView()->GetViewBounds().size();
+}
+
void ExtensionHost::AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) {
}
diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h
index 43f44f0..9c48fd94 100644
--- a/chrome/browser/extensions/extension_host.h
+++ b/chrome/browser/extensions/extension_host.h
@@ -208,6 +208,7 @@ class ExtensionHost : public content::WebContentsDelegate,
// web_modal::WebContentsModalDialogHost
virtual gfx::NativeView GetHostView() const OVERRIDE;
virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE;
+ virtual gfx::Size GetMaximumDialogSize() OVERRIDE;
virtual void AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE;
virtual void RemoveObserver(
diff --git a/chrome/browser/printing/print_preview_test.cc b/chrome/browser/printing/print_preview_test.cc
index c4223a7..b6d0f23 100644
--- a/chrome/browser/printing/print_preview_test.cc
+++ b/chrome/browser/printing/print_preview_test.cc
@@ -46,6 +46,10 @@ class PrintPreviewTestBrowserWindow
return gfx::Point();
}
+ virtual gfx::Size GetMaximumDialogSize() OVERRIDE {
+ return gfx::Size();
+ }
+
virtual void AddObserver(
WebContentsModalDialogHostObserver* observer) OVERRIDE {}
virtual void RemoveObserver(
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h
index 9a2eaf3..22bbbc0 100644
--- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h
+++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h
@@ -129,6 +129,7 @@ class NativeAppWindowCocoa : public apps::NativeAppWindow {
// WebContentsModalDialogHost implementation.
virtual gfx::NativeView GetHostView() const OVERRIDE;
virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE;
+ virtual gfx::Size GetMaximumDialogSize() OVERRIDE;
virtual void AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE;
virtual void RemoveObserver(
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
index a3281d8..4b0764b 100644
--- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
+++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
@@ -794,6 +794,11 @@ gfx::Point NativeAppWindowCocoa::GetDialogPosition(const gfx::Size& size) {
return gfx::Point();
}
+gfx::Size NativeAppWindowCocoa::GetMaximumDialogSize() {
+ NOTIMPLEMENTED();
+ return gfx::Size();
+}
+
void NativeAppWindowCocoa::AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) {
NOTIMPLEMENTED();
diff --git a/chrome/browser/ui/gtk/apps/native_app_window_gtk.cc b/chrome/browser/ui/gtk/apps/native_app_window_gtk.cc
index d2c5925..12a3d5d 100644
--- a/chrome/browser/ui/gtk/apps/native_app_window_gtk.cc
+++ b/chrome/browser/ui/gtk/apps/native_app_window_gtk.cc
@@ -384,6 +384,13 @@ gfx::Point NativeAppWindowGtk::GetDialogPosition(const gfx::Size& size) {
current_height / 2 - size.height() / 2);
}
+gfx::Size NativeAppWindowGtk::GetMaximumDialogSize() {
+ gint current_width = 0;
+ gint current_height = 0;
+ gtk_window_get_size(window_, &current_width, &current_height);
+ return gfx::Size(current_width, current_height);
+}
+
void NativeAppWindowGtk::AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) {
observer_list_.AddObserver(observer);
diff --git a/chrome/browser/ui/gtk/apps/native_app_window_gtk.h b/chrome/browser/ui/gtk/apps/native_app_window_gtk.h
index a665438..be113a9 100644
--- a/chrome/browser/ui/gtk/apps/native_app_window_gtk.h
+++ b/chrome/browser/ui/gtk/apps/native_app_window_gtk.h
@@ -77,6 +77,7 @@ class NativeAppWindowGtk : public apps::NativeAppWindow,
// web_modal::WebContentsModalDialogHost implementation.
virtual gfx::NativeView GetHostView() const OVERRIDE;
virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE;
+ virtual gfx::Size GetMaximumDialogSize() OVERRIDE;
virtual void AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE;
virtual void RemoveObserver(
diff --git a/chrome/browser/ui/views/apps/native_app_window_views.cc b/chrome/browser/ui/views/apps/native_app_window_views.cc
index a98d7a4..a253148 100644
--- a/chrome/browser/ui/views/apps/native_app_window_views.cc
+++ b/chrome/browser/ui/views/apps/native_app_window_views.cc
@@ -449,6 +449,10 @@ gfx::Point NativeAppWindowViews::GetDialogPosition(const gfx::Size& size) {
shell_window_size.height() / 2 - size.height() / 2);
}
+gfx::Size NativeAppWindowViews::GetMaximumDialogSize() {
+ return window_->GetWindowBoundsInScreen().size();
+}
+
void NativeAppWindowViews::AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) {
observer_list_.AddObserver(observer);
diff --git a/chrome/browser/ui/views/apps/native_app_window_views.h b/chrome/browser/ui/views/apps/native_app_window_views.h
index e7b790f..9f4d969 100644
--- a/chrome/browser/ui/views/apps/native_app_window_views.h
+++ b/chrome/browser/ui/views/apps/native_app_window_views.h
@@ -148,6 +148,7 @@ class NativeAppWindowViews : public apps::NativeAppWindow,
// web_modal::WebContentsModalDialogHost implementation.
virtual gfx::NativeView GetHostView() const OVERRIDE;
virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE;
+ virtual gfx::Size GetMaximumDialogSize() OVERRIDE;
virtual void AddObserver(
web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE;
virtual void RemoveObserver(
diff --git a/chrome/browser/ui/views/constrained_window_views.cc b/chrome/browser/ui/views/constrained_window_views.cc
index 07ba004..3d2b47ae 100644
--- a/chrome/browser/ui/views/constrained_window_views.cc
+++ b/chrome/browser/ui/views/constrained_window_views.cc
@@ -570,11 +570,19 @@ void ConstrainedWindowFrameView::InitClass() {
void UpdateWebContentsModalDialogPosition(
views::Widget* widget,
web_modal::WebContentsModalDialogHost* dialog_host) {
- gfx::Size size = widget->GetWindowBoundsInScreen().size();
- gfx::Point position = dialog_host->GetDialogPosition(size);
+ gfx::Size size = widget->GetRootView()->GetPreferredSize();
views::Border* border =
widget->non_client_view()->frame_view()->border();
+ gfx::Size max_size = dialog_host->GetMaximumDialogSize();
+ // Enlarge the max size by the top border, as the dialog will be shifted
+ // outside the area specified by the dialog host by this amount later in the
+ // function.
// Border may be null during widget initialization.
+ if (border)
+ max_size.Enlarge(0, border->GetInsets().top());
+ size.SetToMin(max_size);
+
+ gfx::Point position = dialog_host->GetDialogPosition(size);
if (border) {
// Align the first row of pixels inside the border. This is the apparent
// top of the dialog.
diff --git a/chrome/browser/ui/views/constrained_window_views_unittest.cc b/chrome/browser/ui/views/constrained_window_views_unittest.cc
new file mode 100644
index 0000000..e11e2b3
--- /dev/null
+++ b/chrome/browser/ui/views/constrained_window_views_unittest.cc
@@ -0,0 +1,134 @@
+// Copyright 2013 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.
+
+#include "chrome/browser/ui/views/constrained_window_views.h"
+
+#include "components/web_modal/web_contents_modal_dialog_host.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/gfx/point.h"
+#include "ui/gfx/rect.h"
+#include "ui/gfx/size.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/window/dialog_delegate.h"
+
+namespace web_modal {
+class WebContentsModalDialogHostObserver;
+}
+
+namespace views {
+
+class DialogContents : public DialogDelegateView {
+ public:
+ DialogContents() {}
+ virtual ~DialogContents() {}
+
+ void set_preferred_size(const gfx::Size& preferred_size) {
+ preferred_size_ = preferred_size;
+ }
+
+ // Overriden from DialogDelegateView:
+ virtual View* GetContentsView() OVERRIDE { return this; }
+ virtual gfx::Size GetPreferredSize() OVERRIDE { return preferred_size_; }
+ virtual gfx::Size GetMinimumSize() OVERRIDE { return gfx::Size(); }
+
+ private:
+ gfx::Size preferred_size_;
+
+ DISALLOW_COPY_AND_ASSIGN(DialogContents);
+};
+
+class DialogHost : public web_modal::WebContentsModalDialogHost {
+ public:
+ explicit DialogHost(gfx::NativeView host_view)
+ : host_view_(host_view),
+ max_dialog_size_(5000, 5000) {
+ }
+
+ virtual ~DialogHost() {}
+
+ void set_max_dialog_size(const gfx::Size& max_dialog_size) {
+ max_dialog_size_ = max_dialog_size;
+ }
+
+ // Overridden from WebContentsModalDialogHost:
+ virtual gfx::NativeView GetHostView() const OVERRIDE { return host_view_; }
+ virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE {
+ return gfx::Point();
+ }
+ virtual gfx::Size GetMaximumDialogSize() OVERRIDE { return max_dialog_size_; }
+ virtual void AddObserver(
+ web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE {};
+ virtual void RemoveObserver(
+ web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE {};
+
+ private:
+ gfx::NativeView host_view_;
+ gfx::Size max_dialog_size_;
+
+ DISALLOW_COPY_AND_ASSIGN(DialogHost);
+};
+
+typedef ViewsTestBase ConstrainedWindowViewsTest;
+
+TEST_F(ConstrainedWindowViewsTest, UpdateDialogPosition) {
+ Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ Widget parent;
+ parent.Init(params);
+
+ DialogContents* contents = new DialogContents;
+ Widget* dialog =
+ CreateBrowserModalDialogViews(contents, parent.GetNativeWindow());
+ DialogHost dialog_host(parent.GetNativeView());
+ UpdateWebContentsModalDialogPosition(dialog, &dialog_host);
+
+ // Set the preferred size to something larger than the size of a dialog with
+ // no content.
+ gfx::Size preferred_size = dialog->GetClientAreaBoundsInScreen().size();
+ preferred_size.Enlarge(50, 50);
+ contents->set_preferred_size(preferred_size);
+ UpdateWebContentsModalDialogPosition(dialog, &dialog_host);
+
+ // Now increase the preferred content area and make sure the dialog grows by
+ // the same amount after the position is updated.
+ gfx::Size expected_size = dialog->GetClientAreaBoundsInScreen().size();
+ expected_size.Enlarge(200, 200);
+ preferred_size.Enlarge(200, 200);
+ contents->set_preferred_size(preferred_size);
+ UpdateWebContentsModalDialogPosition(dialog, &dialog_host);
+ EXPECT_EQ(expected_size, dialog->GetClientAreaBoundsInScreen().size());
+
+ // Make sure the dialog shrinks when the preferred content area shrinks.
+ expected_size.Enlarge(-200, -200);
+ preferred_size.Enlarge(-200, -200);
+ contents->set_preferred_size(preferred_size);
+ UpdateWebContentsModalDialogPosition(dialog, &dialog_host);
+ EXPECT_EQ(expected_size, dialog->GetClientAreaBoundsInScreen().size());
+
+ // Make sure the dialog is never larger than the max dialog size the dialog
+ // host can handle.
+ gfx::Size full_dialog_size = dialog->GetClientAreaBoundsInScreen().size();
+ gfx::Size max_dialog_size = full_dialog_size;
+ max_dialog_size.Enlarge(-100, -100);
+ dialog_host.set_max_dialog_size(max_dialog_size);
+ UpdateWebContentsModalDialogPosition(dialog, &dialog_host);
+ // The top border of the dialog is intentionally drawn outside the area
+ // specified by the dialog host, so add it to the size the dialog is expected
+ // to occupy.
+ expected_size = max_dialog_size;
+ Border* border = dialog->non_client_view()->frame_view()->border();
+ if (border)
+ expected_size.Enlarge(0, border->GetInsets().top());
+ EXPECT_EQ(expected_size,
+ dialog->non_client_view()->GetBoundsInScreen().size());
+
+ // Enlarge the max area again and make sure the dialog again uses its
+ // preferred size.
+ dialog_host.set_max_dialog_size(gfx::Size(5000, 5000));
+ UpdateWebContentsModalDialogPosition(dialog, &dialog_host);
+ EXPECT_EQ(full_dialog_size, dialog->GetClientAreaBoundsInScreen().size());
+}
+
+} // namespace views
diff --git a/chrome/browser/ui/views/frame/browser_view_layout.cc b/chrome/browser/ui/views/frame/browser_view_layout.cc
index 70e63c9..63e1847 100644
--- a/chrome/browser/ui/views/frame/browser_view_layout.cc
+++ b/chrome/browser/ui/views/frame/browser_view_layout.cc
@@ -99,6 +99,20 @@ class BrowserViewLayout::WebContentsModalDialogHostViews
return gfx::Point(middle_x - size.width() / 2, top_y);
}
+ virtual gfx::Size GetMaximumDialogSize() OVERRIDE {
+ gfx::Rect content_area =
+ browser_view_layout_->contents_container_->ConvertRectToWidget(
+ browser_view_layout_->contents_container_->GetLocalBounds());
+
+ gfx::Size max_dialog_size = content_area.size();
+ // Adjust for difference in alignment between the dialog top and the top of
+ // the content area.
+ int height_offset = content_area.y() -
+ browser_view_layout_->web_contents_modal_dialog_top_y_;
+ max_dialog_size.Enlarge(0, height_offset);
+ return max_dialog_size;
+ }
+
// Add/remove observer.
virtual void AddObserver(
WebContentsModalDialogHostObserver* observer) OVERRIDE {