8dc55753fa05199c49bea8da3d535fa8f09ff4de
[platform/framework/web/crosswalk.git] / src / ash / wm / maximize_mode / maximize_mode_window_manager_unittest.cc
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