| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/wm/system_modal_container_layout_manager.h" | 5 #include "ash/wm/system_modal_container_layout_manager.h" |
| 6 | 6 |
| 7 #include "ash/root_window_controller.h" | 7 #include "ash/root_window_controller.h" |
| 8 #include "ash/session_state_delegate.h" | 8 #include "ash/session_state_delegate.h" |
| 9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
| 10 #include "ash/shell_window_ids.h" | 10 #include "ash/shell_window_ids.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "ui/views/widget/widget_delegate.h" | 22 #include "ui/views/widget/widget_delegate.h" |
| 23 #include "ui/wm/core/window_util.h" | 23 #include "ui/wm/core/window_util.h" |
| 24 | 24 |
| 25 namespace ash { | 25 namespace ash { |
| 26 namespace test { | 26 namespace test { |
| 27 | 27 |
| 28 namespace { | 28 namespace { |
| 29 | 29 |
| 30 aura::Window* GetModalContainer() { | 30 aura::Window* GetModalContainer() { |
| 31 return Shell::GetPrimaryRootWindowController()->GetContainer( | 31 return Shell::GetPrimaryRootWindowController()->GetContainer( |
| 32 ash::internal::kShellWindowId_SystemModalContainer); | 32 ash::kShellWindowId_SystemModalContainer); |
| 33 } | 33 } |
| 34 | 34 |
| 35 bool AllRootWindowsHaveModalBackgroundsForContainer(int container_id) { | 35 bool AllRootWindowsHaveModalBackgroundsForContainer(int container_id) { |
| 36 std::vector<aura::Window*> containers = | 36 std::vector<aura::Window*> containers = |
| 37 Shell::GetContainersFromAllRootWindows(container_id, NULL); | 37 Shell::GetContainersFromAllRootWindows(container_id, NULL); |
| 38 bool has_modal_screen = !containers.empty(); | 38 bool has_modal_screen = !containers.empty(); |
| 39 for (std::vector<aura::Window*>::iterator iter = containers.begin(); | 39 for (std::vector<aura::Window*>::iterator iter = containers.begin(); |
| 40 iter != containers.end(); ++iter) { | 40 iter != containers.end(); ++iter) { |
| 41 has_modal_screen &= | 41 has_modal_screen &= static_cast<SystemModalContainerLayoutManager*>( |
| 42 static_cast<internal::SystemModalContainerLayoutManager*>( | 42 (*iter)->layout_manager())->has_modal_background(); |
| 43 (*iter)->layout_manager())->has_modal_background(); | |
| 44 } | 43 } |
| 45 return has_modal_screen; | 44 return has_modal_screen; |
| 46 } | 45 } |
| 47 | 46 |
| 48 bool AllRootWindowsHaveLockedModalBackgrounds() { | 47 bool AllRootWindowsHaveLockedModalBackgrounds() { |
| 49 return AllRootWindowsHaveModalBackgroundsForContainer( | 48 return AllRootWindowsHaveModalBackgroundsForContainer( |
| 50 internal::kShellWindowId_LockSystemModalContainer); | 49 kShellWindowId_LockSystemModalContainer); |
| 51 } | 50 } |
| 52 | 51 |
| 53 bool AllRootWindowsHaveModalBackgrounds() { | 52 bool AllRootWindowsHaveModalBackgrounds() { |
| 54 return AllRootWindowsHaveModalBackgroundsForContainer( | 53 return AllRootWindowsHaveModalBackgroundsForContainer( |
| 55 internal::kShellWindowId_SystemModalContainer); | 54 kShellWindowId_SystemModalContainer); |
| 56 } | 55 } |
| 57 | 56 |
| 58 class TestWindow : public views::WidgetDelegateView { | 57 class TestWindow : public views::WidgetDelegateView { |
| 59 public: | 58 public: |
| 60 explicit TestWindow(bool modal) : modal_(modal) {} | 59 explicit TestWindow(bool modal) : modal_(modal) {} |
| 61 virtual ~TestWindow() {} | 60 virtual ~TestWindow() {} |
| 62 | 61 |
| 63 // The window needs be closed from widget in order for | 62 // The window needs be closed from widget in order for |
| 64 // aura::client::kModalKey property to be reset. | 63 // aura::client::kModalKey property to be reset. |
| 65 static void CloseTestWindow(aura::Window* window) { | 64 static void CloseTestWindow(aura::Window* window) { |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 | 305 |
| 307 for (int block_reason = FIRST_BLOCK_REASON; | 306 for (int block_reason = FIRST_BLOCK_REASON; |
| 308 block_reason < NUMBER_OF_BLOCK_REASONS; | 307 block_reason < NUMBER_OF_BLOCK_REASONS; |
| 309 ++block_reason) { | 308 ++block_reason) { |
| 310 // Create a window in the lock screen container and ensure that it receives | 309 // Create a window in the lock screen container and ensure that it receives |
| 311 // the mouse event instead of the modal window (crbug.com/110920). | 310 // the mouse event instead of the modal window (crbug.com/110920). |
| 312 BlockUserSession(static_cast<UserSessionBlockReason>(block_reason)); | 311 BlockUserSession(static_cast<UserSessionBlockReason>(block_reason)); |
| 313 EventTestWindow* lock_delegate = new EventTestWindow(false); | 312 EventTestWindow* lock_delegate = new EventTestWindow(false); |
| 314 scoped_ptr<aura::Window> lock(lock_delegate->OpenTestWindowWithParent( | 313 scoped_ptr<aura::Window> lock(lock_delegate->OpenTestWindowWithParent( |
| 315 Shell::GetPrimaryRootWindowController()->GetContainer( | 314 Shell::GetPrimaryRootWindowController()->GetContainer( |
| 316 ash::internal::kShellWindowId_LockScreenContainer))); | 315 ash::kShellWindowId_LockScreenContainer))); |
| 317 EXPECT_TRUE(wm::IsActiveWindow(lock.get())); | 316 EXPECT_TRUE(wm::IsActiveWindow(lock.get())); |
| 318 e1.ClickLeftButton(); | 317 e1.ClickLeftButton(); |
| 319 EXPECT_EQ(1, lock_delegate->mouse_presses()); | 318 EXPECT_EQ(1, lock_delegate->mouse_presses()); |
| 320 | 319 |
| 321 // Make sure that a modal container created by the lock screen can still | 320 // Make sure that a modal container created by the lock screen can still |
| 322 // receive mouse events. | 321 // receive mouse events. |
| 323 EventTestWindow* lock_modal_delegate = new EventTestWindow(true); | 322 EventTestWindow* lock_modal_delegate = new EventTestWindow(true); |
| 324 aura::Window* lock_modal = | 323 aura::Window* lock_modal = |
| 325 lock_modal_delegate->OpenTestWindowWithParent(lock.get()); | 324 lock_modal_delegate->OpenTestWindowWithParent(lock.get()); |
| 326 EXPECT_TRUE(wm::IsActiveWindow(lock_modal)); | 325 EXPECT_TRUE(wm::IsActiveWindow(lock_modal)); |
| 327 e1.ClickLeftButton(); | 326 e1.ClickLeftButton(); |
| 328 // Verify that none of the other containers received any more mouse presses. | 327 // Verify that none of the other containers received any more mouse presses. |
| 329 EXPECT_EQ(1, lock_modal_delegate->mouse_presses()); | 328 EXPECT_EQ(1, lock_modal_delegate->mouse_presses()); |
| 330 EXPECT_EQ(1, lock_delegate->mouse_presses()); | 329 EXPECT_EQ(1, lock_delegate->mouse_presses()); |
| 331 EXPECT_EQ(1, main_delegate->mouse_presses()); | 330 EXPECT_EQ(1, main_delegate->mouse_presses()); |
| 332 EXPECT_EQ(1, transient_delegate->mouse_presses()); | 331 EXPECT_EQ(1, transient_delegate->mouse_presses()); |
| 333 UnblockUserSession(); | 332 UnblockUserSession(); |
| 334 } | 333 } |
| 335 } | 334 } |
| 336 | 335 |
| 337 // Makes sure we don't crash if a modal window is shown while the parent window | 336 // Makes sure we don't crash if a modal window is shown while the parent window |
| 338 // is hidden. | 337 // is hidden. |
| 339 TEST_F(SystemModalContainerLayoutManagerTest, ShowModalWhileHidden) { | 338 TEST_F(SystemModalContainerLayoutManagerTest, ShowModalWhileHidden) { |
| 340 // Hide the lock screen. | 339 // Hide the lock screen. |
| 341 Shell::GetPrimaryRootWindowController()->GetContainer( | 340 Shell::GetPrimaryRootWindowController() |
| 342 internal::kShellWindowId_SystemModalContainer)->layer()->SetOpacity(0); | 341 ->GetContainer(kShellWindowId_SystemModalContainer) |
| 342 ->layer() |
| 343 ->SetOpacity(0); |
| 343 | 344 |
| 344 // Create a modal window. | 345 // Create a modal window. |
| 345 scoped_ptr<aura::Window> parent(OpenToplevelTestWindow(false)); | 346 scoped_ptr<aura::Window> parent(OpenToplevelTestWindow(false)); |
| 346 scoped_ptr<aura::Window> modal_window( | 347 scoped_ptr<aura::Window> modal_window( |
| 347 OpenTestWindowWithParent(parent.get(), true)); | 348 OpenTestWindowWithParent(parent.get(), true)); |
| 348 parent->Show(); | 349 parent->Show(); |
| 349 modal_window->Show(); | 350 modal_window->Show(); |
| 350 } | 351 } |
| 351 | 352 |
| 352 // Verifies we generate a capture lost when showing a modal window. | 353 // Verifies we generate a capture lost when showing a modal window. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 EXPECT_FALSE(AllRootWindowsHaveLockedModalBackgrounds()); | 403 EXPECT_FALSE(AllRootWindowsHaveLockedModalBackgrounds()); |
| 403 | 404 |
| 404 for (int block_reason = FIRST_BLOCK_REASON; | 405 for (int block_reason = FIRST_BLOCK_REASON; |
| 405 block_reason < NUMBER_OF_BLOCK_REASONS; | 406 block_reason < NUMBER_OF_BLOCK_REASONS; |
| 406 ++block_reason) { | 407 ++block_reason) { |
| 407 // Normal system modal window while blocked. Shows blocked system modal | 408 // Normal system modal window while blocked. Shows blocked system modal |
| 408 // background. | 409 // background. |
| 409 BlockUserSession(static_cast<UserSessionBlockReason>(block_reason)); | 410 BlockUserSession(static_cast<UserSessionBlockReason>(block_reason)); |
| 410 scoped_ptr<aura::Window> lock_parent(OpenTestWindowWithParent( | 411 scoped_ptr<aura::Window> lock_parent(OpenTestWindowWithParent( |
| 411 Shell::GetPrimaryRootWindowController()->GetContainer( | 412 Shell::GetPrimaryRootWindowController()->GetContainer( |
| 412 ash::internal::kShellWindowId_LockScreenContainer), | 413 ash::kShellWindowId_LockScreenContainer), |
| 413 false)); | 414 false)); |
| 414 scoped_ptr<aura::Window> lock_modal_window(OpenTestWindowWithParent( | 415 scoped_ptr<aura::Window> lock_modal_window(OpenTestWindowWithParent( |
| 415 lock_parent.get(), true)); | 416 lock_parent.get(), true)); |
| 416 lock_parent->Show(); | 417 lock_parent->Show(); |
| 417 lock_modal_window->Show(); | 418 lock_modal_window->Show(); |
| 418 EXPECT_FALSE(AllRootWindowsHaveModalBackgrounds()); | 419 EXPECT_FALSE(AllRootWindowsHaveModalBackgrounds()); |
| 419 EXPECT_TRUE(AllRootWindowsHaveLockedModalBackgrounds()); | 420 EXPECT_TRUE(AllRootWindowsHaveLockedModalBackgrounds()); |
| 420 TestWindow::CloseTestWindow(lock_modal_window.release()); | 421 TestWindow::CloseTestWindow(lock_modal_window.release()); |
| 421 | 422 |
| 422 // Normal system modal window while blocked, but it belongs to the normal | 423 // Normal system modal window while blocked, but it belongs to the normal |
| (...skipping 17 matching lines...) Expand all Loading... |
| 440 return; | 441 return; |
| 441 | 442 |
| 442 UpdateDisplay("500x500,500x500"); | 443 UpdateDisplay("500x500,500x500"); |
| 443 | 444 |
| 444 scoped_ptr<aura::Window> normal(OpenToplevelTestWindow(false)); | 445 scoped_ptr<aura::Window> normal(OpenToplevelTestWindow(false)); |
| 445 normal->SetBounds(gfx::Rect(100, 100, 50, 50)); | 446 normal->SetBounds(gfx::Rect(100, 100, 50, 50)); |
| 446 | 447 |
| 447 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | 448 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
| 448 EXPECT_EQ(2U, root_windows.size()); | 449 EXPECT_EQ(2U, root_windows.size()); |
| 449 aura::Window* container1 = Shell::GetContainer( | 450 aura::Window* container1 = Shell::GetContainer( |
| 450 root_windows[0], ash::internal::kShellWindowId_SystemModalContainer); | 451 root_windows[0], ash::kShellWindowId_SystemModalContainer); |
| 451 aura::Window* container2 = Shell::GetContainer( | 452 aura::Window* container2 = Shell::GetContainer( |
| 452 root_windows[1], ash::internal::kShellWindowId_SystemModalContainer); | 453 root_windows[1], ash::kShellWindowId_SystemModalContainer); |
| 453 | 454 |
| 454 scoped_ptr<aura::Window> modal1( | 455 scoped_ptr<aura::Window> modal1( |
| 455 OpenTestWindowWithParent(container1, true)); | 456 OpenTestWindowWithParent(container1, true)); |
| 456 EXPECT_TRUE(AllRootWindowsHaveModalBackgrounds()); | 457 EXPECT_TRUE(AllRootWindowsHaveModalBackgrounds()); |
| 457 EXPECT_TRUE(wm::IsActiveWindow(modal1.get())); | 458 EXPECT_TRUE(wm::IsActiveWindow(modal1.get())); |
| 458 | 459 |
| 459 scoped_ptr<aura::Window> modal11( | 460 scoped_ptr<aura::Window> modal11( |
| 460 OpenTestWindowWithParent(container1, true)); | 461 OpenTestWindowWithParent(container1, true)); |
| 461 EXPECT_TRUE(wm::IsActiveWindow(modal11.get())); | 462 EXPECT_TRUE(wm::IsActiveWindow(modal11.get())); |
| 462 | 463 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 487 | 488 |
| 488 // No more modal screen. | 489 // No more modal screen. |
| 489 modal1->Hide(); | 490 modal1->Hide(); |
| 490 TestWindow::CloseTestWindow(modal1.release()); | 491 TestWindow::CloseTestWindow(modal1.release()); |
| 491 EXPECT_FALSE(AllRootWindowsHaveModalBackgrounds()); | 492 EXPECT_FALSE(AllRootWindowsHaveModalBackgrounds()); |
| 492 EXPECT_TRUE(wm::IsActiveWindow(normal.get())); | 493 EXPECT_TRUE(wm::IsActiveWindow(normal.get())); |
| 493 } | 494 } |
| 494 | 495 |
| 495 } // namespace test | 496 } // namespace test |
| 496 } // namespace ash | 497 } // namespace ash |
| OLD | NEW |