OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/mus/ws/focus_controller.h" | 5 #include "components/mus/ws/focus_controller.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 focus_observer.ClearAll(); | 141 focus_observer.ClearAll(); |
142 focus_controller.RemoveObserver(&focus_observer); | 142 focus_controller.RemoveObserver(&focus_observer); |
143 } | 143 } |
144 | 144 |
145 // Tests that focus shifts correctly if the focused window is destroyed. | 145 // Tests that focus shifts correctly if the focused window is destroyed. |
146 TEST(FocusControllerTest, FocusShiftsOnDestroy) { | 146 TEST(FocusControllerTest, FocusShiftsOnDestroy) { |
147 TestServerWindowDelegate server_window_delegate; | 147 TestServerWindowDelegate server_window_delegate; |
148 ServerWindow parent(&server_window_delegate, WindowId()); | 148 ServerWindow parent(&server_window_delegate, WindowId()); |
149 server_window_delegate.set_root_window(&parent); | 149 server_window_delegate.set_root_window(&parent); |
150 parent.SetVisible(true); | 150 parent.SetVisible(true); |
151 scoped_ptr<ServerWindow> child_first( | 151 ServerWindow child_first(&server_window_delegate, WindowId()); |
| 152 child_first.SetVisible(true); |
| 153 parent.Add(&child_first); |
| 154 scoped_ptr<ServerWindow> child_second( |
152 new ServerWindow(&server_window_delegate, WindowId())); | 155 new ServerWindow(&server_window_delegate, WindowId())); |
153 child_first->SetVisible(true); | 156 child_second->SetVisible(true); |
154 parent.Add(child_first.get()); | 157 parent.Add(child_second.get()); |
155 ServerWindow child_second(&server_window_delegate, WindowId()); | |
156 child_second.SetVisible(true); | |
157 parent.Add(&child_second); | |
158 std::vector<uint8_t> dummy; | 158 std::vector<uint8_t> dummy; |
159 // Allow only |parent| to be activated. | 159 // Allow only |parent| to be activated. |
160 parent.SetProperty(kDisallowActiveChildren, &dummy); | 160 parent.SetProperty(kDisallowActiveChildren, &dummy); |
161 | 161 |
162 TestFocusControllerObserver focus_observer; | 162 TestFocusControllerObserver focus_observer; |
163 focus_observer.set_ignore_explicit(false); | 163 focus_observer.set_ignore_explicit(false); |
164 FocusController focus_controller(&focus_observer, &parent); | 164 FocusController focus_controller(&focus_observer, &parent); |
165 focus_controller.AddObserver(&focus_observer); | 165 focus_controller.AddObserver(&focus_observer); |
166 | 166 |
167 focus_controller.ActivateNextWindow(); | 167 focus_controller.ActivateNextWindow(); |
168 EXPECT_EQ(nullptr, focus_observer.old_active_window()); | 168 EXPECT_EQ(nullptr, focus_observer.old_active_window()); |
169 EXPECT_EQ(&parent, focus_observer.new_active_window()); | 169 EXPECT_EQ(&parent, focus_observer.new_active_window()); |
170 EXPECT_EQ(nullptr, focus_observer.old_focused_window()); | 170 EXPECT_EQ(nullptr, focus_observer.old_focused_window()); |
171 EXPECT_EQ(child_first.get(), focus_observer.new_focused_window()); | 171 EXPECT_EQ(child_second.get(), focus_observer.new_focused_window()); |
172 focus_observer.ClearAll(); | 172 focus_observer.ClearAll(); |
173 | 173 |
174 // Destroying |child_first| should move focus to |child_second|. | 174 // Destroying |child_second| should move focus to |child_first|. |
175 child_first.reset(); | 175 child_second.reset(); |
176 EXPECT_NE(nullptr, focus_observer.old_focused_window()); | 176 EXPECT_NE(nullptr, focus_observer.old_focused_window()); |
177 EXPECT_EQ(&child_second, focus_observer.new_focused_window()); | 177 EXPECT_EQ(&child_first, focus_observer.new_focused_window()); |
178 | 178 |
179 focus_controller.RemoveObserver(&focus_observer); | 179 focus_controller.RemoveObserver(&focus_observer); |
180 } | 180 } |
181 | 181 |
182 TEST(FocusControllerTest, ActivationSkipsOverHiddenWindow) { | 182 TEST(FocusControllerTest, ActivationSkipsOverHiddenWindow) { |
183 TestServerWindowDelegate server_window_delegate; | 183 TestServerWindowDelegate server_window_delegate; |
184 ServerWindow parent(&server_window_delegate, WindowId()); | 184 ServerWindow parent(&server_window_delegate, WindowId()); |
185 server_window_delegate.set_root_window(&parent); | 185 server_window_delegate.set_root_window(&parent); |
186 parent.SetVisible(true); | 186 parent.SetVisible(true); |
187 | 187 |
188 ServerWindow child_first(&server_window_delegate, WindowId()); | 188 ServerWindow child_first(&server_window_delegate, WindowId()); |
189 ServerWindow child_second(&server_window_delegate, WindowId()); | 189 ServerWindow child_second(&server_window_delegate, WindowId()); |
190 ServerWindow child_third(&server_window_delegate, WindowId()); | 190 ServerWindow child_third(&server_window_delegate, WindowId()); |
191 | 191 |
192 parent.Add(&child_first); | 192 parent.Add(&child_first); |
193 parent.Add(&child_second); | 193 parent.Add(&child_second); |
194 parent.Add(&child_third); | 194 parent.Add(&child_third); |
195 | 195 |
196 child_first.SetVisible(true); | 196 child_first.SetVisible(true); |
197 child_second.SetVisible(false); | 197 child_second.SetVisible(false); |
198 child_third.SetVisible(true); | 198 child_third.SetVisible(true); |
199 | 199 |
200 TestFocusControllerObserver focus_observer; | 200 TestFocusControllerObserver focus_observer; |
201 focus_observer.set_ignore_explicit(false); | 201 focus_observer.set_ignore_explicit(false); |
202 FocusController focus_controller(&focus_observer, &parent); | 202 FocusController focus_controller(&focus_observer, &parent); |
203 focus_controller.AddObserver(&focus_observer); | 203 focus_controller.AddObserver(&focus_observer); |
204 | 204 |
205 // Since |child_second| is invisible, activation should cycle from | 205 // Since |child_second| is invisible, activation should cycle from |
206 // |child_first|, to |child_third|, to |parent|, back to |child_first|. | 206 // |child_third|, to |child_first|, to |parent|, back to |child_third|. |
207 focus_controller.ActivateNextWindow(); | 207 focus_controller.ActivateNextWindow(); |
208 EXPECT_EQ(nullptr, focus_observer.old_active_window()); | 208 EXPECT_EQ(nullptr, focus_observer.old_active_window()); |
| 209 EXPECT_EQ(&child_third, focus_observer.new_active_window()); |
| 210 focus_observer.ClearAll(); |
| 211 |
| 212 focus_controller.ActivateNextWindow(); |
| 213 EXPECT_EQ(&child_third, focus_observer.old_active_window()); |
209 EXPECT_EQ(&child_first, focus_observer.new_active_window()); | 214 EXPECT_EQ(&child_first, focus_observer.new_active_window()); |
210 focus_observer.ClearAll(); | 215 focus_observer.ClearAll(); |
211 | 216 |
212 focus_controller.ActivateNextWindow(); | 217 focus_controller.ActivateNextWindow(); |
213 EXPECT_EQ(&child_first, focus_observer.old_active_window()); | 218 EXPECT_EQ(&child_first, focus_observer.old_active_window()); |
214 EXPECT_EQ(&child_third, focus_observer.new_active_window()); | |
215 focus_observer.ClearAll(); | |
216 | |
217 focus_controller.ActivateNextWindow(); | |
218 EXPECT_EQ(&child_third, focus_observer.old_active_window()); | |
219 EXPECT_EQ(&parent, focus_observer.new_active_window()); | 219 EXPECT_EQ(&parent, focus_observer.new_active_window()); |
220 focus_observer.ClearAll(); | 220 focus_observer.ClearAll(); |
221 | 221 |
222 focus_controller.ActivateNextWindow(); | 222 focus_controller.ActivateNextWindow(); |
223 EXPECT_EQ(&parent, focus_observer.old_active_window()); | 223 EXPECT_EQ(&parent, focus_observer.old_active_window()); |
224 EXPECT_EQ(&child_first, focus_observer.new_active_window()); | 224 EXPECT_EQ(&child_third, focus_observer.new_active_window()); |
225 focus_observer.ClearAll(); | 225 focus_observer.ClearAll(); |
226 | 226 |
227 // Once |child_second| is made visible, activation should go from | 227 // Once |child_second| is made visible, activation should go from |
228 // |child_first| to |child_second|. | 228 // |child_third| to |child_second|. |
229 child_second.SetVisible(true); | 229 child_second.SetVisible(true); |
230 focus_controller.ActivateNextWindow(); | 230 focus_controller.ActivateNextWindow(); |
231 EXPECT_EQ(&child_first, focus_observer.old_active_window()); | 231 EXPECT_EQ(&child_third, focus_observer.old_active_window()); |
232 EXPECT_EQ(&child_second, focus_observer.new_active_window()); | 232 EXPECT_EQ(&child_second, focus_observer.new_active_window()); |
233 } | 233 } |
234 | 234 |
235 } // namespace ws | 235 } // namespace ws |
236 } // namespace mus | 236 } // namespace mus |
OLD | NEW |