window_positioner_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
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_positioner.h"
11#include "ash/wm/window_state.h"
12#include "ui/aura/root_window.h"
13#include "ui/gfx/screen.h"
14#include "ui/views/widget/widget.h"
15#include "ui/views/widget/widget_delegate.h"
16
17namespace ash {
18
19typedef test::AshTestBase WindowPositionerTest;
20
21TEST_F(WindowPositionerTest, OpenMaximizedWindowOnSecondDisplay) {
22  if (!SupportsMultipleDisplays())
23    return;
24  UpdateDisplay("400x400,500x500");
25  Shell::GetInstance()->set_target_root_window(
26      Shell::GetAllRootWindows()[1]);
27  shell::ToplevelWindow::CreateParams params;
28  params.can_resize = true;
29  params.can_maximize = true;
30  views::Widget* widget =
31      shell::ToplevelWindow::CreateToplevelWindow(params);
32  EXPECT_EQ("400,0 500x453", widget->GetWindowBoundsInScreen().ToString());
33}
34
35TEST_F(WindowPositionerTest, OpenDefaultWindowOnSecondDisplay) {
36  if (!SupportsMultipleDisplays())
37    return;
38#if defined(OS_WIN)
39  ash::WindowPositioner::SetMaximizeFirstWindow(true);
40#endif
41  UpdateDisplay("400x400,1400x900");
42  aura::Window* second_root_window = Shell::GetAllRootWindows()[1];
43  Shell::GetInstance()->set_target_root_window(
44      second_root_window);
45  shell::ToplevelWindow::CreateParams params;
46  params.can_resize = true;
47  params.can_maximize = true;
48  views::Widget* widget =
49      shell::ToplevelWindow::CreateToplevelWindow(params);
50  gfx::Rect bounds = widget->GetWindowBoundsInScreen();
51#if defined(OS_WIN)
52  EXPECT_TRUE(widget->IsMaximized());
53#else
54  // The window should be in the 2nd display with the default size.
55  EXPECT_EQ("300x300", bounds.size().ToString());
56#endif
57  EXPECT_TRUE(Shell::GetScreen()->GetDisplayNearestWindow(
58      second_root_window).bounds().Contains(bounds));
59}
60
61namespace {
62
63// A WidgetDelegate that returns the out of display saved bounds.
64class OutOfDisplayDelegate : public views::WidgetDelegate {
65 public:
66  explicit OutOfDisplayDelegate(views::Widget* widget) : widget_(widget) {}
67  virtual ~OutOfDisplayDelegate() {}
68
69  // Overridden from WidgetDelegate:
70  virtual void DeleteDelegate() OVERRIDE {
71    delete this;
72  }
73  virtual views::Widget* GetWidget() OVERRIDE {
74    return widget_;
75  }
76  virtual const views::Widget* GetWidget() const OVERRIDE {
77    return widget_;
78  }
79  virtual bool GetSavedWindowPlacement(
80      const views::Widget* widget,
81      gfx::Rect* bounds,
82      ui::WindowShowState* show_state) const OVERRIDE {
83    bounds->SetRect(450, 10, 100, 100);
84    *show_state = ui::SHOW_STATE_NORMAL;
85    return true;
86  }
87
88 private:
89  views::Widget* widget_;
90
91  DISALLOW_COPY_AND_ASSIGN(OutOfDisplayDelegate);
92};
93
94}  // namespace
95
96TEST_F(WindowPositionerTest, EnsureMinimumVisibility) {
97  if (!SupportsHostWindowResize())
98    return;
99
100  UpdateDisplay("400x400");
101  views::Widget* widget = new views::Widget();
102  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
103  params.delegate = new OutOfDisplayDelegate(widget);
104  params.context = Shell::GetPrimaryRootWindow();
105  widget->Init(params);
106  widget->SetBounds(gfx::Rect(450,10, 100, 100));
107  wm::GetWindowState(widget->GetNativeView())->set_minimum_visibility(true);
108  widget->Show();
109  // Make sure the bounds is adjusted to be inside the work area.
110  EXPECT_EQ("390,10 100x100", widget->GetWindowBoundsInScreen().ToString());
111  widget->CloseNow();
112}
113
114}  // namespace
115