Index: ash/wm/system_modal_container_layout_manager_unittest.cc |
diff --git a/ash/wm/system_modal_container_layout_manager_unittest.cc b/ash/wm/system_modal_container_layout_manager_unittest.cc |
index 77ac061599da3eb7119488e3c75de18af3802fef..00226c7b4977246343790f21dbfbb2c248ec6b0c 100644 |
--- a/ash/wm/system_modal_container_layout_manager_unittest.cc |
+++ b/ash/wm/system_modal_container_layout_manager_unittest.cc |
@@ -20,6 +20,7 @@ |
#include "ui/aura/test/test_window_delegate.h" |
#include "ui/aura/window.h" |
#include "ui/aura/window_event_dispatcher.h" |
+#include "ui/base/hit_test.h" |
#include "ui/compositor/layer.h" |
#include "ui/compositor/scoped_animation_duration_scale_mode.h" |
#include "ui/compositor/test/layer_animator_test_controller.h" |
@@ -374,6 +375,93 @@ TEST_F(SystemModalContainerLayoutManagerTest, EventFocusContainers) { |
} |
} |
+TEST_F(SystemModalContainerLayoutManagerTest, ModalTransientChildEvents) { |
+ // Create a normal window and attempt to receive a click event. |
+ EventTestWindow* main_delegate = new EventTestWindow(false); |
+ std::unique_ptr<aura::Window> main( |
+ main_delegate->OpenTestWindowWithContext(CurrentContext())); |
+ EXPECT_TRUE(wm::IsActiveWindow(main.get())); |
+ ui::test::EventGenerator e1(Shell::GetPrimaryRootWindow(), main.get()); |
+ e1.ClickLeftButton(); |
+ EXPECT_EQ(1, main_delegate->mouse_presses()); |
+ |
+ // Create a modal window for the main window and verify that the main window |
+ // no longer receives mouse events. |
+ EventTestWindow* modal1_delegate = new EventTestWindow(true); |
+ aura::Window* modal1 = modal1_delegate->OpenTestWindowWithParent(main.get()); |
+ EXPECT_TRUE(wm::IsActiveWindow(modal1)); |
+ e1.ClickLeftButton(); |
+ EXPECT_EQ(1, modal1_delegate->mouse_presses()); |
+ EXPECT_EQ(1, main_delegate->mouse_presses()); |
+ |
+ // Create a non-modal transient child of modal1 and verify it receives mouse |
+ // events instead of main and modal1. |
+ EventTestWindow* modal1_transient_delegate = new EventTestWindow(false); |
+ aura::Window* modal1_transient = |
+ modal1_transient_delegate->OpenTestWindowWithParent(modal1); |
+ EXPECT_TRUE(wm::IsActiveWindow(modal1_transient)); |
+ e1.ClickLeftButton(); |
+ EXPECT_EQ(1, modal1_transient_delegate->mouse_presses()); |
+ EXPECT_EQ(1, modal1_delegate->mouse_presses()); |
+ EXPECT_EQ(1, main_delegate->mouse_presses()); |
+ |
+ // Create a child control for modal1_transient and it receives mouse events. |
+ aura::test::EventCountDelegate control_delegate; |
+ control_delegate.set_window_component(HTCLIENT); |
+ std::unique_ptr<aura::Window> child(new aura::Window(&control_delegate)); |
+ child->SetType(ui::wm::WINDOW_TYPE_CONTROL); |
+ child->Init(ui::LAYER_TEXTURED); |
+ modal1_transient->AddChild(child.get()); |
+ child->SetBounds(gfx::Rect(100, 100)); |
+ child->Show(); |
+ e1.ClickLeftButton(); |
+ EXPECT_EQ("1 1", control_delegate.GetMouseButtonCountsAndReset()); |
+ EXPECT_EQ(1, modal1_transient_delegate->mouse_presses()); |
+ EXPECT_EQ(1, modal1_delegate->mouse_presses()); |
+ EXPECT_EQ(1, main_delegate->mouse_presses()); |
+ |
+ // Create another modal window for the main window and it receives mouse |
+ // events instead of all others. |
+ EventTestWindow* modal2_delegate = new EventTestWindow(true); |
+ aura::Window* modal2 = modal2_delegate->OpenTestWindowWithParent(main.get()); |
+ EXPECT_TRUE(wm::IsActiveWindow(modal2)); |
+ e1.ClickLeftButton(); |
+ EXPECT_EQ(1, modal2_delegate->mouse_presses()); |
+ EXPECT_EQ("0 0", control_delegate.GetMouseButtonCountsAndReset()); |
+ EXPECT_EQ(1, modal1_transient_delegate->mouse_presses()); |
+ EXPECT_EQ(1, modal1_delegate->mouse_presses()); |
+ EXPECT_EQ(1, main_delegate->mouse_presses()); |
+ |
+ // Create a non-modal transient child of modal2 and it receives events. |
+ EventTestWindow* modal2_transient_delegate = new EventTestWindow(false); |
+ aura::Window* modal2_transient = |
+ modal2_transient_delegate->OpenTestWindowWithParent(modal2); |
+ EXPECT_TRUE(wm::IsActiveWindow(modal2_transient)); |
+ e1.ClickLeftButton(); |
+ EXPECT_EQ(1, modal2_transient_delegate->mouse_presses()); |
+ EXPECT_EQ(1, modal2_delegate->mouse_presses()); |
+ EXPECT_EQ("0 0", control_delegate.GetMouseButtonCountsAndReset()); |
+ EXPECT_EQ(1, modal1_transient_delegate->mouse_presses()); |
+ EXPECT_EQ(1, modal1_delegate->mouse_presses()); |
+ EXPECT_EQ(1, main_delegate->mouse_presses()); |
+ |
+ // Create a non-modal transient grandchild of modal2 and it receives events. |
+ EventTestWindow* modal2_transient_grandchild_delegate = |
+ new EventTestWindow(false); |
+ aura::Window* modal2_transient_grandchild = |
+ modal2_transient_grandchild_delegate->OpenTestWindowWithParent( |
+ modal2_transient); |
+ EXPECT_TRUE(wm::IsActiveWindow(modal2_transient_grandchild)); |
+ e1.ClickLeftButton(); |
+ EXPECT_EQ(1, modal2_transient_grandchild_delegate->mouse_presses()); |
+ EXPECT_EQ(1, modal2_transient_delegate->mouse_presses()); |
+ EXPECT_EQ(1, modal2_delegate->mouse_presses()); |
+ EXPECT_EQ("0 0", control_delegate.GetMouseButtonCountsAndReset()); |
+ EXPECT_EQ(1, modal1_transient_delegate->mouse_presses()); |
+ EXPECT_EQ(1, modal1_delegate->mouse_presses()); |
+ EXPECT_EQ(1, main_delegate->mouse_presses()); |
+} |
+ |
// Makes sure we don't crash if a modal window is shown while the parent window |
// is hidden. |
TEST_F(SystemModalContainerLayoutManagerTest, ShowModalWhileHidden) { |