| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/public/cpp/window_tree_client.h" | 5 #include "services/ui/public/cpp/window_tree_client.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 WindowTreeSetup setup; | 443 WindowTreeSetup setup; |
| 444 Window* root = setup.GetFirstRoot(); | 444 Window* root = setup.GetFirstRoot(); |
| 445 ASSERT_TRUE(root); | 445 ASSERT_TRUE(root); |
| 446 | 446 |
| 447 TestInputEventHandler event_handler; | 447 TestInputEventHandler event_handler; |
| 448 root->set_input_event_handler(&event_handler); | 448 root->set_input_event_handler(&event_handler); |
| 449 | 449 |
| 450 std::unique_ptr<ui::Event> ui_event( | 450 std::unique_ptr<ui::Event> ui_event( |
| 451 new ui::MouseEvent(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), | 451 new ui::MouseEvent(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), |
| 452 ui::EventTimeForNow(), ui::EF_NONE, 0)); | 452 ui::EventTimeForNow(), ui::EF_NONE, 0)); |
| 453 mojo::Array<uint32_t> event_observer_ids; |
| 454 event_observer_ids.push_back(0); |
| 453 setup.window_tree_client()->OnWindowInputEvent( | 455 setup.window_tree_client()->OnWindowInputEvent( |
| 454 1, server_id(root), ui::Event::Clone(*ui_event.get()), 0); | 456 1, server_id(root), ui::Event::Clone(*ui_event.get()), |
| 457 std::move(event_observer_ids)); |
| 455 EXPECT_TRUE(event_handler.received_event()); | 458 EXPECT_TRUE(event_handler.received_event()); |
| 456 EXPECT_TRUE(setup.window_tree()->WasEventAcked(1)); | 459 EXPECT_TRUE(setup.window_tree()->WasEventAcked(1)); |
| 457 event_handler.Reset(); | 460 event_handler.Reset(); |
| 458 | 461 |
| 459 event_handler.set_should_manually_ack(); | 462 event_handler.set_should_manually_ack(); |
| 460 setup.window_tree_client()->OnWindowInputEvent( | 463 setup.window_tree_client()->OnWindowInputEvent( |
| 461 33, server_id(root), ui::Event::Clone(*ui_event.get()), 0); | 464 33, server_id(root), ui::Event::Clone(*ui_event.get()), |
| 465 std::move(event_observer_ids)); |
| 462 EXPECT_TRUE(event_handler.received_event()); | 466 EXPECT_TRUE(event_handler.received_event()); |
| 463 EXPECT_FALSE(setup.window_tree()->WasEventAcked(33)); | 467 EXPECT_FALSE(setup.window_tree()->WasEventAcked(33)); |
| 464 | 468 |
| 465 event_handler.AckEvent(); | 469 event_handler.AckEvent(); |
| 466 EXPECT_TRUE(setup.window_tree()->WasEventAcked(33)); | 470 EXPECT_TRUE(setup.window_tree()->WasEventAcked(33)); |
| 467 } | 471 } |
| 468 | 472 |
| 469 // Tests event observers triggered by events that did not hit a target in this | 473 // Tests event observers triggered by events that did not hit a target in this |
| 470 // window tree. | 474 // window tree. |
| 471 TEST_F(WindowTreeClientTest, OnEventObserved) { | 475 TEST_F(WindowTreeClientTest, OnEventObserved) { |
| 472 WindowTreeSetup setup; | 476 WindowTreeSetup setup; |
| 473 Window* root = setup.GetFirstRoot(); | 477 Window* root = setup.GetFirstRoot(); |
| 474 ASSERT_TRUE(root); | 478 ASSERT_TRUE(root); |
| 475 | 479 |
| 476 // Set up an event observer. | 480 // Set up an event observer. |
| 477 mojom::EventMatcherPtr matcher = mojom::EventMatcher::New(); | 481 mojom::EventMatcherPtr matcher = mojom::EventMatcher::New(); |
| 478 matcher->type_matcher = mojom::EventTypeMatcher::New(); | 482 matcher->type_matcher = mojom::EventTypeMatcher::New(); |
| 479 matcher->type_matcher->type = ui::mojom::EventType::POINTER_DOWN; | 483 matcher->type_matcher->type = ui::mojom::EventType::POINTER_DOWN; |
| 480 setup.client()->SetEventObserver(std::move(matcher)); | 484 uint32_t observer_id = setup.client()->AddEventObserver(std::move(matcher)); |
| 481 | 485 |
| 482 // Simulate the server sending an observed event. | 486 // Simulate the server sending an observed event. |
| 483 uint32_t event_observer_id = setup.GetEventObserverId(); | 487 uint32_t event_observer_id = setup.GetEventObserverId(); |
| 488 mojo::Array<uint32_t> event_observer_ids; |
| 489 event_observer_ids.push_back(event_observer_id); |
| 484 std::unique_ptr<ui::Event> ui_event( | 490 std::unique_ptr<ui::Event> ui_event( |
| 485 new ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), | 491 new ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), |
| 486 ui::EventTimeForNow(), ui::EF_CONTROL_DOWN, 0)); | 492 ui::EventTimeForNow(), ui::EF_CONTROL_DOWN, 0)); |
| 487 setup.window_tree_client()->OnEventObserved(ui::Event::Clone(*ui_event.get()), | 493 setup.window_tree_client()->OnEventObserved(ui::Event::Clone(*ui_event.get()), |
| 488 event_observer_id); | 494 std::move(event_observer_ids)); |
| 489 | 495 |
| 490 // Delegate sensed the event. | 496 // Delegate sensed the event. |
| 491 ui::Event* last_event = setup.window_tree_delegate()->last_event_observed(); | 497 ui::Event* last_event = setup.window_tree_delegate()->last_event_observed(); |
| 492 EXPECT_EQ(ui::ET_MOUSE_PRESSED, last_event->type()); | 498 EXPECT_EQ(ui::ET_MOUSE_PRESSED, last_event->type()); |
| 493 EXPECT_EQ(ui::EF_CONTROL_DOWN, last_event->flags()); | 499 EXPECT_EQ(ui::EF_CONTROL_DOWN, last_event->flags()); |
| 494 setup.window_tree_delegate()->Reset(); | 500 setup.window_tree_delegate()->Reset(); |
| 495 | 501 |
| 496 // Clear the event observer. | 502 // Clear the event observer. |
| 497 setup.client()->SetEventObserver(nullptr); | 503 setup.client()->RemoveEventObserver(observer_id); |
| 498 | 504 |
| 499 // Simulate another event from the server. | 505 // Simulate another event from the server. |
| 500 setup.window_tree_client()->OnEventObserved(ui::Event::Clone(*ui_event.get()), | 506 setup.window_tree_client()->OnEventObserved(ui::Event::Clone(*ui_event.get()), |
| 501 event_observer_id); | 507 std::move(event_observer_ids)); |
| 502 | 508 |
| 503 // No event was sensed. | 509 // No event was sensed. |
| 504 EXPECT_FALSE(setup.window_tree_delegate()->last_event_observed()); | 510 EXPECT_FALSE(setup.window_tree_delegate()->last_event_observed()); |
| 505 } | 511 } |
| 506 | 512 |
| 507 // Tests event observers triggered by events that hit this window tree. | 513 // Tests event observers triggered by events that hit this window tree. |
| 508 TEST_F(WindowTreeClientTest, OnWindowInputEventWithEventObserver) { | 514 TEST_F(WindowTreeClientTest, OnWindowInputEventWithEventObserver) { |
| 509 WindowTreeSetup setup; | 515 WindowTreeSetup setup; |
| 510 Window* root = setup.GetFirstRoot(); | 516 Window* root = setup.GetFirstRoot(); |
| 511 ASSERT_TRUE(root); | 517 ASSERT_TRUE(root); |
| 512 | 518 |
| 513 // Set up an event observer. | 519 // Set up an event observer. |
| 514 mojom::EventMatcherPtr matcher = mojom::EventMatcher::New(); | 520 mojom::EventMatcherPtr matcher = mojom::EventMatcher::New(); |
| 515 matcher->type_matcher = mojom::EventTypeMatcher::New(); | 521 matcher->type_matcher = mojom::EventTypeMatcher::New(); |
| 516 matcher->type_matcher->type = ui::mojom::EventType::POINTER_DOWN; | 522 matcher->type_matcher->type = ui::mojom::EventType::POINTER_DOWN; |
| 517 setup.client()->SetEventObserver(std::move(matcher)); | 523 setup.client()->AddEventObserver(std::move(matcher)); |
| 518 | 524 |
| 519 // Simulate the server dispatching an event that also matched the observer. | 525 // Simulate the server dispatching an event that also matched the observer. |
| 520 uint32_t event_observer_id = setup.GetEventObserverId(); | 526 uint32_t event_observer_id = setup.GetEventObserverId(); |
| 527 mojo::Array<uint32_t> event_observer_ids; |
| 528 event_observer_ids.push_back(event_observer_id); |
| 521 std::unique_ptr<ui::Event> ui_event( | 529 std::unique_ptr<ui::Event> ui_event( |
| 522 new ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), | 530 new ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), |
| 523 ui::EventTimeForNow(), ui::EF_CONTROL_DOWN, 0)); | 531 ui::EventTimeForNow(), ui::EF_CONTROL_DOWN, 0)); |
| 524 setup.window_tree_client()->OnWindowInputEvent( | 532 setup.window_tree_client()->OnWindowInputEvent( |
| 525 1, server_id(root), std::move(ui_event), event_observer_id); | 533 1, server_id(root), std::move(ui_event), std::move(event_observer_ids)); |
| 526 | 534 |
| 527 // Delegate sensed the event. | 535 // Delegate sensed the event. |
| 528 ui::Event* last_event = setup.window_tree_delegate()->last_event_observed(); | 536 ui::Event* last_event = setup.window_tree_delegate()->last_event_observed(); |
| 529 EXPECT_EQ(ui::ET_MOUSE_PRESSED, last_event->type()); | 537 EXPECT_EQ(ui::ET_MOUSE_PRESSED, last_event->type()); |
| 530 EXPECT_EQ(ui::EF_CONTROL_DOWN, last_event->flags()); | 538 EXPECT_EQ(ui::EF_CONTROL_DOWN, last_event->flags()); |
| 531 } | 539 } |
| 532 | 540 |
| 533 // Tests that replacing an event observer with a new one results in only new | 541 // Tests that adding another event observer should observe both events. |
| 534 // events being observed. | 542 TEST_F(WindowTreeClientTest, EventObserverMult) { |
| 535 TEST_F(WindowTreeClientTest, EventObserverReplaced) { | |
| 536 WindowTreeSetup setup; | 543 WindowTreeSetup setup; |
| 537 Window* root = setup.GetFirstRoot(); | 544 Window* root = setup.GetFirstRoot(); |
| 538 ASSERT_TRUE(root); | 545 ASSERT_TRUE(root); |
| 539 | 546 |
| 540 // Set up an event observer. | 547 // Set up an event observer. |
| 541 mojom::EventMatcherPtr matcher1 = mojom::EventMatcher::New(); | 548 mojom::EventMatcherPtr matcher1 = mojom::EventMatcher::New(); |
| 542 matcher1->type_matcher = mojom::EventTypeMatcher::New(); | 549 matcher1->type_matcher = mojom::EventTypeMatcher::New(); |
| 543 matcher1->type_matcher->type = ui::mojom::EventType::POINTER_DOWN; | 550 matcher1->type_matcher->type = ui::mojom::EventType::POINTER_DOWN; |
| 544 setup.client()->SetEventObserver(std::move(matcher1)); | 551 setup.client()->AddEventObserver(std::move(matcher1)); |
| 545 uint32_t event_observer_id1 = setup.GetEventObserverId(); | 552 uint32_t event_observer_id1 = setup.GetEventObserverId(); |
| 553 mojo::Array<uint32_t> event_observer_ids1; |
| 554 event_observer_ids1.push_back(event_observer_id1); |
| 546 | 555 |
| 547 // Replace it with a second observer. | 556 // Add a second observer. |
| 548 mojom::EventMatcherPtr matcher2 = mojom::EventMatcher::New(); | 557 mojom::EventMatcherPtr matcher2 = mojom::EventMatcher::New(); |
| 549 matcher2->type_matcher = mojom::EventTypeMatcher::New(); | 558 matcher2->type_matcher = mojom::EventTypeMatcher::New(); |
| 550 matcher2->type_matcher->type = ui::mojom::EventType::POINTER_UP; | 559 matcher2->type_matcher->type = ui::mojom::EventType::POINTER_UP; |
| 551 setup.client()->SetEventObserver(std::move(matcher2)); | 560 setup.client()->AddEventObserver(std::move(matcher2)); |
| 552 uint32_t event_observer_id2 = setup.GetEventObserverId(); | 561 uint32_t event_observer_id2 = setup.GetEventObserverId(); |
| 562 mojo::Array<uint32_t> event_observer_ids2; |
| 563 event_observer_ids2.push_back(event_observer_id2); |
| 553 | 564 |
| 554 // Simulate the server sending an observed event that matched the old observer | 565 // Simulate the server sending an observed event that matched the old observer |
| 555 // (e.g. that was in-flight when the observer was replaced). | 566 // (e.g. that was in-flight when the observer was replaced). |
| 556 std::unique_ptr<ui::Event> pressed_event( | 567 std::unique_ptr<ui::Event> pressed_event( |
| 557 new ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), | 568 new ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), |
| 558 ui::EventTimeForNow(), ui::EF_NONE, 0)); | 569 ui::EventTimeForNow(), ui::EF_NONE, 0)); |
| 559 setup.window_tree_client()->OnEventObserved(std::move(pressed_event), | 570 setup.window_tree_client()->OnEventObserved(std::move(pressed_event), |
| 560 event_observer_id1); | 571 std::move(event_observer_ids1)); |
| 561 | 572 |
| 562 // The event was not sensed, because it does not match the current observer. | 573 // The event should be sensed, because it matches the first observer. |
| 563 EXPECT_FALSE(setup.window_tree_delegate()->last_event_observed()); | 574 EXPECT_TRUE(setup.window_tree_delegate()->last_event_observed()); |
| 575 // The delegate sensed the event. |
| 576 ui::Event* last_event = setup.window_tree_delegate()->last_event_observed(); |
| 577 EXPECT_EQ(ui::ET_MOUSE_PRESSED, last_event->type()); |
| 578 EXPECT_EQ(ui::EF_NONE, last_event->flags()); |
| 564 | 579 |
| 565 // Simulate another event that matches the new observer. | 580 // Simulate another event that matches the second observer. |
| 566 std::unique_ptr<ui::Event> released_event( | 581 std::unique_ptr<ui::Event> released_event( |
| 567 new ui::MouseEvent(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), | 582 new ui::MouseEvent(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), |
| 568 ui::EventTimeForNow(), ui::EF_CONTROL_DOWN, 0)); | 583 ui::EventTimeForNow(), ui::EF_CONTROL_DOWN, 0)); |
| 569 setup.window_tree_client()->OnEventObserved(std::move(released_event), | 584 setup.window_tree_client()->OnEventObserved(std::move(released_event), |
| 570 event_observer_id2); | 585 std::move(event_observer_ids2)); |
| 571 | 586 |
| 587 EXPECT_TRUE(setup.window_tree_delegate()->last_event_observed()); |
| 572 // The delegate sensed the event. | 588 // The delegate sensed the event. |
| 573 ui::Event* last_event = setup.window_tree_delegate()->last_event_observed(); | 589 last_event = setup.window_tree_delegate()->last_event_observed(); |
| 574 EXPECT_EQ(ui::ET_MOUSE_RELEASED, last_event->type()); | 590 EXPECT_EQ(ui::ET_MOUSE_RELEASED, last_event->type()); |
| 575 EXPECT_EQ(ui::EF_CONTROL_DOWN, last_event->flags()); | 591 EXPECT_EQ(ui::EF_CONTROL_DOWN, last_event->flags()); |
| 576 } | 592 } |
| 577 | 593 |
| 578 // Verifies focus is reverted if the server replied that the change failed. | 594 // Verifies focus is reverted if the server replied that the change failed. |
| 579 TEST_F(WindowTreeClientTest, SetFocusFailed) { | 595 TEST_F(WindowTreeClientTest, SetFocusFailed) { |
| 580 WindowTreeSetup setup; | 596 WindowTreeSetup setup; |
| 581 Window* root = setup.GetFirstRoot(); | 597 Window* root = setup.GetFirstRoot(); |
| 582 ASSERT_TRUE(root); | 598 ASSERT_TRUE(root); |
| 583 root->SetVisible(true); | 599 root->SetVisible(true); |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1042 | 1058 |
| 1043 // Create a new Window, and attempt to place capture on that. | 1059 // Create a new Window, and attempt to place capture on that. |
| 1044 Window* child = setup.client()->NewWindow(); | 1060 Window* child = setup.client()->NewWindow(); |
| 1045 child->SetVisible(true); | 1061 child->SetVisible(true); |
| 1046 root->AddChild(child); | 1062 root->AddChild(child); |
| 1047 child->SetCapture(); | 1063 child->SetCapture(); |
| 1048 EXPECT_TRUE(child->HasCapture()); | 1064 EXPECT_TRUE(child->HasCapture()); |
| 1049 } | 1065 } |
| 1050 | 1066 |
| 1051 } // namespace ui | 1067 } // namespace ui |
| OLD | NEW |