1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "ash/shell_window_ids.h"
7 #include "ash/test/ash_test_base.h"
8 #include "ash/test/test_shelf_delegate.h"
9 #include "ash/wm/mru_window_tracker.h"
10 #include "ash/wm/window_state.h"
11 #include "ash/wm/window_util.h"
12 #include "base/compiler_specific.h"
13 #include "ui/aura/test/test_window_delegate.h"
14 #include "ui/aura/window.h"
15 #include "ui/base/hit_test.h"
16 #include "ui/views/widget/widget.h"
20 class MruWindowTrackerTest
: public test::AshTestBase
{
22 MruWindowTrackerTest() {}
23 ~MruWindowTrackerTest() override
{}
25 aura::Window
* CreateWindow() {
26 return CreateTestWindowInShellWithBounds(gfx::Rect(0, 0, 400, 400));
29 ash::MruWindowTracker
* mru_window_tracker() {
30 return Shell::GetInstance()->mru_window_tracker();
34 DISALLOW_COPY_AND_ASSIGN(MruWindowTrackerTest
);
37 // Basic test that the activation order is tracked.
38 TEST_F(MruWindowTrackerTest
, Basic
) {
39 scoped_ptr
<aura::Window
> w1(CreateWindow());
40 scoped_ptr
<aura::Window
> w2(CreateWindow());
41 scoped_ptr
<aura::Window
> w3(CreateWindow());
42 wm::ActivateWindow(w3
.get());
43 wm::ActivateWindow(w2
.get());
44 wm::ActivateWindow(w1
.get());
46 MruWindowTracker::WindowList window_list
=
47 mru_window_tracker()->BuildMruWindowList();
48 EXPECT_EQ(w1
.get(), window_list
[0]);
49 EXPECT_EQ(w2
.get(), window_list
[1]);
50 EXPECT_EQ(w3
.get(), window_list
[2]);
53 // Test that minimized windows are considered least recently used (but kept in
54 // correct relative order).
55 TEST_F(MruWindowTrackerTest
, MinimizedWindowsAreLru
) {
56 scoped_ptr
<aura::Window
> w1(CreateWindow());
57 scoped_ptr
<aura::Window
> w2(CreateWindow());
58 scoped_ptr
<aura::Window
> w3(CreateWindow());
59 scoped_ptr
<aura::Window
> w4(CreateWindow());
60 scoped_ptr
<aura::Window
> w5(CreateWindow());
61 scoped_ptr
<aura::Window
> w6(CreateWindow());
62 wm::ActivateWindow(w6
.get());
63 wm::ActivateWindow(w5
.get());
64 wm::ActivateWindow(w4
.get());
65 wm::ActivateWindow(w3
.get());
66 wm::ActivateWindow(w2
.get());
67 wm::ActivateWindow(w1
.get());
69 wm::GetWindowState(w1
.get())->Minimize();
70 wm::GetWindowState(w4
.get())->Minimize();
71 wm::GetWindowState(w5
.get())->Minimize();
73 // Expect the relative order of minimized windows to remain the same, but all
74 // minimized windows to be at the end of the list.
75 MruWindowTracker::WindowList window_list
=
76 mru_window_tracker()->BuildMruWindowList();
77 EXPECT_EQ(w2
.get(), window_list
[0]);
78 EXPECT_EQ(w3
.get(), window_list
[1]);
79 EXPECT_EQ(w6
.get(), window_list
[2]);
80 EXPECT_EQ(w1
.get(), window_list
[3]);
81 EXPECT_EQ(w4
.get(), window_list
[4]);
82 EXPECT_EQ(w5
.get(), window_list
[5]);
85 // Tests that windows being dragged are only in the WindowList once.
86 TEST_F(MruWindowTrackerTest
, DraggedWindowsInListOnlyOnce
) {
87 scoped_ptr
<aura::Window
> w1(CreateWindow());
88 wm::ActivateWindow(w1
.get());
90 // Start dragging the window.
91 wm::GetWindowState(w1
.get())->CreateDragDetails(
92 w1
.get(), gfx::Point(), HTRIGHT
, aura::client::WINDOW_MOVE_SOURCE_TOUCH
);
94 // During a drag the window is reparented by the Docked container.
95 aura::Window
* drag_container
= Shell::GetContainer(
96 Shell::GetTargetRootWindow(), kShellWindowId_DockedContainer
);
97 drag_container
->AddChild(w1
.get());
98 EXPECT_TRUE(wm::GetWindowState(w1
.get())->is_dragged());
100 // The dragged window should only be in the list once.
101 MruWindowTracker::WindowList window_list
=
102 mru_window_tracker()->BuildWindowListIgnoreModal();
103 EXPECT_EQ(1, std::count(window_list
.begin(), window_list
.end(), w1
.get()));