Index: services/ui/ws/window_manager_state_unittest.cc |
diff --git a/services/ui/ws/window_manager_state_unittest.cc b/services/ui/ws/window_manager_state_unittest.cc |
index 663cd7ffcb2ffe90e53f6aa03897f98bb2cb4b39..186f55f9d337517df6f38c0ed52f76bfadc23bf6 100644 |
--- a/services/ui/ws/window_manager_state_unittest.cc |
+++ b/services/ui/ws/window_manager_state_unittest.cc |
@@ -53,9 +53,12 @@ class WindowManagerStateTest : public testing::Test { |
Accelerator* accelerator); |
void OnEventAckTimeout(ClientSpecificId client_id); |
+ // This is the tree associated with the WindowManagerState. |
WindowTree* tree() { |
return window_event_targeting_helper_.window_server()->GetTreeWithId(1); |
} |
+ // This is *not* the tree associated with the WindowManagerState, use tree() |
+ // if you need the window manager tree. |
WindowTree* window_tree() { return window_tree_; } |
TestWindowTreeClient* window_tree_client() { return window_tree_client_; } |
ServerWindow* window() { return window_; } |
@@ -161,6 +164,13 @@ void WindowManagerStateTest::SetUp() { |
window_tree_client_->tracker()->changes()->clear(); |
} |
+void SetCanFocusUp(ServerWindow* window) { |
+ while (window) { |
+ window->set_can_focus(true); |
+ window = window->parent(); |
+ } |
+} |
+ |
// Tests that when an event is dispatched with no accelerator, that post target |
// accelerator is not triggered. |
TEST_F(WindowManagerStateTest, NullAccelerator) { |
@@ -198,6 +208,63 @@ TEST_F(WindowManagerStateTest, PostTargetAccelerator) { |
EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); |
} |
+// Tests that if a pre target accelerator consumes the event no other processing |
+// is done. |
+TEST_F(WindowManagerStateTest, PreTargetConsumed) { |
+ // Set up two trees with focus on a child in the second. |
+ const ClientWindowId child_window_id(11); |
+ window_tree()->NewWindow(child_window_id, ServerWindow::Properties()); |
+ ServerWindow* child_window = |
+ window_tree()->GetWindowByClientId(child_window_id); |
+ window_tree()->AddWindow(FirstRootId(window_tree()), child_window_id); |
+ child_window->SetVisible(true); |
+ SetCanFocusUp(child_window); |
+ tree()->GetDisplay(child_window)->AddActivationParent(child_window->parent()); |
+ ASSERT_TRUE(window_tree()->SetFocus(child_window_id)); |
+ |
+ // Register a pre-accelerator. |
+ uint32_t accelerator_id = 11; |
+ { |
+ mojom::EventMatcherPtr matcher = ui::CreateKeyMatcher( |
+ ui::mojom::KeyboardCode::W, ui::mojom::kEventFlagControlDown); |
+ ASSERT_TRUE(window_manager_state()->event_dispatcher()->AddAccelerator( |
+ accelerator_id, std::move(matcher))); |
+ } |
+ TestChangeTracker* tracker = wm_client()->tracker(); |
+ tracker->changes()->clear(); |
+ TestChangeTracker* tracker2 = window_tree_client()->tracker(); |
+ tracker2->changes()->clear(); |
+ |
+ // Send an ensure only the pre accelerator is called. |
+ ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
+ window_manager_state()->ProcessEvent(key); |
+ EXPECT_TRUE(window_manager()->on_accelerator_called()); |
+ EXPECT_EQ(accelerator_id, window_manager()->on_accelerator_id()); |
+ EXPECT_TRUE(tracker->changes()->empty()); |
+ EXPECT_TRUE(tracker2->changes()->empty()); |
+ |
+ // Ack the accelerator, saying we consumed it. |
+ WindowTreeTestApi(tree()).AckLastAccelerator(mojom::EventResult::HANDLED); |
+ // Nothing should change. |
+ EXPECT_TRUE(tracker->changes()->empty()); |
+ EXPECT_TRUE(tracker2->changes()->empty()); |
+ |
+ window_manager()->ClearAcceleratorCalled(); |
+ |
+ // Repeat, but respond with UNHANDLED. |
+ window_manager_state()->ProcessEvent(key); |
+ EXPECT_TRUE(window_manager()->on_accelerator_called()); |
+ EXPECT_EQ(accelerator_id, window_manager()->on_accelerator_id()); |
+ EXPECT_TRUE(tracker->changes()->empty()); |
+ EXPECT_TRUE(tracker2->changes()->empty()); |
+ WindowTreeTestApi(tree()).AckLastAccelerator(mojom::EventResult::UNHANDLED); |
+ |
+ EXPECT_TRUE(tracker->changes()->empty()); |
+ // The focused window should get the event. |
+ EXPECT_EQ("InputEvent window=0,11 event_action=7", |
+ SingleChangeToDescription(*tracker2->changes())); |
+} |
+ |
// Tests that when a client handles an event that post target accelerators are |
// not called. |
TEST_F(WindowManagerStateTest, ClientHandlesEvent) { |