| 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 "services/ui/ws/window_tree.h" | 5 #include "services/ui/ws/window_tree.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window)); | 318 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window)); |
| 319 | 319 |
| 320 // Create an event outside the bounds of the client. | 320 // Create an event outside the bounds of the client. |
| 321 ui::PointerEvent pointer_down = CreatePointerDownEvent(5, 5); | 321 ui::PointerEvent pointer_down = CreatePointerDownEvent(5, 5); |
| 322 | 322 |
| 323 // Events are not observed before setting an observer. | 323 // Events are not observed before setting an observer. |
| 324 DispatchEventAndAckImmediately(pointer_down); | 324 DispatchEventAndAckImmediately(pointer_down); |
| 325 ASSERT_EQ(0u, client->tracker()->changes()->size()); | 325 ASSERT_EQ(0u, client->tracker()->changes()->size()); |
| 326 | 326 |
| 327 // Create an observer for pointer-down events. | 327 // Create an observer for pointer-down events. |
| 328 WindowTreeTestApi(tree).SetEventObserver( | 328 WindowTreeTestApi(tree).AddEventObserver( |
| 329 CreateEventMatcher(ui::mojom::EventType::POINTER_DOWN), 111u); | 329 CreateEventMatcher(ui::mojom::EventType::POINTER_DOWN), 111u); |
| 330 | 330 |
| 331 // Pointer-down events are sent to the client. | 331 // Pointer-down events are sent to the client. |
| 332 DispatchEventAndAckImmediately(pointer_down); | 332 DispatchEventAndAckImmediately(pointer_down); |
| 333 ASSERT_EQ(1u, client->tracker()->changes()->size()); | 333 ASSERT_EQ(1u, client->tracker()->changes()->size()); |
| 334 EXPECT_EQ("EventObserved event_action=16 event_observer_id=111", | 334 EXPECT_EQ("EventObserved event_action=16 event_observer_id=111", |
| 335 ChangesToDescription1(*client->tracker()->changes())[0]); | 335 ChangesToDescription1(*client->tracker()->changes())[0]); |
| 336 client->tracker()->changes()->clear(); | 336 client->tracker()->changes()->clear(); |
| 337 | 337 |
| 338 // Clearing the observer stops sending events to the client. | 338 // Clearing the observer stops sending events to the client. |
| 339 WindowTreeTestApi(tree).SetEventObserver(nullptr, 0u); | 339 WindowTreeTestApi(tree).RemoveEventObserver(111u); |
| 340 DispatchEventAndAckImmediately(pointer_down); | 340 DispatchEventAndAckImmediately(pointer_down); |
| 341 ASSERT_EQ(0u, client->tracker()->changes()->size()); | 341 ASSERT_EQ(0u, client->tracker()->changes()->size()); |
| 342 } | 342 } |
| 343 | 343 |
| 344 // Tests that a client using an event observer does not receive events that | 344 // Tests that a client using an event observer does not receive events that |
| 345 // don't match the EventMatcher spec. | 345 // don't match the EventMatcher spec. |
| 346 TEST_F(WindowTreeTest, SetEventObserverNonMatching) { | 346 TEST_F(WindowTreeTest, SetEventObserverNonMatching) { |
| 347 // Create an embedded client. | 347 // Create an embedded client. |
| 348 TestWindowTreeClient* client = nullptr; | 348 TestWindowTreeClient* client = nullptr; |
| 349 WindowTree* tree = nullptr; | 349 WindowTree* tree = nullptr; |
| 350 ServerWindow* window = nullptr; | 350 ServerWindow* window = nullptr; |
| 351 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window)); | 351 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window)); |
| 352 | 352 |
| 353 // Create an observer for pointer-down events. | 353 // Create an observer for pointer-down events. |
| 354 WindowTreeTestApi(tree).SetEventObserver( | 354 WindowTreeTestApi(tree).AddEventObserver( |
| 355 CreateEventMatcher(ui::mojom::EventType::POINTER_DOWN), 111u); | 355 CreateEventMatcher(ui::mojom::EventType::POINTER_DOWN), 111u); |
| 356 | 356 |
| 357 // Pointer-up events are not sent to the client, since they don't match. | 357 // Pointer-up events are not sent to the client, since they don't match. |
| 358 DispatchEventAndAckImmediately(CreatePointerUpEvent(5, 5)); | 358 DispatchEventAndAckImmediately(CreatePointerUpEvent(5, 5)); |
| 359 ASSERT_EQ(0u, client->tracker()->changes()->size()); | 359 ASSERT_EQ(0u, client->tracker()->changes()->size()); |
| 360 } | 360 } |
| 361 | 361 |
| 362 // Tests that an event that both hits a client window and matches an event | 362 // Tests that an event that both hits a client window and matches an event |
| 363 // observer is sent only once to the client. | 363 // observer is sent only once to the client. |
| 364 TEST_F(WindowTreeTest, SetEventObserverSendsOnce) { | 364 TEST_F(WindowTreeTest, SetEventObserverSendsOnce) { |
| 365 // Create an embedded client. | 365 // Create an embedded client. |
| 366 TestWindowTreeClient* client = nullptr; | 366 TestWindowTreeClient* client = nullptr; |
| 367 WindowTree* tree = nullptr; | 367 WindowTree* tree = nullptr; |
| 368 ServerWindow* window = nullptr; | 368 ServerWindow* window = nullptr; |
| 369 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window)); | 369 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window)); |
| 370 | 370 |
| 371 // Create an observer for pointer-up events (which do not cause focus | 371 // Create an observer for pointer-up events (which do not cause focus |
| 372 // changes). | 372 // changes). |
| 373 WindowTreeTestApi(tree).SetEventObserver( | 373 WindowTreeTestApi(tree).AddEventObserver( |
| 374 CreateEventMatcher(ui::mojom::EventType::POINTER_UP), 111u); | 374 CreateEventMatcher(ui::mojom::EventType::POINTER_UP), 111u); |
| 375 | 375 |
| 376 // Create an event inside the bounds of the client. | 376 // Create an event inside the bounds of the client. |
| 377 ui::PointerEvent pointer_up = CreatePointerUpEvent(25, 25); | 377 ui::PointerEvent pointer_up = CreatePointerUpEvent(25, 25); |
| 378 | 378 |
| 379 // The event is dispatched once, with a flag set that it matched the event | 379 // The event is dispatched once, with a flag set that it matched the event |
| 380 // observer. | 380 // observer. |
| 381 DispatchEventAndAckImmediately(pointer_up); | 381 DispatchEventAndAckImmediately(pointer_up); |
| 382 ASSERT_EQ(1u, client->tracker()->changes()->size()); | 382 ASSERT_EQ(1u, client->tracker()->changes()->size()); |
| 383 EXPECT_EQ("InputEvent window=2,1 event_action=18 event_observer_id=111", | 383 EXPECT_EQ("InputEvent window=2,1 event_action=18 event_observer_id=111", |
| 384 SingleChangeToDescription(*client->tracker()->changes())); | 384 SingleChangeToDescription(*client->tracker()->changes())); |
| 385 } | 385 } |
| 386 | 386 |
| 387 // Tests that events generated by user A are not observed by event observers for | 387 // Tests that events generated by user A are not observed by event observers for |
| 388 // user B. | 388 // user B. |
| 389 TEST_F(WindowTreeTest, SetEventObserverWrongUser) { | 389 TEST_F(WindowTreeTest, SetEventObserverWrongUser) { |
| 390 // Embed a window tree belonging to a different user. | 390 // Embed a window tree belonging to a different user. |
| 391 TestWindowTreeBinding* other_binding; | 391 TestWindowTreeBinding* other_binding; |
| 392 WindowTree* other_tree = CreateNewTree("other_user", &other_binding); | 392 WindowTree* other_tree = CreateNewTree("other_user", &other_binding); |
| 393 other_binding->client()->tracker()->changes()->clear(); | 393 other_binding->client()->tracker()->changes()->clear(); |
| 394 | 394 |
| 395 // Set event observers on both the wm tree and the other user's tree. | 395 // Set event observers on both the wm tree and the other user's tree. |
| 396 WindowTreeTestApi(wm_tree()).SetEventObserver( | 396 WindowTreeTestApi(wm_tree()).AddEventObserver( |
| 397 CreateEventMatcher(ui::mojom::EventType::POINTER_UP), 111u); | 397 CreateEventMatcher(ui::mojom::EventType::POINTER_UP), 111u); |
| 398 WindowTreeTestApi(other_tree) | 398 WindowTreeTestApi(other_tree) |
| 399 .SetEventObserver(CreateEventMatcher(ui::mojom::EventType::POINTER_UP), | 399 .AddEventObserver(CreateEventMatcher(ui::mojom::EventType::POINTER_UP), |
| 400 222u); | 400 222u); |
| 401 | 401 |
| 402 // An event is observed by the wm tree, but not by the other user's tree. | 402 // An event is observed by the wm tree, but not by the other user's tree. |
| 403 DispatchEventAndAckImmediately(CreatePointerUpEvent(5, 5)); | 403 DispatchEventAndAckImmediately(CreatePointerUpEvent(5, 5)); |
| 404 ASSERT_EQ(1u, wm_client()->tracker()->changes()->size()); | 404 ASSERT_EQ(1u, wm_client()->tracker()->changes()->size()); |
| 405 EXPECT_EQ("InputEvent window=0,3 event_action=18 event_observer_id=111", | 405 EXPECT_EQ("InputEvent window=0,3 event_action=18 event_observer_id=111", |
| 406 SingleChangeToDescription(*wm_client()->tracker()->changes())); | 406 SingleChangeToDescription(*wm_client()->tracker()->changes())); |
| 407 ASSERT_EQ(0u, other_binding->client()->tracker()->changes()->size()); | 407 ASSERT_EQ(0u, other_binding->client()->tracker()->changes()->size()); |
| 408 } | 408 } |
| 409 | 409 |
| 410 // Tests that an event observer cannot observe keystrokes. | 410 // Tests that an event observer cannot observe keystrokes. |
| 411 TEST_F(WindowTreeTest, SetEventObserverKeyEventsDisallowed) { | 411 TEST_F(WindowTreeTest, SetEventObserverKeyEventsDisallowed) { |
| 412 WindowTreeTestApi(wm_tree()).SetEventObserver( | 412 WindowTreeTestApi(wm_tree()).AddEventObserver( |
| 413 CreateEventMatcher(ui::mojom::EventType::KEY_PRESSED), 111u); | 413 CreateEventMatcher(ui::mojom::EventType::KEY_PRESSED), 111u); |
| 414 ui::KeyEvent key_pressed(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE); | 414 ui::KeyEvent key_pressed(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE); |
| 415 DispatchEventAndAckImmediately(key_pressed); | 415 DispatchEventAndAckImmediately(key_pressed); |
| 416 EXPECT_EQ(0u, wm_client()->tracker()->changes()->size()); | 416 EXPECT_EQ(0u, wm_client()->tracker()->changes()->size()); |
| 417 | 417 |
| 418 WindowTreeTestApi(wm_tree()).SetEventObserver( | 418 WindowTreeTestApi(wm_tree()).AddEventObserver( |
| 419 CreateEventMatcher(ui::mojom::EventType::KEY_RELEASED), 222u); | 419 CreateEventMatcher(ui::mojom::EventType::KEY_RELEASED), 222u); |
| 420 ui::KeyEvent key_released(ui::ET_KEY_RELEASED, ui::VKEY_A, ui::EF_NONE); | 420 ui::KeyEvent key_released(ui::ET_KEY_RELEASED, ui::VKEY_A, ui::EF_NONE); |
| 421 DispatchEventAndAckImmediately(key_released); | 421 DispatchEventAndAckImmediately(key_released); |
| 422 EXPECT_EQ(0u, wm_client()->tracker()->changes()->size()); | 422 EXPECT_EQ(0u, wm_client()->tracker()->changes()->size()); |
| 423 } | 423 } |
| 424 | 424 |
| 425 TEST_F(WindowTreeTest, CursorChangesWhenMouseOverWindowAndWindowSetsCursor) { | 425 TEST_F(WindowTreeTest, CursorChangesWhenMouseOverWindowAndWindowSetsCursor) { |
| 426 TestWindowTreeClient* embed_client = nullptr; | 426 TestWindowTreeClient* embed_client = nullptr; |
| 427 WindowTree* tree = nullptr; | 427 WindowTree* tree = nullptr; |
| 428 ServerWindow* window = nullptr; | 428 ServerWindow* window = nullptr; |
| (...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1241 kChangeId, kInvalidWindowId, mojom::MoveLoopSource::MOUSE, | 1241 kChangeId, kInvalidWindowId, mojom::MoveLoopSource::MOUSE, |
| 1242 gfx::Point(0, 0)); | 1242 gfx::Point(0, 0)); |
| 1243 | 1243 |
| 1244 EXPECT_EQ("ChangeCompleted id=8 sucess=false", | 1244 EXPECT_EQ("ChangeCompleted id=8 sucess=false", |
| 1245 SingleChangeToDescription(*embed_client->tracker()->changes())); | 1245 SingleChangeToDescription(*embed_client->tracker()->changes())); |
| 1246 } | 1246 } |
| 1247 | 1247 |
| 1248 } // namespace test | 1248 } // namespace test |
| 1249 } // namespace ws | 1249 } // namespace ws |
| 1250 } // namespace ui | 1250 } // namespace ui |
| OLD | NEW |