158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/views/constrained_window_views.h" 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 78bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/web_modal/test_web_contents_modal_dialog_host.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/native_widget_types.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/point.h" 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/rect.h" 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/size.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/border.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/test/views_test_base.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/widget/widget.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/window/dialog_delegate.h" 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace views { 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class DialogContents : public DialogDelegateView { 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DialogContents() {} 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~DialogContents() {} 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void set_preferred_size(const gfx::Size& preferred_size) { 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) preferred_size_ = preferred_size; 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Overriden from DialogDelegateView: 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual View* GetContentsView() OVERRIDE { return this; } 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE { 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return preferred_size_; 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetMinimumSize() const OVERRIDE { return gfx::Size(); } 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Size preferred_size_; 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DialogContents); 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class ConstrainedWindowViewsTest : public ViewsTestBase { 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ConstrainedWindowViewsTest() : contents_(NULL) {} 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~ConstrainedWindowViewsTest() {} 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetUp() OVERRIDE { 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ViewsTestBase::SetUp(); 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) contents_ = new DialogContents; 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params.delegate = contents_; 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dialog_.reset(new Widget); 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dialog_->Init(params); 548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) dialog_host_.reset(new web_modal::TestWebContentsModalDialogHost( 558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) dialog_->GetNativeView())); 568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) dialog_host_->set_max_dialog_size(gfx::Size(5000, 5000)); 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Make sure the dialog size is dominated by the preferred size of the 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // contents. 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size preferred_size = dialog()->GetRootView()->GetPreferredSize(); 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) preferred_size.Enlarge(500, 500); 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) contents()->set_preferred_size(preferred_size); 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void TearDown() OVERRIDE { 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ViewsTestBase::TearDown(); 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) contents_ = NULL; 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dialog_host_.reset(); 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dialog_.reset(); 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size GetDialogSize() { 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return dialog()->GetRootView()->GetBoundsInScreen().size(); 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DialogContents* contents() { return contents_; } 778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) web_modal::TestWebContentsModalDialogHost* dialog_host() { 788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return dialog_host_.get(); 798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Widget* dialog() { return dialog_.get(); } 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DialogContents* contents_; 848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<web_modal::TestWebContentsModalDialogHost> dialog_host_; 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<Widget> dialog_; 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ConstrainedWindowViewsTest); 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Make sure a dialog that increases its preferred size grows on the next 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// position update. 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ConstrainedWindowViewsTest, GrowModalDialogSize) { 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateBrowserModalDialogPosition(dialog(), dialog_host()); 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size expected_size = GetDialogSize(); 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size preferred_size = contents()->GetPreferredSize(); 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_size.Enlarge(50, 50); 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) preferred_size.Enlarge(50, 50); 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) contents()->set_preferred_size(preferred_size); 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateBrowserModalDialogPosition(dialog(), dialog_host()); 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(expected_size.ToString(), GetDialogSize().ToString()); 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Make sure a dialog that reduces its preferred size shrinks on the next 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// position update. 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ConstrainedWindowViewsTest, ShrinkModalDialogSize) { 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateBrowserModalDialogPosition(dialog(), dialog_host()); 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size expected_size = GetDialogSize(); 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size preferred_size = contents()->GetPreferredSize(); 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_size.Enlarge(-50, -50); 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) preferred_size.Enlarge(-50, -50); 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) contents()->set_preferred_size(preferred_size); 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateBrowserModalDialogPosition(dialog(), dialog_host()); 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(expected_size.ToString(), GetDialogSize().ToString()); 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Make sure browser modal dialogs are not affected by restrictions on web 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// content modal dialog maximum sizes. 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ConstrainedWindowViewsTest, MaximumBrowserDialogSize) { 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateBrowserModalDialogPosition(dialog(), dialog_host()); 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size dialog_size = GetDialogSize(); 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size max_dialog_size = dialog_size; 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) max_dialog_size.Enlarge(-50, -50); 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dialog_host()->set_max_dialog_size(max_dialog_size); 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateBrowserModalDialogPosition(dialog(), dialog_host()); 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(dialog_size.ToString(), GetDialogSize().ToString()); 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Web content modal dialogs should not get a size larger than what the dialog 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// host gives as the maximum size. 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ConstrainedWindowViewsTest, MaximumWebContentsDialogSize) { 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateWebContentsModalDialogPosition(dialog(), dialog_host()); 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size full_dialog_size = GetDialogSize(); 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Size max_dialog_size = full_dialog_size; 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) max_dialog_size.Enlarge(-50, -50); 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dialog_host()->set_max_dialog_size(max_dialog_size); 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateWebContentsModalDialogPosition(dialog(), dialog_host()); 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The top border of the dialog is intentionally drawn outside the area 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // specified by the dialog host, so add it to the size the dialog is expected 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // to occupy. 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size expected_size = max_dialog_size; 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Border* border = dialog()->non_client_view()->frame_view()->border(); 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (border) 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_size.Enlarge(0, border->GetInsets().top()); 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(expected_size.ToString(), GetDialogSize().ToString()); 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Increasing the maximum dialog size should bring the dialog back to its 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // original size. 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) max_dialog_size.Enlarge(100, 100); 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dialog_host()->set_max_dialog_size(max_dialog_size); 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateWebContentsModalDialogPosition(dialog(), dialog_host()); 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(full_dialog_size.ToString(), GetDialogSize().ToString()); 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace views 155