| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/ui/views/constrained_window_views.h" | |
| 6 | |
| 7 #include "components/web_modal/test_web_contents_modal_dialog_host.h" | |
| 8 #include "ui/gfx/native_widget_types.h" | |
| 9 #include "ui/gfx/point.h" | |
| 10 #include "ui/gfx/rect.h" | |
| 11 #include "ui/gfx/size.h" | |
| 12 #include "ui/views/border.h" | |
| 13 #include "ui/views/test/views_test_base.h" | |
| 14 #include "ui/views/widget/widget.h" | |
| 15 #include "ui/views/window/dialog_delegate.h" | |
| 16 | |
| 17 namespace views { | |
| 18 | |
| 19 class DialogContents : public DialogDelegateView { | |
| 20 public: | |
| 21 DialogContents() {} | |
| 22 virtual ~DialogContents() {} | |
| 23 | |
| 24 void set_preferred_size(const gfx::Size& preferred_size) { | |
| 25 preferred_size_ = preferred_size; | |
| 26 } | |
| 27 | |
| 28 // Overriden from DialogDelegateView: | |
| 29 virtual View* GetContentsView() override { return this; } | |
| 30 virtual gfx::Size GetPreferredSize() const override { | |
| 31 return preferred_size_; | |
| 32 } | |
| 33 virtual gfx::Size GetMinimumSize() const override { return gfx::Size(); } | |
| 34 | |
| 35 private: | |
| 36 gfx::Size preferred_size_; | |
| 37 | |
| 38 DISALLOW_COPY_AND_ASSIGN(DialogContents); | |
| 39 }; | |
| 40 | |
| 41 class ConstrainedWindowViewsTest : public ViewsTestBase { | |
| 42 public: | |
| 43 ConstrainedWindowViewsTest() : contents_(NULL) {} | |
| 44 virtual ~ConstrainedWindowViewsTest() {} | |
| 45 | |
| 46 virtual void SetUp() override { | |
| 47 ViewsTestBase::SetUp(); | |
| 48 contents_ = new DialogContents; | |
| 49 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); | |
| 50 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | |
| 51 params.delegate = contents_; | |
| 52 dialog_.reset(new Widget); | |
| 53 dialog_->Init(params); | |
| 54 dialog_host_.reset(new web_modal::TestWebContentsModalDialogHost( | |
| 55 dialog_->GetNativeView())); | |
| 56 dialog_host_->set_max_dialog_size(gfx::Size(5000, 5000)); | |
| 57 | |
| 58 // Make sure the dialog size is dominated by the preferred size of the | |
| 59 // contents. | |
| 60 gfx::Size preferred_size = dialog()->GetRootView()->GetPreferredSize(); | |
| 61 preferred_size.Enlarge(500, 500); | |
| 62 contents()->set_preferred_size(preferred_size); | |
| 63 } | |
| 64 | |
| 65 virtual void TearDown() override { | |
| 66 ViewsTestBase::TearDown(); | |
| 67 contents_ = NULL; | |
| 68 dialog_host_.reset(); | |
| 69 dialog_.reset(); | |
| 70 } | |
| 71 | |
| 72 gfx::Size GetDialogSize() { | |
| 73 return dialog()->GetRootView()->GetBoundsInScreen().size(); | |
| 74 } | |
| 75 | |
| 76 DialogContents* contents() { return contents_; } | |
| 77 web_modal::TestWebContentsModalDialogHost* dialog_host() { | |
| 78 return dialog_host_.get(); | |
| 79 } | |
| 80 Widget* dialog() { return dialog_.get(); } | |
| 81 | |
| 82 private: | |
| 83 DialogContents* contents_; | |
| 84 scoped_ptr<web_modal::TestWebContentsModalDialogHost> dialog_host_; | |
| 85 scoped_ptr<Widget> dialog_; | |
| 86 | |
| 87 DISALLOW_COPY_AND_ASSIGN(ConstrainedWindowViewsTest); | |
| 88 }; | |
| 89 | |
| 90 // Make sure a dialog that increases its preferred size grows on the next | |
| 91 // position update. | |
| 92 TEST_F(ConstrainedWindowViewsTest, GrowModalDialogSize) { | |
| 93 UpdateBrowserModalDialogPosition(dialog(), dialog_host()); | |
| 94 gfx::Size expected_size = GetDialogSize(); | |
| 95 gfx::Size preferred_size = contents()->GetPreferredSize(); | |
| 96 expected_size.Enlarge(50, 50); | |
| 97 preferred_size.Enlarge(50, 50); | |
| 98 contents()->set_preferred_size(preferred_size); | |
| 99 UpdateBrowserModalDialogPosition(dialog(), dialog_host()); | |
| 100 EXPECT_EQ(expected_size.ToString(), GetDialogSize().ToString()); | |
| 101 } | |
| 102 | |
| 103 // Make sure a dialog that reduces its preferred size shrinks on the next | |
| 104 // position update. | |
| 105 TEST_F(ConstrainedWindowViewsTest, ShrinkModalDialogSize) { | |
| 106 UpdateBrowserModalDialogPosition(dialog(), dialog_host()); | |
| 107 gfx::Size expected_size = GetDialogSize(); | |
| 108 gfx::Size preferred_size = contents()->GetPreferredSize(); | |
| 109 expected_size.Enlarge(-50, -50); | |
| 110 preferred_size.Enlarge(-50, -50); | |
| 111 contents()->set_preferred_size(preferred_size); | |
| 112 UpdateBrowserModalDialogPosition(dialog(), dialog_host()); | |
| 113 EXPECT_EQ(expected_size.ToString(), GetDialogSize().ToString()); | |
| 114 } | |
| 115 | |
| 116 // Make sure browser modal dialogs are not affected by restrictions on web | |
| 117 // content modal dialog maximum sizes. | |
| 118 TEST_F(ConstrainedWindowViewsTest, MaximumBrowserDialogSize) { | |
| 119 UpdateBrowserModalDialogPosition(dialog(), dialog_host()); | |
| 120 gfx::Size dialog_size = GetDialogSize(); | |
| 121 gfx::Size max_dialog_size = dialog_size; | |
| 122 max_dialog_size.Enlarge(-50, -50); | |
| 123 dialog_host()->set_max_dialog_size(max_dialog_size); | |
| 124 UpdateBrowserModalDialogPosition(dialog(), dialog_host()); | |
| 125 EXPECT_EQ(dialog_size.ToString(), GetDialogSize().ToString()); | |
| 126 } | |
| 127 | |
| 128 // Web content modal dialogs should not get a size larger than what the dialog | |
| 129 // host gives as the maximum size. | |
| 130 TEST_F(ConstrainedWindowViewsTest, MaximumWebContentsDialogSize) { | |
| 131 UpdateWebContentsModalDialogPosition(dialog(), dialog_host()); | |
| 132 gfx::Size full_dialog_size = GetDialogSize(); | |
| 133 gfx::Size max_dialog_size = full_dialog_size; | |
| 134 max_dialog_size.Enlarge(-50, -50); | |
| 135 dialog_host()->set_max_dialog_size(max_dialog_size); | |
| 136 UpdateWebContentsModalDialogPosition(dialog(), dialog_host()); | |
| 137 // The top border of the dialog is intentionally drawn outside the area | |
| 138 // specified by the dialog host, so add it to the size the dialog is expected | |
| 139 // to occupy. | |
| 140 gfx::Size expected_size = max_dialog_size; | |
| 141 Border* border = dialog()->non_client_view()->frame_view()->border(); | |
| 142 if (border) | |
| 143 expected_size.Enlarge(0, border->GetInsets().top()); | |
| 144 EXPECT_EQ(expected_size.ToString(), GetDialogSize().ToString()); | |
| 145 | |
| 146 // Increasing the maximum dialog size should bring the dialog back to its | |
| 147 // original size. | |
| 148 max_dialog_size.Enlarge(100, 100); | |
| 149 dialog_host()->set_max_dialog_size(max_dialog_size); | |
| 150 UpdateWebContentsModalDialogPosition(dialog(), dialog_host()); | |
| 151 EXPECT_EQ(full_dialog_size.ToString(), GetDialogSize().ToString()); | |
| 152 } | |
| 153 | |
| 154 } // namespace views | |
| OLD | NEW |