| Index: components/mus/ws/window_tree_unittest.cc
|
| diff --git a/components/mus/ws/window_tree_unittest.cc b/components/mus/ws/window_tree_unittest.cc
|
| index f5bd32129697c1ef2e2524b599d698e0e46f1982..b89d19438fc2e07cbd20395224fadb52442c09f9 100644
|
| --- a/components/mus/ws/window_tree_unittest.cc
|
| +++ b/components/mus/ws/window_tree_unittest.cc
|
| @@ -331,6 +331,60 @@ TEST_F(WindowTreeTest, BasicInputEventTarget) {
|
| ChangesToDescription1(*embed_connection->tracker()->changes())[1]);
|
| }
|
|
|
| +// Tests that a client can observe events outside its bounds.
|
| +TEST_F(WindowTreeTest, SetEventObserver) {
|
| + // Create an embedded client.
|
| + TestWindowTreeClient* client = nullptr;
|
| + WindowTree* tree = nullptr;
|
| + ServerWindow* window = nullptr;
|
| + EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window));
|
| +
|
| + // Create an event outside the bounds of the client.
|
| + ui::PointerEvent pointer_down = CreatePointerDownEvent(5, 5);
|
| +
|
| + // Events are not observed before setting an observer.
|
| + DispatchEventAndAckImmediately(pointer_down);
|
| + ASSERT_EQ(0u, client->tracker()->changes()->size());
|
| +
|
| + // Create an observer for pointer-down events.
|
| + mojom::EventMatcherPtr matcher = mojom::EventMatcher::New();
|
| + matcher->type_matcher = mojom::EventTypeMatcher::New();
|
| + matcher->type_matcher->type = mojom::EventType::POINTER_DOWN;
|
| + WindowTreeTestApi(tree).SetEventObserver(std::move(matcher));
|
| +
|
| + // Pointer-down events are sent to the client.
|
| + DispatchEventAndAckImmediately(pointer_down);
|
| + ASSERT_EQ(1u, client->tracker()->changes()->size());
|
| + EXPECT_EQ("EventObserved event_action=4",
|
| + ChangesToDescription1(*client->tracker()->changes())[0]);
|
| + client->tracker()->changes()->clear();
|
| +
|
| + // Clearing the observer stops sending events to the client.
|
| + WindowTreeTestApi(tree).ClearEventObserver();
|
| + DispatchEventAndAckImmediately(pointer_down);
|
| + ASSERT_EQ(0u, client->tracker()->changes()->size());
|
| +}
|
| +
|
| +// Tests that a client using an event observer does not receive events that
|
| +// don't match the EventMatcher spec.
|
| +TEST_F(WindowTreeTest, SetEventObserverNonMatching) {
|
| + // Create an embedded client.
|
| + TestWindowTreeClient* client = nullptr;
|
| + WindowTree* tree = nullptr;
|
| + ServerWindow* window = nullptr;
|
| + EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window));
|
| +
|
| + // Create an observer for pointer-down events.
|
| + mojom::EventMatcherPtr matcher = mojom::EventMatcher::New();
|
| + matcher->type_matcher = mojom::EventTypeMatcher::New();
|
| + matcher->type_matcher->type = mojom::EventType::POINTER_DOWN;
|
| + WindowTreeTestApi(tree).SetEventObserver(std::move(matcher));
|
| +
|
| + // Pointer-up events are not sent to the client, since they don't match.
|
| + DispatchEventAndAckImmediately(CreatePointerUpEvent(5, 5));
|
| + ASSERT_EQ(0u, client->tracker()->changes()->size());
|
| +}
|
| +
|
| TEST_F(WindowTreeTest, CursorChangesWhenMouseOverWindowAndWindowSetsCursor) {
|
| TestWindowTreeClient* embed_connection = nullptr;
|
| WindowTree* tree = nullptr;
|
|
|