986d041da11a1a2e511c4cb534db032f87da0be1
[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/test_window_delegate.h"
28 #include "ui/aura/test/test_windows.h"
29 #include "ui/aura/window.h"
30 #include "ui/base/hit_test.h"
31 #include "ui/events/test/event_generator.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 maintain its state from before maximize mode.
796   window_state->OnWMEvent(&event);
797   EXPECT_FALSE(window_state->IsFullscreen());
798   EXPECT_TRUE(window_state->IsMaximized());
799   EXPECT_EQ(SHELF_AUTO_HIDE, 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 maintain its
829   // state.
830   EXPECT_FALSE(window_state->IsFullscreen());
831   EXPECT_TRUE(window_state->IsMaximized());
832   EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
833
834   // After going into fullscreen mode, the shelf should be hidden.
835   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
836   window_state->OnWMEvent(&event);
837   EXPECT_TRUE(window_state->IsFullscreen());
838   EXPECT_FALSE(window_state->IsMaximized());
839   EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
840
841   // With the destruction of the manager we should remain in full screen.
842   DestroyMaximizeModeWindowManager();
843   EXPECT_TRUE(window_state->IsFullscreen());
844   EXPECT_FALSE(window_state->IsMaximized());
845   EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
846 }
847
848 // Check that the full screen mode will stay active when the maximize mode is
849 // ended.
850 TEST_F(MaximizeModeWindowManagerTest,
851        FullScreenModeRemainsWhenCreatedInMaximizedMode) {
852   CreateMaximizeModeWindowManager();
853
854   gfx::Rect rect(20, 140, 100, 100);
855   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
856   wm::WindowState* window_state = wm::GetWindowState(w1.get());
857   wm::WMEvent event_full_screen(wm::WM_EVENT_TOGGLE_FULLSCREEN);
858   window_state->OnWMEvent(&event_full_screen);
859   EXPECT_TRUE(window_state->IsFullscreen());
860
861   // After the maximize mode manager is ended, full screen will remain.
862   DestroyMaximizeModeWindowManager();
863   EXPECT_TRUE(window_state->IsFullscreen());
864 }
865
866 // Check that the full screen mode will stay active throughout a maximzied mode
867 // session.
868 TEST_F(MaximizeModeWindowManagerTest,
869        FullScreenModeRemainsThroughMaximizeModeSwitch) {
870   gfx::Rect rect(20, 140, 100, 100);
871   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
872   wm::WindowState* window_state = wm::GetWindowState(w1.get());
873   wm::WMEvent event_full_screen(wm::WM_EVENT_TOGGLE_FULLSCREEN);
874   window_state->OnWMEvent(&event_full_screen);
875   EXPECT_TRUE(window_state->IsFullscreen());
876
877   CreateMaximizeModeWindowManager();
878   EXPECT_TRUE(window_state->IsFullscreen());
879   DestroyMaximizeModeWindowManager();
880   EXPECT_TRUE(window_state->IsFullscreen());
881 }
882
883 // Check that an empty window does not get restored to a tiny size.
884 TEST_F(MaximizeModeWindowManagerTest,
885        CreateAndMaximizeInMaximizeModeShouldRetoreToGoodSizeGoingToDefault) {
886   CreateMaximizeModeWindowManager();
887   gfx::Rect rect;
888   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
889   w1->Show();
890   wm::WindowState* window_state = wm::GetWindowState(w1.get());
891   EXPECT_TRUE(window_state->IsMaximized());
892
893   // There is a calling order in which the restore bounds can get set to an
894   // empty rectangle. We simulate this here.
895   window_state->SetRestoreBoundsInScreen(rect);
896   EXPECT_TRUE(window_state->GetRestoreBoundsInScreen().IsEmpty());
897
898   // Setting the window to a new size will physically not change the window,
899   // but the restore size should get updated so that a restore later on will
900   // return to this size.
901   gfx::Rect requested_bounds(10, 20, 50, 70);
902   w1->SetBounds(requested_bounds);
903   EXPECT_TRUE(window_state->IsMaximized());
904   EXPECT_EQ(requested_bounds.ToString(),
905             window_state->GetRestoreBoundsInScreen().ToString());
906
907   DestroyMaximizeModeWindowManager();
908
909   EXPECT_FALSE(window_state->IsMaximized());
910   EXPECT_EQ(w1->bounds().ToString(), requested_bounds.ToString());
911 }
912
913 // Check that snapping operations get ignored.
914 TEST_F(MaximizeModeWindowManagerTest, SnapModeTests) {
915   gfx::Rect rect(20, 140, 100, 100);
916   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
917   wm::WindowState* window_state = wm::GetWindowState(w1.get());
918   wm::WMEvent event_left(wm::WM_EVENT_SNAP_LEFT);
919   wm::WMEvent event_right(wm::WM_EVENT_SNAP_RIGHT);
920   window_state->OnWMEvent(&event_left);
921   EXPECT_TRUE(window_state->IsSnapped());
922
923   CreateMaximizeModeWindowManager();
924
925   // Fullscreen mode should now be off and it should not come back while in
926   // maximize mode.
927   EXPECT_FALSE(window_state->IsSnapped());
928   EXPECT_TRUE(window_state->IsMaximized());
929   window_state->OnWMEvent(&event_left);
930   EXPECT_FALSE(window_state->IsSnapped());
931   EXPECT_TRUE(window_state->IsMaximized());
932   window_state->OnWMEvent(&event_right);
933   EXPECT_FALSE(window_state->IsSnapped());
934   EXPECT_TRUE(window_state->IsMaximized());
935
936   DestroyMaximizeModeWindowManager();
937   EXPECT_TRUE(window_state->IsSnapped());
938 }
939
940 // Check that non maximizable windows cannot be dragged by the user.
941 TEST_F(MaximizeModeWindowManagerTest, TryToDesktopSizeDragUnmaximizable) {
942   gfx::Rect rect(10, 10, 100, 100);
943   scoped_ptr<aura::Window> window(
944       CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
945   EXPECT_EQ(rect.ToString(), window->bounds().ToString());
946
947   // 1. Move the mouse over the caption and check that dragging the window does
948   // change the location.
949   ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
950   generator.MoveMouseTo(gfx::Point(rect.x() + 2, rect.y() + 2));
951   generator.PressLeftButton();
952   generator.MoveMouseBy(10, 5);
953   RunAllPendingInMessageLoop();
954   generator.ReleaseLeftButton();
955   gfx::Point first_dragged_origin = window->bounds().origin();
956   EXPECT_EQ(rect.x() + 10, first_dragged_origin.x());
957   EXPECT_EQ(rect.y() + 5, first_dragged_origin.y());
958
959   // 2. Check that turning on the manager will stop allowing the window from
960   // dragging.
961   ash::Shell::GetInstance()->maximize_mode_controller()->
962       EnableMaximizeModeWindowManager(true);
963   gfx::Rect center_bounds(window->bounds());
964   EXPECT_NE(rect.origin().ToString(), center_bounds.origin().ToString());
965   generator.MoveMouseTo(gfx::Point(center_bounds.x() + 1,
966                                    center_bounds.y() + 1));
967   generator.PressLeftButton();
968   generator.MoveMouseBy(10, 5);
969   RunAllPendingInMessageLoop();
970   generator.ReleaseLeftButton();
971   EXPECT_EQ(center_bounds.x(), window->bounds().x());
972   EXPECT_EQ(center_bounds.y(), window->bounds().y());
973   ash::Shell::GetInstance()->maximize_mode_controller()->
974       EnableMaximizeModeWindowManager(false);
975
976   // 3. Releasing the mazimize manager again will restore the window to its
977   // previous bounds and
978   generator.MoveMouseTo(gfx::Point(first_dragged_origin.x() + 1,
979                                    first_dragged_origin.y() + 1));
980   generator.PressLeftButton();
981   generator.MoveMouseBy(10, 5);
982   RunAllPendingInMessageLoop();
983   generator.ReleaseLeftButton();
984   EXPECT_EQ(first_dragged_origin.x() + 10, window->bounds().x());
985   EXPECT_EQ(first_dragged_origin.y() + 5, window->bounds().y());
986 }
987
988 // Test that overview is exited before entering / exiting maximize mode so that
989 // the window changes made by MaximizeModeWindowManager do not conflict with
990 // those made in WindowOverview.
991 TEST_F(MaximizeModeWindowManagerTest, ExitsOverview) {
992   // Bounds for windows we know can be controlled.
993   gfx::Rect rect1(10, 10, 200, 50);
994   gfx::Rect rect2(10, 60, 200, 50);
995   scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect1));
996   scoped_ptr<aura::Window> w2(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect2));
997
998   WindowSelectorController* window_selector_controller =
999       Shell::GetInstance()->window_selector_controller();
1000   window_selector_controller->ToggleOverview();
1001   ASSERT_TRUE(window_selector_controller->IsSelecting());
1002   ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
1003   ASSERT_TRUE(manager);
1004   EXPECT_FALSE(window_selector_controller->IsSelecting());
1005
1006   window_selector_controller->ToggleOverview();
1007   ASSERT_TRUE(window_selector_controller->IsSelecting());
1008   // Destroy the manager again and check that the windows return to their
1009   // previous state.
1010   DestroyMaximizeModeWindowManager();
1011   EXPECT_FALSE(window_selector_controller->IsSelecting());
1012 }
1013
1014 // Test that an edge swipe from the top will end full screen mode.
1015 TEST_F(MaximizeModeWindowManagerTest, ExitFullScreenWithEdgeSwipeFromTop) {
1016   gfx::Rect rect(10, 10, 200, 50);
1017   scoped_ptr<aura::Window>
1018       background_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
1019   scoped_ptr<aura::Window>
1020       foreground_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
1021   wm::WindowState* background_window_state =
1022       wm::GetWindowState(background_window.get());
1023   wm::WindowState* foreground_window_state =
1024       wm::GetWindowState(foreground_window.get());
1025   wm::ActivateWindow(foreground_window.get());
1026   CreateMaximizeModeWindowManager();
1027
1028   // Fullscreen both windows.
1029   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
1030   background_window_state->OnWMEvent(&event);
1031   foreground_window_state->OnWMEvent(&event);
1032   EXPECT_TRUE(background_window_state->IsFullscreen());
1033   EXPECT_TRUE(foreground_window_state->IsFullscreen());
1034   EXPECT_EQ(foreground_window.get(), wm::GetActiveWindow());
1035
1036   // Do an edge swipe top into screen.
1037   ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
1038   generator.GestureScrollSequence(gfx::Point(50, 0),
1039                                   gfx::Point(50, 100),
1040                                   base::TimeDelta::FromMilliseconds(20),
1041                                   10);
1042
1043   EXPECT_FALSE(foreground_window_state->IsFullscreen());
1044   EXPECT_TRUE(background_window_state->IsFullscreen());
1045
1046   // Do a second edge swipe top into screen.
1047   generator.GestureScrollSequence(gfx::Point(50, 0),
1048                                   gfx::Point(50, 100),
1049                                   base::TimeDelta::FromMilliseconds(20),
1050                                   10);
1051
1052   EXPECT_FALSE(foreground_window_state->IsFullscreen());
1053   EXPECT_TRUE(background_window_state->IsFullscreen());
1054
1055   DestroyMaximizeModeWindowManager();
1056 }
1057
1058 // Test that an edge swipe from the bottom will end full screen mode.
1059 TEST_F(MaximizeModeWindowManagerTest, ExitFullScreenWithEdgeSwipeFromBottom) {
1060   gfx::Rect rect(10, 10, 200, 50);
1061   scoped_ptr<aura::Window>
1062       background_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
1063   scoped_ptr<aura::Window>
1064       foreground_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
1065   wm::WindowState* background_window_state =
1066       wm::GetWindowState(background_window.get());
1067   wm::WindowState* foreground_window_state =
1068       wm::GetWindowState(foreground_window.get());
1069   wm::ActivateWindow(foreground_window.get());
1070   CreateMaximizeModeWindowManager();
1071
1072   // Fullscreen both windows.
1073   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
1074   background_window_state->OnWMEvent(&event);
1075   foreground_window_state->OnWMEvent(&event);
1076   EXPECT_TRUE(background_window_state->IsFullscreen());
1077   EXPECT_TRUE(foreground_window_state->IsFullscreen());
1078   EXPECT_EQ(foreground_window.get(), wm::GetActiveWindow());
1079
1080   // Do an edge swipe bottom into screen.
1081   ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
1082   int y = Shell::GetPrimaryRootWindow()->bounds().bottom();
1083   generator.GestureScrollSequence(gfx::Point(50, y),
1084                                   gfx::Point(50, y - 100),
1085                                   base::TimeDelta::FromMilliseconds(20),
1086                                   10);
1087
1088   EXPECT_FALSE(foreground_window_state->IsFullscreen());
1089   EXPECT_TRUE(background_window_state->IsFullscreen());
1090
1091   DestroyMaximizeModeWindowManager();
1092 }
1093
1094 // Test that an edge touch press at the top will end full screen mode.
1095 TEST_F(MaximizeModeWindowManagerTest, ExitFullScreenWithEdgeTouchAtTop) {
1096   gfx::Rect rect(10, 10, 200, 50);
1097   scoped_ptr<aura::Window>
1098       background_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
1099   scoped_ptr<aura::Window>
1100       foreground_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
1101   wm::WindowState* background_window_state =
1102       wm::GetWindowState(background_window.get());
1103   wm::WindowState* foreground_window_state =
1104       wm::GetWindowState(foreground_window.get());
1105   wm::ActivateWindow(foreground_window.get());
1106   CreateMaximizeModeWindowManager();
1107
1108   // Fullscreen both windows.
1109   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
1110   background_window_state->OnWMEvent(&event);
1111   foreground_window_state->OnWMEvent(&event);
1112   EXPECT_TRUE(background_window_state->IsFullscreen());
1113   EXPECT_TRUE(foreground_window_state->IsFullscreen());
1114   EXPECT_EQ(foreground_window.get(), wm::GetActiveWindow());
1115
1116   // Touch tap on the top edge.
1117   ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
1118   generator.GestureTapAt(gfx::Point(100, 0));
1119   EXPECT_FALSE(foreground_window_state->IsFullscreen());
1120   EXPECT_TRUE(background_window_state->IsFullscreen());
1121
1122   // Try the same again and see that nothing changes.
1123   generator.GestureTapAt(gfx::Point(100, 0));
1124   EXPECT_FALSE(foreground_window_state->IsFullscreen());
1125   EXPECT_TRUE(background_window_state->IsFullscreen());
1126
1127   DestroyMaximizeModeWindowManager();
1128 }
1129
1130 // Test that an edge touch press at the bottom will end full screen mode.
1131 TEST_F(MaximizeModeWindowManagerTest, ExitFullScreenWithEdgeTouchAtBottom) {
1132   gfx::Rect rect(10, 10, 200, 50);
1133   scoped_ptr<aura::Window>
1134       background_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
1135   scoped_ptr<aura::Window>
1136       foreground_window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect));
1137   wm::WindowState* background_window_state =
1138       wm::GetWindowState(background_window.get());
1139   wm::WindowState* foreground_window_state =
1140       wm::GetWindowState(foreground_window.get());
1141   wm::ActivateWindow(foreground_window.get());
1142   CreateMaximizeModeWindowManager();
1143
1144   // Fullscreen both windows.
1145   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
1146   background_window_state->OnWMEvent(&event);
1147   foreground_window_state->OnWMEvent(&event);
1148   EXPECT_TRUE(background_window_state->IsFullscreen());
1149   EXPECT_TRUE(foreground_window_state->IsFullscreen());
1150   EXPECT_EQ(foreground_window.get(), wm::GetActiveWindow());
1151
1152   // Touch tap on the bottom edge.
1153   ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
1154   generator.GestureTapAt(
1155       gfx::Point(100, Shell::GetPrimaryRootWindow()->bounds().bottom() - 1));
1156   EXPECT_FALSE(foreground_window_state->IsFullscreen());
1157   EXPECT_TRUE(background_window_state->IsFullscreen());
1158
1159   // Try the same again and see that nothing changes.
1160   generator.GestureTapAt(
1161       gfx::Point(100, Shell::GetPrimaryRootWindow()->bounds().bottom() - 1));
1162   EXPECT_FALSE(foreground_window_state->IsFullscreen());
1163   EXPECT_TRUE(background_window_state->IsFullscreen());
1164
1165   DestroyMaximizeModeWindowManager();
1166 }
1167
1168 // Test that an edge swipe from the top on an immersive mode window will not end
1169 // full screen mode.
1170 TEST_F(MaximizeModeWindowManagerTest, NoExitImmersiveModeWithEdgeSwipeFromTop) {
1171   scoped_ptr<aura::Window> window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL,
1172                                   gfx::Rect(10, 10, 200, 50)));
1173   wm::WindowState* window_state = wm::GetWindowState(window.get());
1174   wm::ActivateWindow(window.get());
1175   CreateMaximizeModeWindowManager();
1176
1177   // Fullscreen the window.
1178   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
1179   window_state->OnWMEvent(&event);
1180   EXPECT_TRUE(window_state->IsFullscreen());
1181   EXPECT_FALSE(window_state->in_immersive_fullscreen());
1182   EXPECT_EQ(window.get(), wm::GetActiveWindow());
1183
1184   window_state->set_in_immersive_fullscreen(true);
1185
1186   // Do an edge swipe top into screen.
1187   ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
1188   generator.GestureScrollSequence(gfx::Point(50, 0),
1189                                   gfx::Point(50, 100),
1190                                   base::TimeDelta::FromMilliseconds(20),
1191                                   10);
1192
1193   // It should have not exited full screen or immersive mode.
1194   EXPECT_TRUE(window_state->IsFullscreen());
1195   EXPECT_TRUE(window_state->in_immersive_fullscreen());
1196
1197   DestroyMaximizeModeWindowManager();
1198 }
1199
1200 // Test that an edge swipe from the bottom will not end immersive mode.
1201 TEST_F(MaximizeModeWindowManagerTest,
1202        NoExitImmersiveModeWithEdgeSwipeFromBottom) {
1203   scoped_ptr<aura::Window> window(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL,
1204                                                gfx::Rect(10, 10, 200, 50)));
1205   wm::WindowState* window_state = wm::GetWindowState(window.get());
1206   wm::ActivateWindow(window.get());
1207   CreateMaximizeModeWindowManager();
1208
1209   // Fullscreen the window.
1210   wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
1211   window_state->OnWMEvent(&event);
1212   EXPECT_TRUE(window_state->IsFullscreen());
1213   EXPECT_FALSE(window_state->in_immersive_fullscreen());
1214   EXPECT_EQ(window.get(), wm::GetActiveWindow());
1215   window_state->set_in_immersive_fullscreen(true);
1216   EXPECT_TRUE(window_state->in_immersive_fullscreen());
1217
1218   // Do an edge swipe bottom into screen.
1219   ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
1220   int y = Shell::GetPrimaryRootWindow()->bounds().bottom();
1221   generator.GestureScrollSequence(gfx::Point(50, y),
1222                                   gfx::Point(50, y - 100),
1223                                   base::TimeDelta::FromMilliseconds(20),
1224                                   10);
1225
1226   // The window should still be full screen and immersive.
1227   EXPECT_TRUE(window_state->IsFullscreen());
1228   EXPECT_TRUE(window_state->in_immersive_fullscreen());
1229
1230   DestroyMaximizeModeWindowManager();
1231 }
1232
1233 #endif  // OS_WIN
1234
1235 }  // namespace ash