OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "athena/wm/window_list_provider_impl.h" | 5 #include "athena/wm/window_list_provider_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "athena/test/athena_test_base.h" | 9 #include "athena/test/athena_test_base.h" |
10 #include "athena/wm/public/window_list_provider_observer.h" | |
10 #include "ui/aura/test/test_window_delegate.h" | 11 #include "ui/aura/test/test_window_delegate.h" |
11 #include "ui/aura/window.h" | 12 #include "ui/aura/window.h" |
12 | 13 |
13 namespace athena { | 14 namespace athena { |
14 | 15 |
15 namespace { | 16 namespace { |
16 | 17 |
17 bool AreWindowListsEqual(const aura::Window::Windows& one, | 18 bool AreWindowListsEqual(const aura::Window::Windows& one, |
18 const aura::Window::Windows& two) { | 19 const aura::Window::Windows& two) { |
19 return one.size() == two.size() && | 20 return one.size() == two.size() && |
20 std::equal(one.begin(), one.end(), two.begin()); | 21 std::equal(one.begin(), one.end(), two.begin()); |
21 } | 22 } |
22 | 23 |
23 scoped_ptr<aura::Window> CreateWindow(aura::WindowDelegate* delegate, | 24 scoped_ptr<aura::Window> CreateWindow(aura::WindowDelegate* delegate, |
24 ui::wm::WindowType window_type) { | 25 ui::wm::WindowType window_type) { |
25 scoped_ptr<aura::Window> window(new aura::Window(delegate)); | 26 scoped_ptr<aura::Window> window(new aura::Window(delegate)); |
26 window->SetType(window_type); | 27 window->SetType(window_type); |
27 window->Init(aura::WINDOW_LAYER_SOLID_COLOR); | 28 window->Init(aura::WINDOW_LAYER_SOLID_COLOR); |
28 return window.Pass(); | 29 return window.Pass(); |
29 } | 30 } |
30 | 31 |
32 // Return a string which defines the order of windows in |now| using the indices | |
33 // of |original|. The string will then have the lowest/oldest window on the left | |
34 // and the highest / newest on the right. | |
35 std::string GetWindowOrder(const aura::Window::Windows& original, | |
36 const aura::Window::Windows& now) { | |
37 if (original.size() != now.size()) | |
38 return "size has changed."; | |
39 std::string output; | |
40 for (aura::Window::Windows::const_iterator it = now.begin(); | |
41 it != now.end(); ++it) { | |
42 for (size_t i = 0; i < original.size(); i++) { | |
43 if ((*it) == original[i]) { | |
44 output += (output.size() ? " " : "") + std::to_string(i + 1); | |
oshima
2014/09/09 18:28:38
s/""/std::string()/
Mr4D (OOO till 08-26)
2014/09/10 00:01:58
Done.
| |
45 break; | |
46 } | |
47 } | |
48 } | |
49 return output; | |
50 } | |
51 | |
52 class WindowListObserver : public WindowListProviderObserver { | |
53 public: | |
54 WindowListObserver(WindowListProvider* provider) : calls_(0), | |
oshima
2014/09/09 18:28:37
explicit
Mr4D (OOO till 08-26)
2014/09/10 00:01:58
Done.
| |
55 provider_(provider) { | |
56 provider_->AddObserver(this); | |
57 } | |
58 virtual ~WindowListObserver() { | |
59 provider_->RemoveObserver(this); | |
60 } | |
61 | |
62 int calls() const { return calls_; } | |
63 | |
64 // WindowListProviderObserver: | |
65 virtual void OnActivityStackingChanged() OVERRIDE { | |
66 calls_++; | |
67 } | |
68 | |
69 private: | |
70 // The number of calls to the observer. | |
71 int calls_; | |
72 | |
73 // The associated WindowListProvider which is observed. | |
74 WindowListProvider* provider_; | |
75 | |
76 DISALLOW_COPY_AND_ASSIGN(WindowListObserver); | |
77 }; | |
78 | |
79 | |
31 } // namespace | 80 } // namespace |
32 | 81 |
33 typedef test::AthenaTestBase WindowListProviderImplTest; | 82 typedef test::AthenaTestBase WindowListProviderImplTest; |
34 | 83 |
35 // Tests that the order of windows match the stacking order of the windows in | 84 // Tests that the order of windows match the stacking order of the windows in |
36 // the container, even after the order is changed through the aura Window API. | 85 // the container, even after the order is changed through the aura Window API. |
37 TEST_F(WindowListProviderImplTest, StackingOrder) { | 86 TEST_F(WindowListProviderImplTest, StackingOrder) { |
38 aura::test::TestWindowDelegate delegate; | 87 aura::test::TestWindowDelegate delegate; |
39 scoped_ptr<aura::Window> container(new aura::Window(&delegate)); | 88 scoped_ptr<aura::Window> container(new aura::Window(&delegate)); |
40 scoped_ptr<aura::Window> first = | 89 scoped_ptr<aura::Window> first = |
41 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); | 90 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); |
42 scoped_ptr<aura::Window> second = | 91 scoped_ptr<aura::Window> second = |
43 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); | 92 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); |
44 scoped_ptr<aura::Window> third = | 93 scoped_ptr<aura::Window> third = |
45 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); | 94 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); |
46 container->AddChild(first.get()); | 95 container->AddChild(first.get()); |
47 container->AddChild(second.get()); | 96 container->AddChild(second.get()); |
48 container->AddChild(third.get()); | 97 container->AddChild(third.get()); |
49 | 98 |
50 scoped_ptr<WindowListProvider> list_provider( | 99 scoped_ptr<WindowListProvider> list_provider( |
51 new WindowListProviderImpl(container.get())); | 100 new WindowListProviderImpl(container.get())); |
52 EXPECT_TRUE(AreWindowListsEqual(container->children(), | 101 EXPECT_TRUE(AreWindowListsEqual(container->children(), |
53 list_provider->GetWindowList())); | 102 list_provider->GetCurrentWindowList())); |
54 | 103 |
55 container->StackChildAtTop(first.get()); | 104 container->StackChildAtTop(first.get()); |
56 EXPECT_TRUE(AreWindowListsEqual(container->children(), | 105 EXPECT_TRUE(AreWindowListsEqual(container->children(), |
57 list_provider->GetWindowList())); | 106 list_provider->GetCurrentWindowList())); |
58 EXPECT_EQ(first.get(), container->children().back()); | 107 EXPECT_EQ(first.get(), container->children().back()); |
59 } | 108 } |
60 | 109 |
110 // Tests that only normal windows of the associated container will be listed. | |
61 TEST_F(WindowListProviderImplTest, ListContainsOnlyNormalWindows) { | 111 TEST_F(WindowListProviderImplTest, ListContainsOnlyNormalWindows) { |
62 aura::test::TestWindowDelegate delegate; | 112 aura::test::TestWindowDelegate delegate; |
63 scoped_ptr<aura::Window> container(new aura::Window(&delegate)); | 113 scoped_ptr<aura::Window> container(new aura::Window(&delegate)); |
64 scoped_ptr<aura::Window> first = | 114 scoped_ptr<aura::Window> first = |
65 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); | 115 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); |
66 scoped_ptr<aura::Window> second = | 116 scoped_ptr<aura::Window> second = |
67 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_POPUP); | 117 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_POPUP); |
68 scoped_ptr<aura::Window> third = | 118 scoped_ptr<aura::Window> third = |
69 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); | 119 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); |
70 scoped_ptr<aura::Window> fourth = | 120 scoped_ptr<aura::Window> fourth = |
71 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_MENU); | 121 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_MENU); |
72 container->AddChild(first.get()); | 122 container->AddChild(first.get()); |
73 container->AddChild(second.get()); | 123 container->AddChild(second.get()); |
74 container->AddChild(third.get()); | 124 container->AddChild(third.get()); |
75 container->AddChild(fourth.get()); | 125 container->AddChild(fourth.get()); |
76 | 126 |
77 scoped_ptr<WindowListProvider> list_provider( | 127 scoped_ptr<WindowListProvider> list_provider( |
78 new WindowListProviderImpl(container.get())); | 128 new WindowListProviderImpl(container.get())); |
79 const aura::Window::Windows list = list_provider->GetWindowList(); | 129 |
130 const aura::Window::Windows list = list_provider->GetCurrentWindowList(); | |
80 EXPECT_EQ(list.end(), std::find(list.begin(), list.end(), second.get())); | 131 EXPECT_EQ(list.end(), std::find(list.begin(), list.end(), second.get())); |
81 EXPECT_EQ(list.end(), std::find(list.begin(), list.end(), fourth.get())); | 132 EXPECT_EQ(list.end(), std::find(list.begin(), list.end(), fourth.get())); |
82 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), first.get())); | 133 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), first.get())); |
83 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), third.get())); | 134 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), third.get())); |
84 } | 135 } |
85 | 136 |
137 // Testing that IsValidWidow, IsWindowInList and AddWindow work as expected. | |
138 TEST_F(WindowListProviderImplTest, SimpleChecks) { | |
139 aura::test::TestWindowDelegate delegate; | |
140 scoped_ptr<aura::Window> container(new aura::Window(&delegate)); | |
141 | |
142 scoped_ptr<aura::Window> normal_window = | |
143 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); | |
144 scoped_ptr<aura::Window> popup_window = | |
145 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_POPUP); | |
146 scoped_ptr<aura::Window> menu_window = | |
147 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_MENU); | |
148 | |
149 scoped_ptr<WindowListProvider> list_provider( | |
150 new WindowListProviderImpl(container.get())); | |
151 | |
152 // Check which windows are valid and which are not. | |
153 EXPECT_TRUE(list_provider->IsValidWindow(normal_window.get())); | |
154 EXPECT_FALSE(list_provider->IsValidWindow(popup_window.get())); | |
155 EXPECT_FALSE(list_provider->IsValidWindow(menu_window.get())); | |
156 | |
157 // Check that no window is currently in the list. | |
158 EXPECT_FALSE(list_provider->IsWindowInList(normal_window.get())); | |
159 EXPECT_FALSE(list_provider->IsWindowInList(popup_window.get())); | |
160 EXPECT_FALSE(list_provider->IsWindowInList(menu_window.get())); | |
161 | |
162 // Check that adding the window will add it to the list. | |
163 container->AddChild(normal_window.get()); | |
164 EXPECT_TRUE(list_provider->IsWindowInList(normal_window.get())); | |
165 } | |
166 | |
167 // Testing that window ordering functions work as expected. | |
168 TEST_F(WindowListProviderImplTest, TestWindowOrderingFunctions) { | |
169 aura::test::TestWindowDelegate delegate; | |
170 scoped_ptr<aura::Window> container(new aura::Window(&delegate)); | |
171 | |
172 scoped_ptr<aura::Window> window1 = | |
173 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); | |
174 scoped_ptr<aura::Window> window2 = | |
175 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); | |
176 scoped_ptr<aura::Window> window3 = | |
177 CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); | |
178 | |
179 scoped_ptr<WindowListProvider> list_provider( | |
180 new WindowListProviderImpl(container.get())); | |
181 scoped_ptr<WindowListObserver> observer( | |
182 new WindowListObserver(list_provider.get())); | |
183 | |
184 EXPECT_FALSE(list_provider->IsWindowInList(window1.get())); | |
185 EXPECT_FALSE(list_provider->IsWindowInList(window2.get())); | |
186 EXPECT_FALSE(list_provider->IsWindowInList(window3.get())); | |
187 | |
188 // Add the windows. | |
189 container->AddChild(window1.get()); | |
190 container->AddChild(window2.get()); | |
191 container->AddChild(window3.get()); | |
192 aura::Window::Windows original_order = list_provider->GetCurrentWindowList(); | |
193 ASSERT_EQ(3U, original_order.size()); | |
194 EXPECT_EQ(original_order[0], window1.get()); | |
195 EXPECT_EQ(original_order[1], window2.get()); | |
196 EXPECT_EQ(original_order[2], window3.get()); | |
197 | |
198 EXPECT_EQ(0, observer.get()->calls()); | |
199 | |
200 // Move 2 to the front. | |
201 list_provider->MoveToFront(window2.get()); | |
202 EXPECT_EQ("1 3 2", GetWindowOrder(original_order, | |
203 list_provider->GetCurrentWindowList())); | |
204 EXPECT_EQ(1, observer->calls()); | |
205 | |
206 // Move 2 to the front again. Should not change anything. | |
207 list_provider->MoveToFront(window2.get()); | |
208 EXPECT_EQ("1 3 2", GetWindowOrder(original_order, | |
209 list_provider->GetCurrentWindowList())); | |
210 EXPECT_EQ(1, observer->calls()); | |
211 | |
212 // Move 1 (from the back) in front of 2. | |
213 list_provider->StackWindowFrontOf(window1.get(), window3.get()); | |
214 EXPECT_EQ("3 1 2", GetWindowOrder(original_order, | |
215 list_provider->GetCurrentWindowList())); | |
216 EXPECT_EQ(2, observer->calls()); | |
217 | |
218 // Move 2 (from the front) in front of 3. | |
219 list_provider->StackWindowFrontOf(window2.get(), window3.get()); | |
220 EXPECT_EQ("3 2 1", GetWindowOrder(original_order, | |
221 list_provider->GetCurrentWindowList())); | |
222 EXPECT_EQ(3, observer->calls()); | |
223 | |
224 // Move 1 (from the front) behind 3. | |
225 list_provider->StackWindowBehindTo(window1.get(), window3.get()); | |
226 EXPECT_EQ("1 3 2", GetWindowOrder(original_order, | |
227 list_provider->GetCurrentWindowList())); | |
228 EXPECT_EQ(4, observer->calls()); | |
229 | |
230 // Move 1 (from the back) in front of 2. | |
231 list_provider->StackWindowFrontOf(window1.get(), window2.get()); | |
232 EXPECT_EQ("3 2 1", GetWindowOrder(original_order, | |
233 list_provider->GetCurrentWindowList())); | |
234 EXPECT_EQ(5, observer->calls()); | |
235 | |
236 // Test that no change should also report no call. | |
237 list_provider->StackWindowFrontOf(window1.get(), window2.get()); | |
238 EXPECT_EQ("3 2 1", GetWindowOrder(original_order, | |
239 list_provider->GetCurrentWindowList())); | |
240 EXPECT_EQ(5, observer->calls()); | |
241 list_provider->StackWindowBehindTo(window2.get(), window1.get()); | |
242 EXPECT_EQ("3 2 1", GetWindowOrder(original_order, | |
243 list_provider->GetCurrentWindowList())); | |
244 EXPECT_EQ(5, observer->calls()); | |
245 } | |
246 | |
86 } // namespace athena | 247 } // namespace athena |
OLD | NEW |