Home | History | Annotate | Download | only in wm
      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 
     17 namespace ash {
     18 
     19 typedef test::AshTestBase WindowPositionerTest;
     20 
     21 TEST_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 
     35 TEST_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 
     61 namespace {
     62 
     63 // A WidgetDelegate that returns the out of display saved bounds.
     64 class 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 
     96 TEST_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