- add sources.
[platform/framework/web/crosswalk.git] / src / ash / wm / window_positioner_unittest.cc
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 "ash/wm/window_positioner.h"
6
7 #include "ash/shell.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"
15
16 namespace ash {
17
18 typedef test::AshTestBase WindowPositionerTest;
19
20 TEST_F(WindowPositionerTest, OpenMaximizedWindowOnSecondDisplay) {
21   if (!SupportsMultipleDisplays())
22     return;
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());
32 }
33
34 TEST_F(WindowPositionerTest, OpenDefaultWindowOnSecondDisplay) {
35   if (!SupportsMultipleDisplays())
36     return;
37   UpdateDisplay("400x400,1400x900");
38   aura::Window* second_root_window = Shell::GetAllRootWindows()[1];
39   Shell::GetInstance()->set_target_root_window(
40       second_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));
51 }
52
53 namespace {
54
55 // A WidgetDelegate that returns the out of display saved bounds.
56 class OutOfDisplayDelegate : public views::WidgetDelegate {
57  public:
58   explicit OutOfDisplayDelegate(views::Widget* widget) : widget_(widget) {}
59   virtual ~OutOfDisplayDelegate() {}
60
61   // Overridden from WidgetDelegate:
62   virtual void DeleteDelegate() OVERRIDE {
63     delete this;
64   }
65   virtual views::Widget* GetWidget() OVERRIDE {
66     return widget_;
67   }
68   virtual const views::Widget* GetWidget() const OVERRIDE {
69     return widget_;
70   }
71   virtual bool GetSavedWindowPlacement(
72       const views::Widget* widget,
73       gfx::Rect* bounds,
74       ui::WindowShowState* show_state) const OVERRIDE {
75     bounds->SetRect(450, 10, 100, 100);
76     *show_state = ui::SHOW_STATE_NORMAL;
77     return true;
78   }
79
80  private:
81   views::Widget* widget_;
82
83   DISALLOW_COPY_AND_ASSIGN(OutOfDisplayDelegate);
84 };
85
86 }  // namespace
87
88 TEST_F(WindowPositionerTest, EnsureMinimumVisibility) {
89   if (!SupportsHostWindowResize())
90     return;
91
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();
97   widget->Init(params);
98   widget->SetBounds(gfx::Rect(450,10, 100, 100));
99   wm::GetWindowState(widget->GetNativeView())->set_minimum_visibility(true);
100   widget->Show();
101   // Make sure the bounds is adjusted to be inside the work area.
102   EXPECT_EQ("390,10 100x100", widget->GetWindowBoundsInScreen().ToString());
103   widget->CloseNow();
104 }
105
106 }  // namespace