| 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 "ash/common/wm/window_cycle_controller.h" | 5 #include "ash/common/wm/window_cycle_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "ash/aura/wm_window_aura.h" | 10 #include "ash/aura/wm_window_aura.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 | 71 |
| 72 class WindowCycleControllerTest : public test::AshTestBase { | 72 class WindowCycleControllerTest : public test::AshTestBase { |
| 73 public: | 73 public: |
| 74 WindowCycleControllerTest() {} | 74 WindowCycleControllerTest() {} |
| 75 ~WindowCycleControllerTest() override {} | 75 ~WindowCycleControllerTest() override {} |
| 76 | 76 |
| 77 void SetUp() override { | 77 void SetUp() override { |
| 78 test::AshTestBase::SetUp(); | 78 test::AshTestBase::SetUp(); |
| 79 ASSERT_TRUE(test::TestShelfDelegate::instance()); | 79 ASSERT_TRUE(test::TestShelfDelegate::instance()); |
| 80 | 80 |
| 81 WindowCycleList::DisableInitialDelayForTesting(); | |
| 82 | |
| 83 shelf_view_test_.reset(new test::ShelfViewTestAPI( | 81 shelf_view_test_.reset(new test::ShelfViewTestAPI( |
| 84 test::ShelfTestAPI(Shelf::ForPrimaryDisplay()).shelf_view())); | 82 test::ShelfTestAPI(Shelf::ForPrimaryDisplay()).shelf_view())); |
| 85 shelf_view_test_->SetAnimationDuration(1); | 83 shelf_view_test_->SetAnimationDuration(1); |
| 86 } | 84 } |
| 87 | 85 |
| 88 aura::Window* CreatePanelWindow() { | 86 aura::Window* CreatePanelWindow() { |
| 89 gfx::Rect rect(100, 100); | 87 gfx::Rect rect(100, 100); |
| 90 aura::Window* window = CreateTestWindowInShellWithDelegateAndType( | 88 aura::Window* window = CreateTestWindowInShellWithDelegateAndType( |
| 91 NULL, ui::wm::WINDOW_TYPE_PANEL, 0, rect); | 89 NULL, ui::wm::WINDOW_TYPE_PANEL, 0, rect); |
| 92 test::TestShelfDelegate::instance()->AddShelfItem(window); | 90 test::TestShelfDelegate::instance()->AddShelfItem(window); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 // Pressing and releasing Alt-tab again should cycle back to the most- | 166 // Pressing and releasing Alt-tab again should cycle back to the most- |
| 169 // recently-used window in the current child order. | 167 // recently-used window in the current child order. |
| 170 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 168 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 171 controller->StopCycling(); | 169 controller->StopCycling(); |
| 172 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); | 170 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 173 | 171 |
| 174 // Pressing Alt-tab multiple times without releasing Alt should cycle through | 172 // Pressing Alt-tab multiple times without releasing Alt should cycle through |
| 175 // all the windows and wrap around. | 173 // all the windows and wrap around. |
| 176 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 174 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 177 EXPECT_TRUE(controller->IsCycling()); | 175 EXPECT_TRUE(controller->IsCycling()); |
| 176 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 178 | 177 |
| 179 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 178 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 180 EXPECT_TRUE(controller->IsCycling()); | 179 EXPECT_TRUE(controller->IsCycling()); |
| 180 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 181 | 181 |
| 182 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 182 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 183 EXPECT_TRUE(controller->IsCycling()); | 183 EXPECT_TRUE(controller->IsCycling()); |
| 184 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 184 | 185 |
| 185 controller->StopCycling(); | 186 controller->StopCycling(); |
| 186 EXPECT_FALSE(controller->IsCycling()); | 187 EXPECT_FALSE(controller->IsCycling()); |
| 187 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); | 188 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 188 | 189 |
| 189 // Reset our stacking order. | 190 // Reset our stacking order. |
| 190 wm::ActivateWindow(window2.get()); | 191 wm::ActivateWindow(window2.get()); |
| 191 wm::ActivateWindow(window1.get()); | 192 wm::ActivateWindow(window1.get()); |
| 192 wm::ActivateWindow(window0.get()); | 193 wm::ActivateWindow(window0.get()); |
| 193 | 194 |
| 194 // Likewise we can cycle backwards through the windows. | 195 // Likewise we can cycle backwards through all the windows. |
| 195 controller->HandleCycleWindow(WindowCycleController::BACKWARD); | 196 controller->HandleCycleWindow(WindowCycleController::BACKWARD); |
| 197 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 196 controller->HandleCycleWindow(WindowCycleController::BACKWARD); | 198 controller->HandleCycleWindow(WindowCycleController::BACKWARD); |
| 199 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 200 controller->HandleCycleWindow(WindowCycleController::BACKWARD); |
| 201 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 197 controller->StopCycling(); | 202 controller->StopCycling(); |
| 198 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); | 203 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 199 | |
| 200 // Reset our stacking order. | |
| 201 wm::ActivateWindow(window2.get()); | |
| 202 wm::ActivateWindow(window1.get()); | |
| 203 wm::ActivateWindow(window0.get()); | |
| 204 | 204 |
| 205 // When the screen is locked, cycling window does not take effect. | 205 // When the screen is locked, cycling window does not take effect. |
| 206 WmShell::Get()->GetSessionStateDelegate()->LockScreen(); | 206 WmShell::Get()->GetSessionStateDelegate()->LockScreen(); |
| 207 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); | 207 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 208 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 208 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 209 EXPECT_FALSE(controller->IsCycling()); | 209 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 210 controller->HandleCycleWindow(WindowCycleController::BACKWARD); |
| 211 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 210 | 212 |
| 211 // Unlock, it works again. | |
| 212 WmShell::Get()->GetSessionStateDelegate()->UnlockScreen(); | 213 WmShell::Get()->GetSessionStateDelegate()->UnlockScreen(); |
| 213 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); | 214 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 214 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 215 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 216 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 215 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 217 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 216 controller->StopCycling(); | |
| 217 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); | 218 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 218 | 219 |
| 219 // When a modal window is active, cycling window does not take effect. | 220 // When a modal window is active, cycling window does not take effect. |
| 220 aura::Window* modal_container = Shell::GetContainer( | 221 aura::Window* modal_container = Shell::GetContainer( |
| 221 Shell::GetPrimaryRootWindow(), kShellWindowId_SystemModalContainer); | 222 Shell::GetPrimaryRootWindow(), kShellWindowId_SystemModalContainer); |
| 222 std::unique_ptr<Window> modal_window( | 223 std::unique_ptr<Window> modal_window( |
| 223 CreateTestWindowWithId(-2, modal_container)); | 224 CreateTestWindowWithId(-2, modal_container)); |
| 224 modal_window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_SYSTEM); | 225 modal_window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_SYSTEM); |
| 225 wm::ActivateWindow(modal_window.get()); | 226 wm::ActivateWindow(modal_window.get()); |
| 226 EXPECT_TRUE(wm::IsActiveWindow(modal_window.get())); | 227 EXPECT_TRUE(wm::IsActiveWindow(modal_window.get())); |
| 227 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 228 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 228 EXPECT_TRUE(wm::IsActiveWindow(modal_window.get())); | 229 EXPECT_TRUE(wm::IsActiveWindow(modal_window.get())); |
| 229 EXPECT_FALSE(controller->IsCycling()); | |
| 230 EXPECT_FALSE(wm::IsActiveWindow(window0.get())); | 230 EXPECT_FALSE(wm::IsActiveWindow(window0.get())); |
| 231 EXPECT_FALSE(wm::IsActiveWindow(window1.get())); | 231 EXPECT_FALSE(wm::IsActiveWindow(window1.get())); |
| 232 EXPECT_FALSE(wm::IsActiveWindow(window2.get())); | 232 EXPECT_FALSE(wm::IsActiveWindow(window2.get())); |
| 233 controller->HandleCycleWindow(WindowCycleController::BACKWARD); | 233 controller->HandleCycleWindow(WindowCycleController::BACKWARD); |
| 234 EXPECT_TRUE(wm::IsActiveWindow(modal_window.get())); | 234 EXPECT_TRUE(wm::IsActiveWindow(modal_window.get())); |
| 235 EXPECT_FALSE(controller->IsCycling()); | |
| 236 EXPECT_FALSE(wm::IsActiveWindow(window0.get())); | 235 EXPECT_FALSE(wm::IsActiveWindow(window0.get())); |
| 237 EXPECT_FALSE(wm::IsActiveWindow(window1.get())); | 236 EXPECT_FALSE(wm::IsActiveWindow(window1.get())); |
| 238 EXPECT_FALSE(wm::IsActiveWindow(window2.get())); | 237 EXPECT_FALSE(wm::IsActiveWindow(window2.get())); |
| 239 } | 238 } |
| 240 | 239 |
| 241 // Cycles between a maximized and normal window. | 240 // Cycles between a maximized and normal window. |
| 242 TEST_F(WindowCycleControllerTest, MaximizedWindow) { | 241 TEST_F(WindowCycleControllerTest, MaximizedWindow) { |
| 243 // Create a couple of test windows. | 242 // Create a couple of test windows. |
| 244 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0)); | 243 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0)); |
| 245 std::unique_ptr<Window> window1(CreateTestWindowInShellWithId(1)); | 244 std::unique_ptr<Window> window1(CreateTestWindowInShellWithId(1)); |
| 246 wm::WindowState* window1_state = wm::GetWindowState(window1.get()); | 245 wm::WindowState* window1_state = wm::GetWindowState(window1.get()); |
| 247 window1_state->Maximize(); | 246 window1_state->Maximize(); |
| 248 window1_state->Activate(); | 247 window1_state->Activate(); |
| 249 EXPECT_TRUE(window1_state->IsActive()); | 248 EXPECT_TRUE(window1_state->IsActive()); |
| 250 | 249 |
| 251 // Rotate focus, this should move focus to window0. | 250 // Rotate focus, this should move focus to window0. |
| 252 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); | 251 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); |
| 253 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 252 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 254 controller->StopCycling(); | |
| 255 EXPECT_TRUE(wm::GetWindowState(window0.get())->IsActive()); | 253 EXPECT_TRUE(wm::GetWindowState(window0.get())->IsActive()); |
| 256 EXPECT_FALSE(window1_state->IsActive()); | |
| 257 | 254 |
| 258 // One more time. | 255 // One more time. |
| 259 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 256 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 260 controller->StopCycling(); | |
| 261 EXPECT_TRUE(window1_state->IsActive()); | 257 EXPECT_TRUE(window1_state->IsActive()); |
| 262 } | 258 } |
| 263 | 259 |
| 264 // Cycles to a minimized window. | 260 // Cycles to a minimized window. |
| 265 TEST_F(WindowCycleControllerTest, Minimized) { | 261 TEST_F(WindowCycleControllerTest, Minimized) { |
| 266 // Create a couple of test windows. | 262 // Create a couple of test windows. |
| 267 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0)); | 263 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0)); |
| 268 std::unique_ptr<Window> window1(CreateTestWindowInShellWithId(1)); | 264 std::unique_ptr<Window> window1(CreateTestWindowInShellWithId(1)); |
| 269 wm::WindowState* window0_state = wm::GetWindowState(window0.get()); | 265 wm::WindowState* window0_state = wm::GetWindowState(window0.get()); |
| 270 wm::WindowState* window1_state = wm::GetWindowState(window1.get()); | 266 wm::WindowState* window1_state = wm::GetWindowState(window1.get()); |
| 271 | 267 |
| 272 window1_state->Minimize(); | 268 window1_state->Minimize(); |
| 273 window0_state->Activate(); | 269 window0_state->Activate(); |
| 274 EXPECT_TRUE(window0_state->IsActive()); | 270 EXPECT_TRUE(window0_state->IsActive()); |
| 275 | 271 |
| 276 // Rotate focus, this should move focus to window1 and unminimize it. | 272 // Rotate focus, this should move focus to window1 and unminimize it. |
| 277 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); | 273 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); |
| 278 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 274 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 279 controller->StopCycling(); | |
| 280 EXPECT_FALSE(window0_state->IsActive()); | |
| 281 EXPECT_FALSE(window1_state->IsMinimized()); | 275 EXPECT_FALSE(window1_state->IsMinimized()); |
| 282 EXPECT_TRUE(window1_state->IsActive()); | 276 EXPECT_TRUE(window1_state->IsActive()); |
| 283 | 277 |
| 284 // One more time back to w0. | 278 // One more time back to w0. |
| 285 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 279 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 286 controller->StopCycling(); | |
| 287 EXPECT_TRUE(window0_state->IsActive()); | 280 EXPECT_TRUE(window0_state->IsActive()); |
| 288 } | 281 } |
| 289 | 282 |
| 290 TEST_F(WindowCycleControllerTest, AlwaysOnTopWindow) { | 283 TEST_F(WindowCycleControllerTest, AlwaysOnTopWindow) { |
| 291 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); | 284 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); |
| 292 | 285 |
| 293 // Set up several windows to use to test cycling. | 286 // Set up several windows to use to test cycling. |
| 294 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0)); | 287 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0)); |
| 295 std::unique_ptr<Window> window1(CreateTestWindowInShellWithId(1)); | 288 std::unique_ptr<Window> window1(CreateTestWindowInShellWithId(1)); |
| 296 | 289 |
| 297 Window* top_container = Shell::GetContainer( | 290 Window* top_container = Shell::GetContainer( |
| 298 Shell::GetPrimaryRootWindow(), kShellWindowId_AlwaysOnTopContainer); | 291 Shell::GetPrimaryRootWindow(), kShellWindowId_AlwaysOnTopContainer); |
| 299 std::unique_ptr<Window> window2(CreateTestWindowWithId(2, top_container)); | 292 std::unique_ptr<Window> window2(CreateTestWindowWithId(2, top_container)); |
| 300 wm::ActivateWindow(window0.get()); | 293 wm::ActivateWindow(window0.get()); |
| 301 | 294 |
| 302 // Simulate pressing and releasing Alt-tab. | 295 // Simulate pressing and releasing Alt-tab. |
| 303 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); | 296 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 304 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 297 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 305 | 298 |
| 306 // Window lists should return the topmost window in front. | 299 // Window lists should return the topmost window in front. |
| 307 ASSERT_TRUE(controller->window_cycle_list()); | 300 ASSERT_TRUE(controller->window_cycle_list()); |
| 308 ASSERT_EQ(3u, GetWindows(controller).size()); | 301 ASSERT_EQ(3u, GetWindows(controller).size()); |
| 309 EXPECT_EQ(window0.get(), GetWindows(controller)[0]); | 302 EXPECT_EQ(window0.get(), GetWindows(controller)[0]); |
| 310 EXPECT_EQ(window2.get(), GetWindows(controller)[1]); | 303 EXPECT_EQ(window2.get(), GetWindows(controller)[1]); |
| 311 EXPECT_EQ(window1.get(), GetWindows(controller)[2]); | 304 EXPECT_EQ(window1.get(), GetWindows(controller)[2]); |
| 305 |
| 306 controller->StopCycling(); |
| 307 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 308 |
| 309 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 310 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 311 |
| 312 controller->StopCycling(); |
| 313 |
| 314 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 315 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 316 |
| 317 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 318 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 319 |
| 320 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 321 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 312 } | 322 } |
| 313 | 323 |
| 314 TEST_F(WindowCycleControllerTest, AlwaysOnTopMultiWindow) { | 324 TEST_F(WindowCycleControllerTest, AlwaysOnTopMultiWindow) { |
| 315 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); | 325 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); |
| 316 | 326 |
| 317 // Set up several windows to use to test cycling. | 327 // Set up several windows to use to test cycling. |
| 318 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0)); | 328 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0)); |
| 319 std::unique_ptr<Window> window1(CreateTestWindowInShellWithId(1)); | 329 std::unique_ptr<Window> window1(CreateTestWindowInShellWithId(1)); |
| 320 | 330 |
| 321 Window* top_container = Shell::GetContainer( | 331 Window* top_container = Shell::GetContainer( |
| 322 Shell::GetPrimaryRootWindow(), kShellWindowId_AlwaysOnTopContainer); | 332 Shell::GetPrimaryRootWindow(), kShellWindowId_AlwaysOnTopContainer); |
| 323 std::unique_ptr<Window> window2(CreateTestWindowWithId(2, top_container)); | 333 std::unique_ptr<Window> window2(CreateTestWindowWithId(2, top_container)); |
| 324 std::unique_ptr<Window> window3(CreateTestWindowWithId(3, top_container)); | 334 std::unique_ptr<Window> window3(CreateTestWindowWithId(3, top_container)); |
| 325 wm::ActivateWindow(window0.get()); | 335 wm::ActivateWindow(window0.get()); |
| 326 | 336 |
| 327 // Simulate pressing and releasing Alt-tab. | 337 // Simulate pressing and releasing Alt-tab. |
| 328 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); | 338 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 329 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 339 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 330 | 340 |
| 331 // Window lists should return the topmost window in front. | 341 // Window lists should return the topmost window in front. |
| 332 ASSERT_TRUE(controller->window_cycle_list()); | 342 ASSERT_TRUE(controller->window_cycle_list()); |
| 333 ASSERT_EQ(4u, GetWindows(controller).size()); | 343 ASSERT_EQ(4u, GetWindows(controller).size()); |
| 334 EXPECT_EQ(window0.get(), GetWindows(controller)[0]); | 344 EXPECT_EQ(window0.get(), GetWindows(controller)[0]); |
| 335 EXPECT_EQ(window3.get(), GetWindows(controller)[1]); | 345 EXPECT_EQ(window3.get(), GetWindows(controller)[1]); |
| 336 EXPECT_EQ(window2.get(), GetWindows(controller)[2]); | 346 EXPECT_EQ(window2.get(), GetWindows(controller)[2]); |
| 337 EXPECT_EQ(window1.get(), GetWindows(controller)[3]); | 347 EXPECT_EQ(window1.get(), GetWindows(controller)[3]); |
| 348 |
| 349 controller->StopCycling(); |
| 350 EXPECT_TRUE(wm::IsActiveWindow(window3.get())); |
| 351 |
| 352 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 353 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 354 |
| 355 controller->StopCycling(); |
| 356 |
| 357 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 358 EXPECT_TRUE(wm::IsActiveWindow(window3.get())); |
| 359 |
| 360 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 361 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 362 |
| 363 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 364 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 365 |
| 366 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 367 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 338 } | 368 } |
| 339 | 369 |
| 340 TEST_F(WindowCycleControllerTest, AlwaysOnTopMultipleRootWindows) { | 370 TEST_F(WindowCycleControllerTest, AlwaysOnTopMultipleRootWindows) { |
| 341 if (!SupportsMultipleDisplays()) | 371 if (!SupportsMultipleDisplays()) |
| 342 return; | 372 return; |
| 343 | 373 |
| 344 // Set up a second root window | 374 // Set up a second root window |
| 345 UpdateDisplay("1000x600,600x400"); | 375 UpdateDisplay("1000x600,600x400"); |
| 346 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | 376 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
| 347 ASSERT_EQ(2U, root_windows.size()); | 377 ASSERT_EQ(2U, root_windows.size()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 378 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); | 408 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 379 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 409 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 380 | 410 |
| 381 // Window lists should return the topmost window in front. | 411 // Window lists should return the topmost window in front. |
| 382 ASSERT_TRUE(controller->window_cycle_list()); | 412 ASSERT_TRUE(controller->window_cycle_list()); |
| 383 ASSERT_EQ(4u, GetWindows(controller).size()); | 413 ASSERT_EQ(4u, GetWindows(controller).size()); |
| 384 EXPECT_EQ(window2.get(), GetWindows(controller)[0]); | 414 EXPECT_EQ(window2.get(), GetWindows(controller)[0]); |
| 385 EXPECT_EQ(window3.get(), GetWindows(controller)[1]); | 415 EXPECT_EQ(window3.get(), GetWindows(controller)[1]); |
| 386 EXPECT_EQ(window1.get(), GetWindows(controller)[2]); | 416 EXPECT_EQ(window1.get(), GetWindows(controller)[2]); |
| 387 EXPECT_EQ(window0.get(), GetWindows(controller)[3]); | 417 EXPECT_EQ(window0.get(), GetWindows(controller)[3]); |
| 418 |
| 419 controller->StopCycling(); |
| 420 EXPECT_TRUE(wm::IsActiveWindow(window3.get())); |
| 421 |
| 422 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 423 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 424 |
| 425 controller->StopCycling(); |
| 426 |
| 427 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 428 EXPECT_TRUE(wm::IsActiveWindow(window3.get())); |
| 429 |
| 430 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 431 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 432 |
| 433 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 434 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 435 |
| 436 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 437 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 388 } | 438 } |
| 389 | 439 |
| 390 TEST_F(WindowCycleControllerTest, MostRecentlyUsed) { | 440 TEST_F(WindowCycleControllerTest, MostRecentlyUsed) { |
| 391 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); | 441 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); |
| 392 | 442 |
| 393 // Set up several windows to use to test cycling. | 443 // Set up several windows to use to test cycling. |
| 394 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0)); | 444 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0)); |
| 395 std::unique_ptr<Window> window1(CreateTestWindowInShellWithId(1)); | 445 std::unique_ptr<Window> window1(CreateTestWindowInShellWithId(1)); |
| 396 std::unique_ptr<Window> window2(CreateTestWindowInShellWithId(2)); | 446 std::unique_ptr<Window> window2(CreateTestWindowInShellWithId(2)); |
| 397 | 447 |
| 398 wm::ActivateWindow(window0.get()); | 448 wm::ActivateWindow(window0.get()); |
| 399 | 449 |
| 400 // Simulate pressing and releasing Alt-tab. | 450 // Simulate pressing and releasing Alt-tab. |
| 401 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); | 451 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 402 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 452 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 403 | 453 |
| 404 // Window lists should return the topmost window in front. | 454 // Window lists should return the topmost window in front. |
| 405 ASSERT_TRUE(controller->window_cycle_list()); | 455 ASSERT_TRUE(controller->window_cycle_list()); |
| 406 ASSERT_EQ(3u, GetWindows(controller).size()); | 456 ASSERT_EQ(3u, GetWindows(controller).size()); |
| 407 EXPECT_EQ(window0.get(), GetWindows(controller)[0]); | 457 EXPECT_EQ(window0.get(), GetWindows(controller)[0]); |
| 408 EXPECT_EQ(window2.get(), GetWindows(controller)[1]); | 458 EXPECT_EQ(window2.get(), GetWindows(controller)[1]); |
| 409 EXPECT_EQ(window1.get(), GetWindows(controller)[2]); | 459 EXPECT_EQ(window1.get(), GetWindows(controller)[2]); |
| 410 | 460 |
| 411 // Cycling through then stopping the cycling will activate a window. | |
| 412 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 461 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 413 controller->StopCycling(); | 462 controller->StopCycling(); |
| 414 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); | 463 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 415 | 464 |
| 416 // Cycling alone (without StopCycling()) doesn't activate. | |
| 417 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 465 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 418 EXPECT_FALSE(wm::IsActiveWindow(window0.get())); | 466 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 419 | |
| 420 // Showing the Alt+Tab UI does however deactivate the erstwhile active window. | |
| 421 EXPECT_FALSE(wm::IsActiveWindow(window1.get())); | |
| 422 | 467 |
| 423 controller->StopCycling(); | 468 controller->StopCycling(); |
| 469 |
| 470 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 471 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 472 |
| 473 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 474 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 475 |
| 476 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 477 EXPECT_TRUE(wm::IsActiveWindow(window0.get())); |
| 424 } | 478 } |
| 425 | 479 |
| 426 // Tests that beginning window selection hides the app list. | 480 // Tests that beginning window selection hides the app list. |
| 427 TEST_F(WindowCycleControllerTest, SelectingHidesAppList) { | 481 TEST_F(WindowCycleControllerTest, SelectingHidesAppList) { |
| 428 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); | 482 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); |
| 429 | 483 |
| 430 std::unique_ptr<aura::Window> window0(CreateTestWindowInShellWithId(0)); | 484 std::unique_ptr<aura::Window> window0(CreateTestWindowInShellWithId(0)); |
| 431 std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(1)); | 485 std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(1)); |
| 432 WmShell::Get()->ShowAppList(); | 486 WmShell::Get()->ShowAppList(); |
| 433 EXPECT_TRUE(WmShell::Get()->GetAppListTargetVisibility()); | 487 EXPECT_TRUE(WmShell::Get()->GetAppListTargetVisibility()); |
| 434 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 488 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 435 EXPECT_FALSE(WmShell::Get()->GetAppListTargetVisibility()); | 489 EXPECT_FALSE(WmShell::Get()->GetAppListTargetVisibility()); |
| 436 | |
| 437 // Make sure that dismissing the app list this way doesn't pass activation | |
| 438 // to a different window. | |
| 439 EXPECT_FALSE(wm::IsActiveWindow(window0.get())); | |
| 440 EXPECT_FALSE(wm::IsActiveWindow(window1.get())); | |
| 441 } | 490 } |
| 442 | 491 |
| 443 // Tests that cycling through windows doesn't change their minimized state. | 492 // Tests that cycling through windows shows and minimizes windows as they |
| 493 // are passed. |
| 444 TEST_F(WindowCycleControllerTest, CyclePreservesMinimization) { | 494 TEST_F(WindowCycleControllerTest, CyclePreservesMinimization) { |
| 445 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); | 495 WindowCycleController* controller = WmShell::Get()->window_cycle_controller(); |
| 446 | 496 |
| 447 std::unique_ptr<aura::Window> window0(CreateTestWindowInShellWithId(0)); | 497 std::unique_ptr<aura::Window> window0(CreateTestWindowInShellWithId(0)); |
| 448 std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(1)); | 498 std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(1)); |
| 449 wm::ActivateWindow(window1.get()); | 499 wm::ActivateWindow(window1.get()); |
| 450 wm::GetWindowState(window1.get())->Minimize(); | 500 wm::GetWindowState(window1.get())->Minimize(); |
| 451 wm::ActivateWindow(window0.get()); | 501 wm::ActivateWindow(window0.get()); |
| 452 EXPECT_TRUE(IsWindowMinimized(window1.get())); | 502 EXPECT_TRUE(IsWindowMinimized(window1.get())); |
| 453 | 503 |
| 454 // On window 2. | 504 // On window 2. |
| 455 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 505 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 456 EXPECT_TRUE(IsWindowMinimized(window1.get())); | 506 EXPECT_FALSE(IsWindowMinimized(window1.get())); |
| 457 | 507 |
| 458 // Back on window 1. | 508 // Back on window 1. |
| 459 controller->HandleCycleWindow(WindowCycleController::FORWARD); | 509 controller->HandleCycleWindow(WindowCycleController::FORWARD); |
| 460 EXPECT_TRUE(IsWindowMinimized(window1.get())); | 510 EXPECT_TRUE(IsWindowMinimized(window1.get())); |
| 461 | 511 |
| 462 controller->StopCycling(); | 512 controller->StopCycling(); |
| 463 | 513 |
| 464 EXPECT_TRUE(IsWindowMinimized(window1.get())); | 514 EXPECT_TRUE(IsWindowMinimized(window1.get())); |
| 465 } | 515 } |
| 466 | 516 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 generator.PressKey(ui::VKEY_TAB, ui::EF_ALT_DOWN); | 609 generator.PressKey(ui::VKEY_TAB, ui::EF_ALT_DOWN); |
| 560 EXPECT_EQ(0u, key_count.GetCountAndReset()); | 610 EXPECT_EQ(0u, key_count.GetCountAndReset()); |
| 561 generator.ReleaseKey(ui::VKEY_TAB, ui::EF_ALT_DOWN); | 611 generator.ReleaseKey(ui::VKEY_TAB, ui::EF_ALT_DOWN); |
| 562 EXPECT_EQ(0u, key_count.GetCountAndReset()); | 612 EXPECT_EQ(0u, key_count.GetCountAndReset()); |
| 563 generator.ReleaseKey(ui::VKEY_MENU, ui::EF_NONE); | 613 generator.ReleaseKey(ui::VKEY_MENU, ui::EF_NONE); |
| 564 EXPECT_TRUE(wm::GetWindowState(w1.get())->IsActive()); | 614 EXPECT_TRUE(wm::GetWindowState(w1.get())->IsActive()); |
| 565 EXPECT_EQ(0u, key_count.GetCountAndReset()); | 615 EXPECT_EQ(0u, key_count.GetCountAndReset()); |
| 566 } | 616 } |
| 567 | 617 |
| 568 } // namespace ash | 618 } // namespace ash |
| OLD | NEW |