Home | History | Annotate | Download | only in maximize_mode
      1 // Copyright 2014 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/maximize_mode/maximize_mode_window_manager.h"
      6 
      7 #include <string>
      8 
      9 #include "ash/root_window_controller.h"
     10 #include "ash/screen_util.h"
     11 #include "ash/shelf/shelf_layout_manager.h"
     12 #include "ash/shell.h"
     13 #include "ash/switchable_windows.h"
     14 #include "ash/test/ash_test_base.h"
     15 #include "ash/test/shell_test_api.h"
     16 #include "ash/wm/maximize_mode/maximize_mode_controller.h"
     17 #include "ash/wm/mru_window_tracker.h"
     18 #include "ash/wm/overview/window_selector_controller.h"
     19 #include "ash/wm/window_properties.h"
     20 #include "ash/wm/window_state.h"
     21 #include "ash/wm/window_util.h"
     22 #include "ash/wm/wm_event.h"
     23 #include "base/strings/stringprintf.h"
     24 #include "base/strings/utf_string_conversions.h"
     25 #include "base/values.h"
     26 #include "ui/aura/client/aura_constants.h"
     27 #include "ui/aura/test/event_generator.h"
     28 #include "ui/aura/test/test_window_delegate.h"
     29 #include "ui/aura/test/test_windows.h"
     30 #include "ui/aura/window.h"
     31 #include "ui/base/hit_test.h"
     32 
     33 namespace ash {
     34 
     35 // TODO(skuhne): These tests are failing on Widows because maximized is there
     36 // differently handled. Fix this!
     37 #if !defined(OS_WIN)
     38 
     39 class MaximizeModeWindowManagerTest : public test::AshTestBase {
     40  public:
     41   MaximizeModeWindowManagerTest() {}
     42   virtual ~MaximizeModeWindowManagerTest() {}
     43 
     44   // Creates a window which has a fixed size.
     45   aura::Window* CreateFixedSizeNonMaximizableWindow(ui::wm::WindowType type,
     46                                                     const gfx::Rect& bounds) {
     47     return CreateWindowInWatchedContainer(
     48         type, bounds, gfx::Size(), false, false);
     49   }
     50 
     51   // Creates a window which can not be maximized, but resized. |max_size|
     52   // denotes the maximal possible size, if the size is empty, the window has no
     53   // upper limit. Note: This function will only work with a single root window.
     54   aura::Window* CreateNonMaximizableWindow(ui::wm::WindowType type,
     55                                            const gfx::Rect& bounds,
     56                                            const gfx::Size& max_size) {
     57     return CreateWindowInWatchedContainer(type, bounds, max_size, false, true);
     58   }
     59 
     60   // Creates a maximizable and resizable window.
     61   aura::Window* CreateWindow(ui::wm::WindowType type,
     62                              const gfx::Rect bounds) {
     63     return CreateWindowInWatchedContainer(
     64         type, bounds, gfx::Size(), true, true);
     65   }
     66 
     67   // Creates a window which also has a widget.
     68   aura::Window* CreateWindowWithWidget(const gfx::Rect& bounds) {
     69     views::Widget* widget = new views::Widget();
     70     views::Widget::InitParams params;
     71     params.context = CurrentContext();
     72     // Note: The widget will get deleted with the window.
     73     widget->Init(params);
     74     widget->Show();
     75     aura::Window* window = widget->GetNativeWindow();
     76     window->SetBounds(bounds);
     77     window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
     78 
     79     return window;
     80   }
     81 
     82   // Create the Maximized mode window manager.
     83   ash::MaximizeModeWindowManager* CreateMaximizeModeWindowManager() {
     84     EXPECT_FALSE(maximize_mode_window_manager());
     85     Shell::GetInstance()->maximize_mode_controller()->
     86         EnableMaximizeModeWindowManager(true);
     87     return maximize_mode_window_manager();
     88   }
     89 
     90   // Destroy the maximized mode window manager.
     91   void DestroyMaximizeModeWindowManager() {
     92     Shell::GetInstance()->maximize_mode_controller()->
     93         EnableMaximizeModeWindowManager(false);
     94     EXPECT_FALSE(maximize_mode_window_manager());
     95   }
     96 
     97   // Get the maximze window manager.
     98   ash::MaximizeModeWindowManager* maximize_mode_window_manager() {
     99     return Shell::GetInstance()->maximize_mode_controller()->
    100         maximize_mode_window_manager_.get();
    101   }
    102 
    103   // Resize our desktop.
    104   void ResizeDesktop(int width_delta) {
    105     gfx::Size size = Shell::GetScreen()->GetDisplayNearestWindow(
    106         Shell::GetPrimaryRootWindow()).size();
    107     size.Enlarge(0, width_delta);
    108     UpdateDisplay(size.ToString());
    109   }
    110 
    111  private:
    112   // Create a window in one of the containers which are watched by the
    113   // MaximizeModeWindowManager. Note that this only works with one root window.
    114   // If |can_maximize| is not set, |max_size| is the upper limiting size for
    115   // the window, whereas an empty size means that there is no limit.
    116   aura::Window* CreateWindowInWatchedContainer(ui::wm::WindowType type,
    117                                                const gfx::Rect& bounds,
    118                                                const gfx::Size& max_size,
    119                                                bool can_maximize,
    120                                                bool can_resize) {
    121     aura::test::TestWindowDelegate* delegate = NULL;
    122     if (!can_maximize) {
    123       delegate = aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate();
    124       delegate->set_window_component(HTCAPTION);
    125       if (!max_size.IsEmpty())
    126         delegate->set_maximum_size(max_size);
    127     }
    128     aura::Window* window = aura::test::CreateTestWindowWithDelegateAndType(
    129         delegate, type, 0, bounds, NULL);
    130     window->SetProperty(aura::client::kCanMaximizeKey, can_maximize);
    131     if (!can_resize)
    132       window->SetProperty(aura::client::kCanResizeKey, false);
    133     aura::Window* container = Shell::GetContainer(
    134         Shell::GetPrimaryRootWindow(),
    135         kSwitchableWindowContainerIds[0]);
    136     container->AddChild(window);
    137     return window;
    138   }
    139 
    140   DISALLOW_COPY_AND_ASSIGN(MaximizeModeWindowManagerTest);
    141 };
    142 
    143 // Test that creating the object and destroying it without any windows should
    144 // not cause any problems.
    145 TEST_F(MaximizeModeWindowManagerTest, SimpleStart) {
    146   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    147   ASSERT_TRUE(manager);
    148   EXPECT_EQ(0, manager->GetNumberOfManagedWindows());
    149   DestroyMaximizeModeWindowManager();
    150 }
    151 
    152 // Test that existing windows will handled properly when going into maximized
    153 // mode.
    154 TEST_F(MaximizeModeWindowManagerTest, PreCreateWindows) {
    155   // Bounds for windows we know can be controlled.
    156   gfx::Rect rect1(10, 10, 200, 50);
    157   gfx::Rect rect2(10, 60, 200, 50);
    158   gfx::Rect rect3(20, 140, 100, 100);
    159   // Bounds for anything else.
    160   gfx::Rect rect(80, 90, 100, 110);
    161   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect1));
    162   scoped_ptr<aura::Window> w2(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect2));
    163   scoped_ptr<aura::Window> w3(
    164       CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect3));
    165   scoped_ptr<aura::Window> w4(CreateWindow(ui::wm::WINDOW_TYPE_PANEL, rect));
    166   scoped_ptr<aura::Window> w5(CreateWindow(ui::wm::WINDOW_TYPE_POPUP, rect));
    167   scoped_ptr<aura::Window> w6(CreateWindow(ui::wm::WINDOW_TYPE_CONTROL, rect));
    168   scoped_ptr<aura::Window> w7(CreateWindow(ui::wm::WINDOW_TYPE_MENU, rect));
    169   scoped_ptr<aura::Window> w8(CreateWindow(ui::wm::WINDOW_TYPE_TOOLTIP, rect));
    170   EXPECT_FALSE(wm::GetWindowState(w1.get())->IsMaximized());
    171   EXPECT_FALSE(wm::GetWindowState(w2.get())->IsMaximized());
    172   EXPECT_FALSE(wm::GetWindowState(w3.get())->IsMaximized());
    173   EXPECT_EQ(rect1.ToString(), w1->bounds().ToString());
    174   EXPECT_EQ(rect2.ToString(), w2->bounds().ToString());
    175   EXPECT_EQ(rect3.ToString(), w3->bounds().ToString());
    176 
    177   // Create the manager and make sure that all qualifying windows were detected
    178   // and changed.
    179   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    180   ASSERT_TRUE(manager);
    181   EXPECT_EQ(3, manager->GetNumberOfManagedWindows());
    182   EXPECT_TRUE(wm::GetWindowState(w1.get())->IsMaximized());
    183   EXPECT_TRUE(wm::GetWindowState(w2.get())->IsMaximized());
    184   EXPECT_FALSE(wm::GetWindowState(w3.get())->IsMaximized());
    185   EXPECT_NE(rect3.origin().ToString(), w3->bounds().origin().ToString());
    186   EXPECT_EQ(rect3.size().ToString(), w3->bounds().size().ToString());
    187 
    188   // All other windows should not have been touched.
    189   EXPECT_FALSE(wm::GetWindowState(w4.get())->IsMaximized());
    190   EXPECT_FALSE(wm::GetWindowState(w5.get())->IsMaximized());
    191   EXPECT_FALSE(wm::GetWindowState(w6.get())->IsMaximized());
    192   EXPECT_FALSE(wm::GetWindowState(w7.get())->IsMaximized());
    193   EXPECT_FALSE(wm::GetWindowState(w8.get())->IsMaximized());
    194   EXPECT_EQ(rect.ToString(), w4->bounds().ToString());
    195   EXPECT_EQ(rect.ToString(), w5->bounds().ToString());
    196   EXPECT_EQ(rect.ToString(), w6->bounds().ToString());
    197   EXPECT_EQ(rect.ToString(), w7->bounds().ToString());
    198   EXPECT_EQ(rect.ToString(), w8->bounds().ToString());
    199 
    200   // Destroy the manager again and check that the windows return to their
    201   // previous state.
    202   DestroyMaximizeModeWindowManager();
    203   EXPECT_FALSE(wm::GetWindowState(w1.get())->IsMaximized());
    204   EXPECT_FALSE(wm::GetWindowState(w2.get())->IsMaximized());
    205   EXPECT_FALSE(wm::GetWindowState(w3.get())->IsMaximized());
    206   EXPECT_EQ(rect1.ToString(), w1->bounds().ToString());
    207   EXPECT_EQ(rect2.ToString(), w2->bounds().ToString());
    208   EXPECT_EQ(rect3.ToString(), w3->bounds().ToString());
    209   EXPECT_EQ(rect.ToString(), w4->bounds().ToString());
    210   EXPECT_EQ(rect.ToString(), w5->bounds().ToString());
    211   EXPECT_EQ(rect.ToString(), w6->bounds().ToString());
    212   EXPECT_EQ(rect.ToString(), w7->bounds().ToString());
    213   EXPECT_EQ(rect.ToString(), w8->bounds().ToString());
    214 }
    215 
    216 // Test that non-maximizable windows get properly handled when going into
    217 // maximized mode.
    218 TEST_F(MaximizeModeWindowManagerTest,
    219        PreCreateNonMaximizableButResizableWindows) {
    220   // The window bounds.
    221   gfx::Rect rect(10, 10, 200, 50);
    222   gfx::Size max_size(300, 200);
    223   gfx::Size empty_size;
    224   scoped_ptr<aura::Window> unlimited_window(
    225       CreateNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect, empty_size));
    226   scoped_ptr<aura::Window> limited_window(
    227       CreateNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect, max_size));
    228   scoped_ptr<aura::Window> fixed_window(
    229       CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    230   EXPECT_FALSE(wm::GetWindowState(unlimited_window.get())->IsMaximized());
    231   EXPECT_EQ(rect.ToString(), unlimited_window->bounds().ToString());
    232   EXPECT_FALSE(wm::GetWindowState(limited_window.get())->IsMaximized());
    233   EXPECT_EQ(rect.ToString(), limited_window->bounds().ToString());
    234   EXPECT_FALSE(wm::GetWindowState(fixed_window.get())->IsMaximized());
    235   EXPECT_EQ(rect.ToString(), fixed_window->bounds().ToString());
    236 
    237   gfx::Size workspace_size = ScreenUtil::GetMaximizedWindowBoundsInParent(
    238       unlimited_window.get()).size();
    239 
    240   // Create the manager and make sure that all qualifying windows were detected
    241   // and changed.
    242   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    243   ASSERT_TRUE(manager);
    244   EXPECT_EQ(3, manager->GetNumberOfManagedWindows());
    245   // The unlimited window should have the size of the workspace / parent window.
    246   EXPECT_FALSE(wm::GetWindowState(unlimited_window.get())->IsMaximized());
    247   EXPECT_EQ("0,0", unlimited_window->bounds().origin().ToString());
    248   EXPECT_EQ(workspace_size.ToString(),
    249             unlimited_window->bounds().size().ToString());
    250   // The limited window should have the size of the upper possible bounds.
    251   EXPECT_FALSE(wm::GetWindowState(limited_window.get())->IsMaximized());
    252   EXPECT_NE(rect.origin().ToString(),
    253             limited_window->bounds().origin().ToString());
    254   EXPECT_EQ(max_size.ToString(),
    255             limited_window->bounds().size().ToString());
    256   // The fixed size window should have the size of the original window.
    257   EXPECT_FALSE(wm::GetWindowState(fixed_window.get())->IsMaximized());
    258   EXPECT_NE(rect.origin().ToString(),
    259             fixed_window->bounds().origin().ToString());
    260   EXPECT_EQ(rect.size().ToString(),
    261             fixed_window->bounds().size().ToString());
    262 
    263   // Destroy the manager again and check that the windows return to their
    264   // previous state.
    265   DestroyMaximizeModeWindowManager();
    266   EXPECT_FALSE(wm::GetWindowState(unlimited_window.get())->IsMaximized());
    267   EXPECT_EQ(rect.ToString(), unlimited_window->bounds().ToString());
    268   EXPECT_FALSE(wm::GetWindowState(limited_window.get())->IsMaximized());
    269   EXPECT_EQ(rect.ToString(), limited_window->bounds().ToString());
    270   EXPECT_FALSE(wm::GetWindowState(fixed_window.get())->IsMaximized());
    271   EXPECT_EQ(rect.ToString(), fixed_window->bounds().ToString());
    272 }
    273 
    274 // Test that creating windows while a maximizer exists picks them properly up.
    275 TEST_F(MaximizeModeWindowManagerTest, CreateWindows) {
    276   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    277   ASSERT_TRUE(manager);
    278   EXPECT_EQ(0, manager->GetNumberOfManagedWindows());
    279 
    280   // Create the windows and see that the window manager picks them up.
    281   // Rects for windows we know can be controlled.
    282   gfx::Rect rect1(10, 10, 200, 50);
    283   gfx::Rect rect2(10, 60, 200, 50);
    284   gfx::Rect rect3(20, 140, 100, 100);
    285   // One rect for anything else.
    286   gfx::Rect rect(80, 90, 100, 110);
    287   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect1));
    288   scoped_ptr<aura::Window> w2(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect2));
    289   scoped_ptr<aura::Window> w3(
    290       CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect3));
    291   scoped_ptr<aura::Window> w4(CreateWindow(ui::wm::WINDOW_TYPE_PANEL, rect));
    292   scoped_ptr<aura::Window> w5(CreateWindow(ui::wm::WINDOW_TYPE_POPUP, rect));
    293   scoped_ptr<aura::Window> w6(CreateWindow(ui::wm::WINDOW_TYPE_CONTROL, rect));
    294   scoped_ptr<aura::Window> w7(CreateWindow(ui::wm::WINDOW_TYPE_MENU, rect));
    295   scoped_ptr<aura::Window> w8(CreateWindow(ui::wm::WINDOW_TYPE_TOOLTIP, rect));
    296   EXPECT_TRUE(wm::GetWindowState(w1.get())->IsMaximized());
    297   EXPECT_TRUE(wm::GetWindowState(w2.get())->IsMaximized());
    298   EXPECT_EQ(3, manager->GetNumberOfManagedWindows());
    299   EXPECT_FALSE(wm::GetWindowState(w3.get())->IsMaximized());
    300 
    301   // Make sure that the position of the unresizable window is in the middle of
    302   // the screen.
    303   gfx::Size work_area_size =
    304       ScreenUtil::GetDisplayWorkAreaBoundsInParent(w3.get()).size();
    305   gfx::Point center =
    306       gfx::Point((work_area_size.width() - rect3.size().width()) / 2,
    307                  (work_area_size.height() - rect3.size().height()) / 2);
    308   gfx::Rect centered_window_bounds = gfx::Rect(center, rect3.size());
    309   EXPECT_EQ(centered_window_bounds.ToString(), w3->bounds().ToString());
    310 
    311   // All other windows should not have been touched.
    312   EXPECT_FALSE(wm::GetWindowState(w4.get())->IsMaximized());
    313   EXPECT_FALSE(wm::GetWindowState(w5.get())->IsMaximized());
    314   EXPECT_FALSE(wm::GetWindowState(w6.get())->IsMaximized());
    315   EXPECT_FALSE(wm::GetWindowState(w7.get())->IsMaximized());
    316   EXPECT_FALSE(wm::GetWindowState(w8.get())->IsMaximized());
    317   EXPECT_EQ(rect.ToString(), w4->bounds().ToString());
    318   EXPECT_EQ(rect.ToString(), w5->bounds().ToString());
    319   EXPECT_EQ(rect.ToString(), w6->bounds().ToString());
    320   EXPECT_EQ(rect.ToString(), w7->bounds().ToString());
    321   EXPECT_EQ(rect.ToString(), w8->bounds().ToString());
    322 
    323   // After the maximize mode was disabled all windows fall back into the mode
    324   // they were created for.
    325   DestroyMaximizeModeWindowManager();
    326   EXPECT_FALSE(wm::GetWindowState(w1.get())->IsMaximized());
    327   EXPECT_FALSE(wm::GetWindowState(w2.get())->IsMaximized());
    328   EXPECT_FALSE(wm::GetWindowState(w3.get())->IsMaximized());
    329   EXPECT_EQ(rect1.ToString(), w1->bounds().ToString());
    330   EXPECT_EQ(rect2.ToString(), w2->bounds().ToString());
    331   EXPECT_EQ(rect3.ToString(), w3->bounds().ToString());
    332   EXPECT_EQ(rect.ToString(), w4->bounds().ToString());
    333   EXPECT_EQ(rect.ToString(), w5->bounds().ToString());
    334   EXPECT_EQ(rect.ToString(), w6->bounds().ToString());
    335   EXPECT_EQ(rect.ToString(), w7->bounds().ToString());
    336   EXPECT_EQ(rect.ToString(), w8->bounds().ToString());
    337 }
    338 
    339 // Test that a window which got created while the maximize mode window manager
    340 // is active gets restored to a usable (non tiny) size upon switching back.
    341 TEST_F(MaximizeModeWindowManagerTest,
    342        CreateWindowInMaximizedModeRestoresToUsefulSize) {
    343   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    344   ASSERT_TRUE(manager);
    345   EXPECT_EQ(0, manager->GetNumberOfManagedWindows());
    346 
    347   // We pass in an empty rectangle to simulate a window creation with no
    348   // particular size.
    349   gfx::Rect empty_rect(0, 0, 0, 0);
    350   scoped_ptr<aura::Window> window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL,
    351                                                empty_rect));
    352   EXPECT_TRUE(wm::GetWindowState(window.get())->IsMaximized());
    353   EXPECT_NE(empty_rect.ToString(), window->bounds().ToString());
    354   gfx::Rect maximized_size = window->bounds();
    355 
    356   // Destroy the maximize mode and check that the resulting size of the window
    357   // is remaining as it is (but not maximized).
    358   DestroyMaximizeModeWindowManager();
    359 
    360   EXPECT_FALSE(wm::GetWindowState(window.get())->IsMaximized());
    361   EXPECT_EQ(maximized_size.ToString(), window->bounds().ToString());
    362 }
    363 
    364 // Test that non-maximizable windows get properly handled when created in
    365 // maximized mode.
    366 TEST_F(MaximizeModeWindowManagerTest,
    367        CreateNonMaximizableButResizableWindows) {
    368   // Create the manager and make sure that all qualifying windows were detected
    369   // and changed.
    370   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    371   ASSERT_TRUE(manager);
    372 
    373   gfx::Rect rect(10, 10, 200, 50);
    374   gfx::Size max_size(300, 200);
    375   gfx::Size empty_size;
    376   scoped_ptr<aura::Window> unlimited_window(
    377       CreateNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect, empty_size));
    378   scoped_ptr<aura::Window> limited_window(
    379       CreateNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect, max_size));
    380   scoped_ptr<aura::Window> fixed_window(
    381       CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    382 
    383   gfx::Size workspace_size = ScreenUtil::GetMaximizedWindowBoundsInParent(
    384       unlimited_window.get()).size();
    385 
    386   // All windows should be sized now as big as possible and be centered.
    387   EXPECT_EQ(3, manager->GetNumberOfManagedWindows());
    388   // The unlimited window should have the size of the workspace / parent window.
    389   EXPECT_FALSE(wm::GetWindowState(unlimited_window.get())->IsMaximized());
    390   EXPECT_EQ("0,0", unlimited_window->bounds().origin().ToString());
    391   EXPECT_EQ(workspace_size.ToString(),
    392             unlimited_window->bounds().size().ToString());
    393   // The limited window should have the size of the upper possible bounds.
    394   EXPECT_FALSE(wm::GetWindowState(limited_window.get())->IsMaximized());
    395   EXPECT_NE(rect.origin().ToString(),
    396             limited_window->bounds().origin().ToString());
    397   EXPECT_EQ(max_size.ToString(),
    398             limited_window->bounds().size().ToString());
    399   // The fixed size window should have the size of the original window.
    400   EXPECT_FALSE(wm::GetWindowState(fixed_window.get())->IsMaximized());
    401   EXPECT_NE(rect.origin().ToString(),
    402             fixed_window->bounds().origin().ToString());
    403   EXPECT_EQ(rect.size().ToString(),
    404             fixed_window->bounds().size().ToString());
    405 
    406   // Destroy the manager again and check that the windows return to their
    407   // creation state.
    408   DestroyMaximizeModeWindowManager();
    409 
    410   EXPECT_FALSE(wm::GetWindowState(unlimited_window.get())->IsMaximized());
    411   EXPECT_EQ(rect.ToString(), unlimited_window->bounds().ToString());
    412   EXPECT_FALSE(wm::GetWindowState(limited_window.get())->IsMaximized());
    413   EXPECT_EQ(rect.ToString(), limited_window->bounds().ToString());
    414   EXPECT_FALSE(wm::GetWindowState(fixed_window.get())->IsMaximized());
    415   EXPECT_EQ(rect.ToString(), fixed_window->bounds().ToString());
    416 }
    417 
    418 // Create a string which consists of the bounds and the state for comparison.
    419 std::string GetPlacementString(const gfx::Rect& bounds,
    420                                ui::WindowShowState state) {
    421   return bounds.ToString() + base::StringPrintf(" %d", state);
    422 }
    423 
    424 // Retrieves the window's restore state override - if any - and returns it as a
    425 // string.
    426 std::string GetPlacementOverride(aura::Window* window) {
    427   gfx::Rect* bounds = window->GetProperty(ash::kRestoreBoundsOverrideKey);
    428   if (bounds) {
    429     gfx::Rect restore_bounds = *bounds;
    430     ui::WindowShowState restore_state =
    431         window->GetProperty(ash::kRestoreShowStateOverrideKey);
    432     return GetPlacementString(restore_bounds, restore_state);
    433   }
    434   return std::string();
    435 }
    436 
    437 // Test that the restore state will be kept at its original value for
    438 // session restauration purposes.
    439 TEST_F(MaximizeModeWindowManagerTest, TestRestoreIntegrety) {
    440   gfx::Rect bounds(10, 10, 200, 50);
    441   gfx::Size empty_size;
    442   gfx::Rect empty_bounds;
    443   scoped_ptr<aura::Window> normal_window(
    444       CreateWindowWithWidget(bounds));
    445   scoped_ptr<aura::Window> maximized_window(
    446       CreateWindowWithWidget(bounds));
    447   wm::GetWindowState(maximized_window.get())->Maximize();
    448 
    449   EXPECT_EQ(std::string(), GetPlacementOverride(normal_window.get()));
    450   EXPECT_EQ(std::string(), GetPlacementOverride(maximized_window.get()));
    451 
    452   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    453   ASSERT_TRUE(manager);
    454 
    455   // With the maximization the override states should be returned in its
    456   // pre-maximized state.
    457   EXPECT_EQ(GetPlacementString(bounds, ui::SHOW_STATE_NORMAL),
    458             GetPlacementOverride(normal_window.get()));
    459   EXPECT_EQ(GetPlacementString(bounds, ui::SHOW_STATE_MAXIMIZED),
    460             GetPlacementOverride(maximized_window.get()));
    461 
    462   // Changing a window's state now does not change the returned result.
    463   wm::GetWindowState(maximized_window.get())->Minimize();
    464   EXPECT_EQ(GetPlacementString(bounds, ui::SHOW_STATE_MAXIMIZED),
    465             GetPlacementOverride(maximized_window.get()));
    466 
    467   // Destroy the manager again and check that the overrides get reset.
    468   DestroyMaximizeModeWindowManager();
    469   EXPECT_EQ(std::string(), GetPlacementOverride(normal_window.get()));
    470   EXPECT_EQ(std::string(), GetPlacementOverride(maximized_window.get()));
    471 
    472   // Changing a window's state now does not bring the overrides back.
    473   wm::GetWindowState(maximized_window.get())->Restore();
    474   gfx::Rect new_bounds(10, 10, 200, 50);
    475   maximized_window->SetBounds(new_bounds);
    476 
    477   EXPECT_EQ(std::string(), GetPlacementOverride(maximized_window.get()));
    478 }
    479 
    480 // Test that windows which got created before the maximizer was created can be
    481 // destroyed while the maximizer is still running.
    482 TEST_F(MaximizeModeWindowManagerTest, PreCreateWindowsDeleteWhileActive) {
    483   ash::MaximizeModeWindowManager* manager = NULL;
    484   {
    485     // Bounds for windows we know can be controlled.
    486     gfx::Rect rect1(10, 10, 200, 50);
    487     gfx::Rect rect2(10, 60, 200, 50);
    488     gfx::Rect rect3(20, 140, 100, 100);
    489     // Bounds for anything else.
    490     gfx::Rect rect(80, 90, 100, 110);
    491     scoped_ptr<aura::Window> w1(
    492         CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect1));
    493     scoped_ptr<aura::Window> w2(
    494         CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect2));
    495     scoped_ptr<aura::Window> w3(
    496         CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect3));
    497 
    498     // Create the manager and make sure that all qualifying windows were
    499     // detected and changed.
    500     manager = CreateMaximizeModeWindowManager();
    501     ASSERT_TRUE(manager);
    502     EXPECT_EQ(3, manager->GetNumberOfManagedWindows());
    503   }
    504   EXPECT_EQ(0, manager->GetNumberOfManagedWindows());
    505   DestroyMaximizeModeWindowManager();
    506 }
    507 
    508 // Test that windows which got created while the maximizer was running can get
    509 // destroyed before the maximizer gets destroyed.
    510 TEST_F(MaximizeModeWindowManagerTest, CreateWindowsAndDeleteWhileActive) {
    511   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    512   ASSERT_TRUE(manager);
    513   EXPECT_EQ(0, manager->GetNumberOfManagedWindows());
    514   {
    515     // Bounds for windows we know can be controlled.
    516     gfx::Rect rect1(10, 10, 200, 50);
    517     gfx::Rect rect2(10, 60, 200, 50);
    518     gfx::Rect rect3(20, 140, 100, 100);
    519     scoped_ptr<aura::Window> w1(
    520         CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, gfx::Rect(10, 10, 200, 50)));
    521     scoped_ptr<aura::Window> w2(
    522         CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, gfx::Rect(10, 60, 200, 50)));
    523     scoped_ptr<aura::Window> w3(
    524         CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL,
    525                                             gfx::Rect(20, 140, 100, 100)));
    526     // Check that the windows got automatically maximized as well.
    527     EXPECT_EQ(3, manager->GetNumberOfManagedWindows());
    528     EXPECT_TRUE(wm::GetWindowState(w1.get())->IsMaximized());
    529     EXPECT_TRUE(wm::GetWindowState(w2.get())->IsMaximized());
    530     EXPECT_FALSE(wm::GetWindowState(w3.get())->IsMaximized());
    531   }
    532   EXPECT_EQ(0, manager->GetNumberOfManagedWindows());
    533   DestroyMaximizeModeWindowManager();
    534 }
    535 
    536 // Test that windows which were maximized stay maximized.
    537 TEST_F(MaximizeModeWindowManagerTest, MaximizedShouldRemainMaximized) {
    538   // Bounds for windows we know can be controlled.
    539   gfx::Rect rect(10, 10, 200, 50);
    540   scoped_ptr<aura::Window> window(
    541       CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    542   wm::GetWindowState(window.get())->Maximize();
    543 
    544   // Create the manager and make sure that the window gets detected.
    545   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    546   ASSERT_TRUE(manager);
    547   EXPECT_EQ(1, manager->GetNumberOfManagedWindows());
    548   EXPECT_TRUE(wm::GetWindowState(window.get())->IsMaximized());
    549 
    550   // Destroy the manager again and check that the window will remain maximized.
    551   DestroyMaximizeModeWindowManager();
    552   EXPECT_TRUE(wm::GetWindowState(window.get())->IsMaximized());
    553   wm::GetWindowState(window.get())->Restore();
    554   EXPECT_EQ(rect.ToString(), window->bounds().ToString());
    555 }
    556 
    557 // Test that minimized windows do neither get maximized nor restored upon
    558 // entering maximized mode and get restored to their previous state after
    559 // leaving.
    560 TEST_F(MaximizeModeWindowManagerTest, MinimizedWindowBehavior) {
    561   // Bounds for windows we know can be controlled.
    562   gfx::Rect rect(10, 10, 200, 50);
    563   scoped_ptr<aura::Window> initially_minimized_window(
    564       CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    565   scoped_ptr<aura::Window> initially_normal_window(
    566       CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    567   scoped_ptr<aura::Window> initially_maximized_window(
    568       CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    569   wm::GetWindowState(initially_minimized_window.get())->Minimize();
    570   wm::GetWindowState(initially_maximized_window.get())->Maximize();
    571 
    572   // Create the manager and make sure that the window gets detected.
    573   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    574   ASSERT_TRUE(manager);
    575   EXPECT_EQ(3, manager->GetNumberOfManagedWindows());
    576   EXPECT_TRUE(wm::GetWindowState(
    577       initially_minimized_window.get())->IsMinimized());
    578   EXPECT_TRUE(wm::GetWindowState(initially_normal_window.get())->IsMaximized());
    579   EXPECT_TRUE(wm::GetWindowState(
    580       initially_maximized_window.get())->IsMaximized());
    581   // Now minimize the second window to check that upon leaving the window
    582   // will get restored to its minimized state.
    583   wm::GetWindowState(initially_normal_window.get())->Minimize();
    584   wm::GetWindowState(initially_maximized_window.get())->Minimize();
    585   EXPECT_TRUE(wm::GetWindowState(
    586       initially_minimized_window.get())->IsMinimized());
    587   EXPECT_TRUE(wm::GetWindowState(
    588       initially_normal_window.get())->IsMinimized());
    589   EXPECT_TRUE(wm::GetWindowState(
    590       initially_maximized_window.get())->IsMinimized());
    591 
    592   // Destroy the manager again and check that the window will get minimized.
    593   DestroyMaximizeModeWindowManager();
    594   EXPECT_TRUE(wm::GetWindowState(
    595       initially_minimized_window.get())->IsMinimized());
    596   EXPECT_FALSE(wm::GetWindowState(
    597                    initially_normal_window.get())->IsMinimized());
    598   EXPECT_TRUE(wm::GetWindowState(
    599       initially_maximized_window.get())->IsMaximized());
    600 }
    601 
    602 // Check that resizing the desktop does reposition unmaximizable, unresizable &
    603 // managed windows.
    604 TEST_F(MaximizeModeWindowManagerTest, DesktopSizeChangeMovesUnmaximizable) {
    605   UpdateDisplay("400x400");
    606   // This window will move because it does not fit the new bounds.
    607   gfx::Rect rect(20, 300, 100, 100);
    608   scoped_ptr<aura::Window> window1(
    609       CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    610   EXPECT_EQ(rect.ToString(), window1->bounds().ToString());
    611 
    612   // This window will not move because it does fit the new bounds.
    613   gfx::Rect rect2(20, 140, 100, 100);
    614   scoped_ptr<aura::Window> window2(
    615       CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect2));
    616 
    617   // Turning on the manager will reposition (but not resize) the window.
    618   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    619   ASSERT_TRUE(manager);
    620   EXPECT_EQ(2, manager->GetNumberOfManagedWindows());
    621   gfx::Rect moved_bounds(window1->bounds());
    622   EXPECT_NE(rect.origin().ToString(), moved_bounds.origin().ToString());
    623   EXPECT_EQ(rect.size().ToString(), moved_bounds.size().ToString());
    624 
    625   // Simulating a desktop resize should move the window again.
    626   UpdateDisplay("300x300");
    627   gfx::Rect new_moved_bounds(window1->bounds());
    628   EXPECT_NE(rect.origin().ToString(), new_moved_bounds.origin().ToString());
    629   EXPECT_EQ(rect.size().ToString(), new_moved_bounds.size().ToString());
    630   EXPECT_NE(moved_bounds.origin().ToString(), new_moved_bounds.ToString());
    631 
    632   // Turning off the mode should not restore to the initial coordinates since
    633   // the new resolution is smaller and the window was on the edge.
    634   DestroyMaximizeModeWindowManager();
    635   EXPECT_NE(rect.ToString(), window1->bounds().ToString());
    636   EXPECT_EQ(rect2.ToString(), window2->bounds().ToString());
    637 }
    638 
    639 // Check that windows return to original location if desktop size changes to
    640 // something else and back while in maximize mode.
    641 TEST_F(MaximizeModeWindowManagerTest, SizeChangeReturnWindowToOriginalPos) {
    642   gfx::Rect rect(20, 140, 100, 100);
    643   scoped_ptr<aura::Window> window(
    644       CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    645 
    646   // Turning on the manager will reposition (but not resize) the window.
    647   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    648   ASSERT_TRUE(manager);
    649   EXPECT_EQ(1, manager->GetNumberOfManagedWindows());
    650   gfx::Rect moved_bounds(window->bounds());
    651   EXPECT_NE(rect.origin().ToString(), moved_bounds.origin().ToString());
    652   EXPECT_EQ(rect.size().ToString(), moved_bounds.size().ToString());
    653 
    654   // Simulating a desktop resize should move the window again.
    655   ResizeDesktop(-10);
    656   gfx::Rect new_moved_bounds(window->bounds());
    657   EXPECT_NE(rect.origin().ToString(), new_moved_bounds.origin().ToString());
    658   EXPECT_EQ(rect.size().ToString(), new_moved_bounds.size().ToString());
    659   EXPECT_NE(moved_bounds.origin().ToString(), new_moved_bounds.ToString());
    660 
    661   // Then resize back to the original desktop size which should move windows
    662   // to their original location after leaving the maximize mode.
    663   ResizeDesktop(10);
    664   DestroyMaximizeModeWindowManager();
    665   EXPECT_EQ(rect.ToString(), window->bounds().ToString());
    666 }
    667 
    668 // Check that enabling of the maximize mode does not have an impact on the MRU
    669 // order of windows.
    670 TEST_F(MaximizeModeWindowManagerTest, ModeChangeKeepsMRUOrder) {
    671   gfx::Rect rect(20, 140, 100, 100);
    672   scoped_ptr<aura::Window> w1(
    673       CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    674   scoped_ptr<aura::Window> w2(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    675   scoped_ptr<aura::Window> w3(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    676   scoped_ptr<aura::Window> w4(
    677       CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    678   scoped_ptr<aura::Window> w5(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    679 
    680   // The windows should be in the reverse order of creation in the MRU list.
    681   {
    682     MruWindowTracker::WindowList windows =
    683         MruWindowTracker::BuildWindowList(false);
    684     EXPECT_EQ(w1.get(), windows[4]);
    685     EXPECT_EQ(w2.get(), windows[3]);
    686     EXPECT_EQ(w3.get(), windows[2]);
    687     EXPECT_EQ(w4.get(), windows[1]);
    688     EXPECT_EQ(w5.get(), windows[0]);
    689   }
    690 
    691   // Activating the window manager should keep the order.
    692   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
    693   ASSERT_TRUE(manager);
    694   EXPECT_EQ(5, manager->GetNumberOfManagedWindows());
    695   {
    696     MruWindowTracker::WindowList windows =
    697         MruWindowTracker::BuildWindowList(false);
    698     // We do not test maximization here again since that was done already.
    699     EXPECT_EQ(w1.get(), windows[4]);
    700     EXPECT_EQ(w2.get(), windows[3]);
    701     EXPECT_EQ(w3.get(), windows[2]);
    702     EXPECT_EQ(w4.get(), windows[1]);
    703     EXPECT_EQ(w5.get(), windows[0]);
    704   }
    705 
    706   // Destroying should still keep the order.
    707   DestroyMaximizeModeWindowManager();
    708   {
    709     MruWindowTracker::WindowList windows =
    710         MruWindowTracker::BuildWindowList(false);
    711     // We do not test maximization here again since that was done already.
    712     EXPECT_EQ(w1.get(), windows[4]);
    713     EXPECT_EQ(w2.get(), windows[3]);
    714     EXPECT_EQ(w3.get(), windows[2]);
    715     EXPECT_EQ(w4.get(), windows[1]);
    716     EXPECT_EQ(w5.get(), windows[0]);
    717   }
    718 }
    719 
    720 // Check that a restore state change does always restore to maximized.
    721 TEST_F(MaximizeModeWindowManagerTest, IgnoreRestoreStateChages) {
    722   gfx::Rect rect(20, 140, 100, 100);
    723   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    724   wm::WindowState* window_state = wm::GetWindowState(w1.get());
    725   CreateMaximizeModeWindowManager();
    726   EXPECT_TRUE(window_state->IsMaximized());
    727   window_state->Minimize();
    728   EXPECT_TRUE(window_state->IsMinimized());
    729   window_state->Restore();
    730   EXPECT_TRUE(window_state->IsMaximized());
    731   window_state->Restore();
    732   EXPECT_TRUE(window_state->IsMaximized());
    733   DestroyMaximizeModeWindowManager();
    734 }
    735 
    736 // Check that minimize and restore do the right thing.
    737 TEST_F(MaximizeModeWindowManagerTest, TestMinimize) {
    738   gfx::Rect rect(10, 10, 100, 100);
    739   scoped_ptr<aura::Window> window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL,
    740                                   rect));
    741   wm::WindowState* window_state = wm::GetWindowState(window.get());
    742   EXPECT_EQ(rect.ToString(), window->bounds().ToString());
    743   ash::Shell::GetInstance()->maximize_mode_controller()->
    744       EnableMaximizeModeWindowManager(true);
    745   EXPECT_TRUE(window_state->IsMaximized());
    746   EXPECT_FALSE(window_state->IsMinimized());
    747   EXPECT_TRUE(window->IsVisible());
    748 
    749   window_state->Minimize();
    750   EXPECT_FALSE(window_state->IsMaximized());
    751   EXPECT_TRUE(window_state->IsMinimized());
    752   EXPECT_FALSE(window->IsVisible());
    753 
    754   window_state->Maximize();
    755   EXPECT_TRUE(window_state->IsMaximized());
    756   EXPECT_FALSE(window_state->IsMinimized());
    757   EXPECT_TRUE(window->IsVisible());
    758 
    759   ash::Shell::GetInstance()->maximize_mode_controller()->
    760       EnableMaximizeModeWindowManager(false);
    761   EXPECT_FALSE(window_state->IsMaximized());
    762   EXPECT_FALSE(window_state->IsMinimized());
    763   EXPECT_TRUE(window->IsVisible());
    764 }
    765 
    766 // Check that a full screen window is staying full screen in maximize mode,
    767 // and that it returns to full screen thereafter (if left).
    768 TEST_F(MaximizeModeWindowManagerTest, KeepFullScreenModeOn) {
    769   gfx::Rect rect(20, 140, 100, 100);
    770   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    771   wm::WindowState* window_state = wm::GetWindowState(w1.get());
    772 
    773   ShelfLayoutManager* shelf =
    774       Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager();
    775 
    776   // Allow the shelf to hide.
    777   shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
    778   EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
    779 
    780   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
    781   window_state->OnWMEvent(&event);
    782 
    783   // With full screen, the shelf should get hidden.
    784   EXPECT_TRUE(window_state->IsFullscreen());
    785   EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
    786 
    787   CreateMaximizeModeWindowManager();
    788 
    789   // The Full screen mode should continue to be on.
    790   EXPECT_TRUE(window_state->IsFullscreen());
    791   EXPECT_FALSE(window_state->IsMaximized());
    792   EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
    793 
    794   // With leaving the fullscreen mode, the maximized mode should return and the
    795   // shelf should become visible.
    796   window_state->OnWMEvent(&event);
    797   EXPECT_FALSE(window_state->IsFullscreen());
    798   EXPECT_TRUE(window_state->IsMaximized());
    799   EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
    800 
    801   // Ending the maximize mode should return to full screen and the shelf should
    802   // be hidden again.
    803   DestroyMaximizeModeWindowManager();
    804   EXPECT_TRUE(window_state->IsFullscreen());
    805   EXPECT_FALSE(window_state->IsMaximized());
    806   EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
    807 }
    808 
    809 // Check that full screen mode can be turned on in maximized mode and remains
    810 // upon coming back.
    811 TEST_F(MaximizeModeWindowManagerTest, AllowFullScreenMode) {
    812   gfx::Rect rect(20, 140, 100, 100);
    813   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    814   wm::WindowState* window_state = wm::GetWindowState(w1.get());
    815 
    816   ShelfLayoutManager* shelf =
    817       Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager();
    818 
    819   // Allow the shelf to hide.
    820   shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
    821 
    822   EXPECT_FALSE(window_state->IsFullscreen());
    823   EXPECT_FALSE(window_state->IsMaximized());
    824   EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
    825 
    826   CreateMaximizeModeWindowManager();
    827 
    828   // Fullscreen mode should still be off and the shelf should be visible.
    829   EXPECT_FALSE(window_state->IsFullscreen());
    830   EXPECT_TRUE(window_state->IsMaximized());
    831   EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
    832 
    833   // After going into fullscreen mode, the shelf should be hidden.
    834   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
    835   window_state->OnWMEvent(&event);
    836   EXPECT_TRUE(window_state->IsFullscreen());
    837   EXPECT_FALSE(window_state->IsMaximized());
    838   EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
    839 
    840   // With the destruction of the manager we should remain in full screen.
    841   DestroyMaximizeModeWindowManager();
    842   EXPECT_TRUE(window_state->IsFullscreen());
    843   EXPECT_FALSE(window_state->IsMaximized());
    844   EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
    845 }
    846 
    847 // Check that the full screen mode will stay active when the maximize mode is
    848 // ended.
    849 TEST_F(MaximizeModeWindowManagerTest,
    850        FullScreenModeRemainsWhenCreatedInMaximizedMode) {
    851   CreateMaximizeModeWindowManager();
    852 
    853   gfx::Rect rect(20, 140, 100, 100);
    854   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    855   wm::WindowState* window_state = wm::GetWindowState(w1.get());
    856   wm::WMEvent event_full_screen(wm::WM_EVENT_TOGGLE_FULLSCREEN);
    857   window_state->OnWMEvent(&event_full_screen);
    858   EXPECT_TRUE(window_state->IsFullscreen());
    859 
    860   // After the maximize mode manager is ended, full screen will remain.
    861   DestroyMaximizeModeWindowManager();
    862   EXPECT_TRUE(window_state->IsFullscreen());
    863 }
    864 
    865 // Check that the full screen mode will stay active throughout a maximzied mode
    866 // session.
    867 TEST_F(MaximizeModeWindowManagerTest,
    868        FullScreenModeRemainsThroughMaximizeModeSwitch) {
    869   gfx::Rect rect(20, 140, 100, 100);
    870   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    871   wm::WindowState* window_state = wm::GetWindowState(w1.get());
    872   wm::WMEvent event_full_screen(wm::WM_EVENT_TOGGLE_FULLSCREEN);
    873   window_state->OnWMEvent(&event_full_screen);
    874   EXPECT_TRUE(window_state->IsFullscreen());
    875 
    876   CreateMaximizeModeWindowManager();
    877   EXPECT_TRUE(window_state->IsFullscreen());
    878   DestroyMaximizeModeWindowManager();
    879   EXPECT_TRUE(window_state->IsFullscreen());
    880 }
    881 
    882 // Check that an empty window does not get restored to a tiny size.
    883 TEST_F(MaximizeModeWindowManagerTest,
    884        CreateAndMaximizeInMaximizeModeShouldRetoreToGoodSizeGoingToDefault) {
    885   CreateMaximizeModeWindowManager();
    886   gfx::Rect rect;
    887   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    888   w1->Show();
    889   wm::WindowState* window_state = wm::GetWindowState(w1.get());
    890   EXPECT_TRUE(window_state->IsMaximized());
    891 
    892   // There is a calling order in which the restore bounds can get set to an
    893   // empty rectangle. We simulate this here.
    894   window_state->SetRestoreBoundsInScreen(rect);
    895   EXPECT_TRUE(window_state->GetRestoreBoundsInScreen().IsEmpty());
    896 
    897   // Setting the window to a new size will physically not change the window,
    898   // but the restore size should get updated so that a restore later on will
    899   // return to this size.
    900   gfx::Rect requested_bounds(10, 20, 50, 70);
    901   w1->SetBounds(requested_bounds);
    902   EXPECT_TRUE(window_state->IsMaximized());
    903   EXPECT_EQ(requested_bounds.ToString(),
    904             window_state->GetRestoreBoundsInScreen().ToString());
    905 
    906   DestroyMaximizeModeWindowManager();
    907 
    908   EXPECT_FALSE(window_state->IsMaximized());
    909   EXPECT_EQ(w1->bounds().ToString(), requested_bounds.ToString());
    910 }
    911 
    912 // Check that snapping operations get ignored.
    913 TEST_F(MaximizeModeWindowManagerTest, SnapModeTests) {
    914   gfx::Rect rect(20, 140, 100, 100);
    915   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    916   wm::WindowState* window_state = wm::GetWindowState(w1.get());
    917   wm::WMEvent event_left(wm::WM_EVENT_SNAP_LEFT);
    918   wm::WMEvent event_right(wm::WM_EVENT_SNAP_RIGHT);
    919   window_state->OnWMEvent(&event_left);
    920   EXPECT_TRUE(window_state->IsSnapped());
    921 
    922   CreateMaximizeModeWindowManager();
    923 
    924   // Fullscreen mode should now be off and it should not come back while in
    925   // maximize mode.
    926   EXPECT_FALSE(window_state->IsSnapped());
    927   EXPECT_TRUE(window_state->IsMaximized());
    928   window_state->OnWMEvent(&event_left);
    929   EXPECT_FALSE(window_state->IsSnapped());
    930   EXPECT_TRUE(window_state->IsMaximized());
    931   window_state->OnWMEvent(&event_right);
    932   EXPECT_FALSE(window_state->IsSnapped());
    933   EXPECT_TRUE(window_state->IsMaximized());
    934 
    935   DestroyMaximizeModeWindowManager();
    936   EXPECT_TRUE(window_state->IsSnapped());
    937 }
    938 
    939 // Check that non maximizable windows cannot be dragged by the user.
    940 TEST_F(MaximizeModeWindowManagerTest, TryToDesktopSizeDragUnmaximizable) {
    941   gfx::Rect rect(10, 10, 100, 100);
    942   scoped_ptr<aura::Window> window(
    943       CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
    944   EXPECT_EQ(rect.ToString(), window->bounds().ToString());
    945 
    946   // 1. Move the mouse over the caption and check that dragging the window does
    947   // change the location.
    948   aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
    949   generator.MoveMouseTo(gfx::Point(rect.x() + 2, rect.y() + 2));
    950   generator.PressLeftButton();
    951   generator.MoveMouseBy(10, 5);
    952   RunAllPendingInMessageLoop();
    953   generator.ReleaseLeftButton();
    954   gfx::Point first_dragged_origin = window->bounds().origin();
    955   EXPECT_EQ(rect.x() + 10, first_dragged_origin.x());
    956   EXPECT_EQ(rect.y() + 5, first_dragged_origin.y());
    957 
    958   // 2. Check that turning on the manager will stop allowing the window from
    959   // dragging.
    960   ash::Shell::GetInstance()->maximize_mode_controller()->
    961       EnableMaximizeModeWindowManager(true);
    962   gfx::Rect center_bounds(window->bounds());
    963   EXPECT_NE(rect.origin().ToString(), center_bounds.origin().ToString());
    964   generator.MoveMouseTo(gfx::Point(center_bounds.x() + 1,
    965                                    center_bounds.y() + 1));
    966   generator.PressLeftButton();
    967   generator.MoveMouseBy(10, 5);
    968   RunAllPendingInMessageLoop();
    969   generator.ReleaseLeftButton();
    970   EXPECT_EQ(center_bounds.x(), window->bounds().x());
    971   EXPECT_EQ(center_bounds.y(), window->bounds().y());
    972   ash::Shell::GetInstance()->maximize_mode_controller()->
    973       EnableMaximizeModeWindowManager(false);
    974 
    975   // 3. Releasing the mazimize manager again will restore the window to its
    976   // previous bounds and
    977   generator.MoveMouseTo(gfx::Point(first_dragged_origin.x() + 1,
    978                                    first_dragged_origin.y() + 1));
    979   generator.PressLeftButton();
    980   generator.MoveMouseBy(10, 5);
    981   RunAllPendingInMessageLoop();
    982   generator.ReleaseLeftButton();
    983   EXPECT_EQ(first_dragged_origin.x() + 10, window->bounds().x());
    984   EXPECT_EQ(first_dragged_origin.y() + 5, window->bounds().y());
    985 }
    986 
    987 // Test that overview is exited before entering / exiting maximize mode so that
    988 // the window changes made by MaximizeModeWindowManager do not conflict with
    989 // those made in WindowOverview.
    990 TEST_F(MaximizeModeWindowManagerTest, ExitsOverview) {
    991   // Bounds for windows we know can be controlled.
    992   gfx::Rect rect1(10, 10, 200, 50);
    993   gfx::Rect rect2(10, 60, 200, 50);
    994   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect1));
    995   scoped_ptr<aura::Window> w2(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect2));
    996 
    997   WindowSelectorController* window_selector_controller =
    998       Shell::GetInstance()->window_selector_controller();
    999   window_selector_controller->ToggleOverview();
   1000   ASSERT_TRUE(window_selector_controller->IsSelecting());
   1001   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
   1002   ASSERT_TRUE(manager);
   1003   EXPECT_FALSE(window_selector_controller->IsSelecting());
   1004 
   1005   window_selector_controller->ToggleOverview();
   1006   ASSERT_TRUE(window_selector_controller->IsSelecting());
   1007   // Destroy the manager again and check that the windows return to their
   1008   // previous state.
   1009   DestroyMaximizeModeWindowManager();
   1010   EXPECT_FALSE(window_selector_controller->IsSelecting());
   1011 }
   1012 
   1013 // Test that an edge swipe from the top will end full screen mode.
   1014 TEST_F(MaximizeModeWindowManagerTest, ExitFullScreenWithEdgeSwipeFromTop) {
   1015   gfx::Rect rect(10, 10, 200, 50);
   1016   scoped_ptr<aura::Window>
   1017       background_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
   1018   scoped_ptr<aura::Window>
   1019       foreground_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
   1020   wm::WindowState* background_window_state =
   1021       wm::GetWindowState(background_window.get());
   1022   wm::WindowState* foreground_window_state =
   1023       wm::GetWindowState(foreground_window.get());
   1024   wm::ActivateWindow(foreground_window.get());
   1025   CreateMaximizeModeWindowManager();
   1026 
   1027   // Fullscreen both windows.
   1028   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
   1029   background_window_state->OnWMEvent(&event);
   1030   foreground_window_state->OnWMEvent(&event);
   1031   EXPECT_TRUE(background_window_state->IsFullscreen());
   1032   EXPECT_TRUE(foreground_window_state->IsFullscreen());
   1033   EXPECT_EQ(foreground_window.get(), wm::GetActiveWindow());
   1034 
   1035   // Do an edge swipe top into screen.
   1036   aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
   1037   generator.GestureScrollSequence(gfx::Point(50, 0),
   1038                                   gfx::Point(50, 100),
   1039                                   base::TimeDelta::FromMilliseconds(20),
   1040                                   10);
   1041 
   1042   EXPECT_FALSE(foreground_window_state->IsFullscreen());
   1043   EXPECT_TRUE(background_window_state->IsFullscreen());
   1044 
   1045   // Do a second edge swipe top into screen.
   1046   generator.GestureScrollSequence(gfx::Point(50, 0),
   1047                                   gfx::Point(50, 100),
   1048                                   base::TimeDelta::FromMilliseconds(20),
   1049                                   10);
   1050 
   1051   EXPECT_FALSE(foreground_window_state->IsFullscreen());
   1052   EXPECT_TRUE(background_window_state->IsFullscreen());
   1053 
   1054   DestroyMaximizeModeWindowManager();
   1055 }
   1056 
   1057 // Test that an edge swipe from the bottom will end full screen mode.
   1058 TEST_F(MaximizeModeWindowManagerTest, ExitFullScreenWithEdgeSwipeFromBottom) {
   1059   gfx::Rect rect(10, 10, 200, 50);
   1060   scoped_ptr<aura::Window>
   1061       background_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
   1062   scoped_ptr<aura::Window>
   1063       foreground_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
   1064   wm::WindowState* background_window_state =
   1065       wm::GetWindowState(background_window.get());
   1066   wm::WindowState* foreground_window_state =
   1067       wm::GetWindowState(foreground_window.get());
   1068   wm::ActivateWindow(foreground_window.get());
   1069   CreateMaximizeModeWindowManager();
   1070 
   1071   // Fullscreen both windows.
   1072   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
   1073   background_window_state->OnWMEvent(&event);
   1074   foreground_window_state->OnWMEvent(&event);
   1075   EXPECT_TRUE(background_window_state->IsFullscreen());
   1076   EXPECT_TRUE(foreground_window_state->IsFullscreen());
   1077   EXPECT_EQ(foreground_window.get(), wm::GetActiveWindow());
   1078 
   1079   // Do an edge swipe bottom into screen.
   1080   aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
   1081   int y = Shell::GetPrimaryRootWindow()->bounds().bottom();
   1082   generator.GestureScrollSequence(gfx::Point(50, y),
   1083                                   gfx::Point(50, y - 100),
   1084                                   base::TimeDelta::FromMilliseconds(20),
   1085                                   10);
   1086 
   1087   EXPECT_FALSE(foreground_window_state->IsFullscreen());
   1088   EXPECT_TRUE(background_window_state->IsFullscreen());
   1089 
   1090   DestroyMaximizeModeWindowManager();
   1091 }
   1092 
   1093 // Test that an edge touch press at the top will end full screen mode.
   1094 TEST_F(MaximizeModeWindowManagerTest, ExitFullScreenWithEdgeTouchAtTop) {
   1095   gfx::Rect rect(10, 10, 200, 50);
   1096   scoped_ptr<aura::Window>
   1097       background_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
   1098   scoped_ptr<aura::Window>
   1099       foreground_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
   1100   wm::WindowState* background_window_state =
   1101       wm::GetWindowState(background_window.get());
   1102   wm::WindowState* foreground_window_state =
   1103       wm::GetWindowState(foreground_window.get());
   1104   wm::ActivateWindow(foreground_window.get());
   1105   CreateMaximizeModeWindowManager();
   1106 
   1107   // Fullscreen both windows.
   1108   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
   1109   background_window_state->OnWMEvent(&event);
   1110   foreground_window_state->OnWMEvent(&event);
   1111   EXPECT_TRUE(background_window_state->IsFullscreen());
   1112   EXPECT_TRUE(foreground_window_state->IsFullscreen());
   1113   EXPECT_EQ(foreground_window.get(), wm::GetActiveWindow());
   1114 
   1115   // Touch tap on the top edge.
   1116   aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
   1117   generator.GestureTapAt(gfx::Point(100, 0));
   1118   EXPECT_FALSE(foreground_window_state->IsFullscreen());
   1119   EXPECT_TRUE(background_window_state->IsFullscreen());
   1120 
   1121   // Try the same again and see that nothing changes.
   1122   generator.GestureTapAt(gfx::Point(100, 0));
   1123   EXPECT_FALSE(foreground_window_state->IsFullscreen());
   1124   EXPECT_TRUE(background_window_state->IsFullscreen());
   1125 
   1126   DestroyMaximizeModeWindowManager();
   1127 }
   1128 
   1129 // Test that an edge touch press at the bottom will end full screen mode.
   1130 TEST_F(MaximizeModeWindowManagerTest, ExitFullScreenWithEdgeTouchAtBottom) {
   1131   gfx::Rect rect(10, 10, 200, 50);
   1132   scoped_ptr<aura::Window>
   1133       background_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
   1134   scoped_ptr<aura::Window>
   1135       foreground_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
   1136   wm::WindowState* background_window_state =
   1137       wm::GetWindowState(background_window.get());
   1138   wm::WindowState* foreground_window_state =
   1139       wm::GetWindowState(foreground_window.get());
   1140   wm::ActivateWindow(foreground_window.get());
   1141   CreateMaximizeModeWindowManager();
   1142 
   1143   // Fullscreen both windows.
   1144   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
   1145   background_window_state->OnWMEvent(&event);
   1146   foreground_window_state->OnWMEvent(&event);
   1147   EXPECT_TRUE(background_window_state->IsFullscreen());
   1148   EXPECT_TRUE(foreground_window_state->IsFullscreen());
   1149   EXPECT_EQ(foreground_window.get(), wm::GetActiveWindow());
   1150 
   1151   // Touch tap on the bottom edge.
   1152   aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
   1153   generator.GestureTapAt(
   1154       gfx::Point(100, Shell::GetPrimaryRootWindow()->bounds().bottom() - 1));
   1155   EXPECT_FALSE(foreground_window_state->IsFullscreen());
   1156   EXPECT_TRUE(background_window_state->IsFullscreen());
   1157 
   1158   // Try the same again and see that nothing changes.
   1159   generator.GestureTapAt(
   1160       gfx::Point(100, Shell::GetPrimaryRootWindow()->bounds().bottom() - 1));
   1161   EXPECT_FALSE(foreground_window_state->IsFullscreen());
   1162   EXPECT_TRUE(background_window_state->IsFullscreen());
   1163 
   1164   DestroyMaximizeModeWindowManager();
   1165 }
   1166 
   1167 // Test that an edge swipe from the top on an immersive mode window will not end
   1168 // full screen mode.
   1169 TEST_F(MaximizeModeWindowManagerTest, NoExitImmersiveModeWithEdgeSwipeFromTop) {
   1170   scoped_ptr<aura::Window> window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL,
   1171                                   gfx::Rect(10, 10, 200, 50)));
   1172   wm::WindowState* window_state = wm::GetWindowState(window.get());
   1173   wm::ActivateWindow(window.get());
   1174   CreateMaximizeModeWindowManager();
   1175 
   1176   // Fullscreen the window.
   1177   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
   1178   window_state->OnWMEvent(&event);
   1179   EXPECT_TRUE(window_state->IsFullscreen());
   1180   EXPECT_FALSE(window_state->in_immersive_fullscreen());
   1181   EXPECT_EQ(window.get(), wm::GetActiveWindow());
   1182 
   1183   window_state->set_in_immersive_fullscreen(true);
   1184 
   1185   // Do an edge swipe top into screen.
   1186   aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
   1187   generator.GestureScrollSequence(gfx::Point(50, 0),
   1188                                   gfx::Point(50, 100),
   1189                                   base::TimeDelta::FromMilliseconds(20),
   1190                                   10);
   1191 
   1192   // It should have not exited full screen or immersive mode.
   1193   EXPECT_TRUE(window_state->IsFullscreen());
   1194   EXPECT_TRUE(window_state->in_immersive_fullscreen());
   1195 
   1196   DestroyMaximizeModeWindowManager();
   1197 }
   1198 
   1199 // Test that an edge swipe from the bottom will not end immersive mode.
   1200 TEST_F(MaximizeModeWindowManagerTest,
   1201        NoExitImmersiveModeWithEdgeSwipeFromBottom) {
   1202   scoped_ptr<aura::Window> window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL,
   1203                                                gfx::Rect(10, 10, 200, 50)));
   1204   wm::WindowState* window_state = wm::GetWindowState(window.get());
   1205   wm::ActivateWindow(window.get());
   1206   CreateMaximizeModeWindowManager();
   1207 
   1208   // Fullscreen the window.
   1209   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
   1210   window_state->OnWMEvent(&event);
   1211   EXPECT_TRUE(window_state->IsFullscreen());
   1212   EXPECT_FALSE(window_state->in_immersive_fullscreen());
   1213   EXPECT_EQ(window.get(), wm::GetActiveWindow());
   1214   window_state->set_in_immersive_fullscreen(true);
   1215   EXPECT_TRUE(window_state->in_immersive_fullscreen());
   1216 
   1217   // Do an edge swipe bottom into screen.
   1218   aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
   1219   int y = Shell::GetPrimaryRootWindow()->bounds().bottom();
   1220   generator.GestureScrollSequence(gfx::Point(50, y),
   1221                                   gfx::Point(50, y - 100),
   1222                                   base::TimeDelta::FromMilliseconds(20),
   1223                                   10);
   1224 
   1225   // The window should still be full screen and immersive.
   1226   EXPECT_TRUE(window_state->IsFullscreen());
   1227   EXPECT_TRUE(window_state->in_immersive_fullscreen());
   1228 
   1229   DestroyMaximizeModeWindowManager();
   1230 }
   1231 
   1232 #endif  // OS_WIN
   1233 
   1234 }  // namespace ash
   1235