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.
5 #include "ash/wm/window_positioner.h"
8 #include "ash/shell/toplevel_window.h"
9 #include "ash/test/ash_test_base.h"
10 #include "ash/wm/window_state.h"
11 #include "ui/aura/root_window.h"
12 #include "ui/gfx/screen.h"
13 #include "ui/views/widget/widget.h"
14 #include "ui/views/widget/widget_delegate.h"
18 typedef test::AshTestBase WindowPositionerTest;
20 TEST_F(WindowPositionerTest, OpenMaximizedWindowOnSecondDisplay) {
21 if (!SupportsMultipleDisplays())
23 UpdateDisplay("400x400,500x500");
24 Shell::GetInstance()->set_target_root_window(
25 Shell::GetAllRootWindows()[1]);
26 shell::ToplevelWindow::CreateParams params;
27 params.can_resize = true;
28 params.can_maximize = true;
29 views::Widget* widget =
30 shell::ToplevelWindow::CreateToplevelWindow(params);
31 EXPECT_EQ("400,0 500x453", widget->GetWindowBoundsInScreen().ToString());
34 TEST_F(WindowPositionerTest, OpenDefaultWindowOnSecondDisplay) {
35 if (!SupportsMultipleDisplays())
37 UpdateDisplay("400x400,1400x900");
38 aura::Window* second_root_window = Shell::GetAllRootWindows()[1];
39 Shell::GetInstance()->set_target_root_window(
41 shell::ToplevelWindow::CreateParams params;
42 params.can_resize = true;
43 params.can_maximize = true;
44 views::Widget* widget =
45 shell::ToplevelWindow::CreateToplevelWindow(params);
46 gfx::Rect bounds = widget->GetWindowBoundsInScreen();
47 // The window should be in the 2nd display with the default size.
48 EXPECT_EQ("300x300", bounds.size().ToString());
49 EXPECT_TRUE(Shell::GetScreen()->GetDisplayNearestWindow(
50 second_root_window).bounds().Contains(bounds));
55 // A WidgetDelegate that returns the out of display saved bounds.
56 class OutOfDisplayDelegate : public views::WidgetDelegate {
58 explicit OutOfDisplayDelegate(views::Widget* widget) : widget_(widget) {}
59 virtual ~OutOfDisplayDelegate() {}
61 // Overridden from WidgetDelegate:
62 virtual void DeleteDelegate() OVERRIDE {
65 virtual views::Widget* GetWidget() OVERRIDE {
68 virtual const views::Widget* GetWidget() const OVERRIDE {
71 virtual bool GetSavedWindowPlacement(
72 const views::Widget* widget,
74 ui::WindowShowState* show_state) const OVERRIDE {
75 bounds->SetRect(450, 10, 100, 100);
76 *show_state = ui::SHOW_STATE_NORMAL;
81 views::Widget* widget_;
83 DISALLOW_COPY_AND_ASSIGN(OutOfDisplayDelegate);
88 TEST_F(WindowPositionerTest, EnsureMinimumVisibility) {
89 if (!SupportsHostWindowResize())
92 UpdateDisplay("400x400");
93 views::Widget* widget = new views::Widget();
94 views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
95 params.delegate = new OutOfDisplayDelegate(widget);
96 params.context = Shell::GetPrimaryRootWindow();
98 widget->SetBounds(gfx::Rect(450,10, 100, 100));
99 wm::GetWindowState(widget->GetNativeView())->set_minimum_visibility(true);
101 // Make sure the bounds is adjusted to be inside the work area.
102 EXPECT_EQ("390,10 100x100", widget->GetWindowBoundsInScreen().ToString());