| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <new> | 7 #include <new> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 queue_->EventHandled(event->type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 78 queue_->EventHandled(event->type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 79 } | 79 } |
| 80 | 80 |
| 81 void SendInputEventAck(int routing_id, | 81 void SendInputEventAck(int routing_id, |
| 82 blink::WebInputEvent::Type type, | 82 blink::WebInputEvent::Type type, |
| 83 InputEventAckState ack_result, | 83 InputEventAckState ack_result, |
| 84 uint32_t touch_event_id) override { | 84 uint32_t touch_event_id) override { |
| 85 additional_acked_events_.push_back(touch_event_id); | 85 additional_acked_events_.push_back(touch_event_id); |
| 86 } | 86 } |
| 87 | 87 |
| 88 void HandleEvent(WebInputEvent& event, InputEventAckState ack_result) { | 88 bool HandleEvent(WebInputEvent& event, InputEventAckState ack_result) { |
| 89 queue_->HandleEvent(ui::WebInputEventTraits::Clone(event), | 89 return queue_->HandleEvent(ui::WebInputEventTraits::Clone(event), |
| 90 ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, ack_result); | 90 ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 91 ack_result); |
| 91 } | 92 } |
| 92 | 93 |
| 93 void NeedsMainFrame(int routing_id) override { needs_main_frame_ = true; } | 94 void NeedsMainFrame(int routing_id) override { needs_main_frame_ = true; } |
| 94 | 95 |
| 95 WebInputEventQueue<EventWithDispatchType>& event_queue() { | 96 WebInputEventQueue<EventWithDispatchType>& event_queue() { |
| 96 return queue_->shared_state_.events_; | 97 return queue_->shared_state_.events_; |
| 97 } | 98 } |
| 98 | 99 |
| 99 bool last_touch_start_forced_nonblocking_due_to_fling() { | 100 bool last_touch_start_forced_nonblocking_due_to_fling() { |
| 100 return queue_->last_touch_start_forced_nonblocking_due_to_fling_; | 101 return queue_->last_touch_start_forced_nonblocking_due_to_fling_; |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 | 424 |
| 424 for (SyntheticWebTouchEvent& event : kEvents) | 425 for (SyntheticWebTouchEvent& event : kEvents) |
| 425 HandleEvent(event, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 426 HandleEvent(event, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 426 | 427 |
| 427 EXPECT_EQ(3u, event_queue().size()); | 428 EXPECT_EQ(3u, event_queue().size()); |
| 428 EXPECT_TRUE(main_task_runner_->HasPendingTask()); | 429 EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
| 429 EXPECT_FALSE(needs_main_frame_); | 430 EXPECT_FALSE(needs_main_frame_); |
| 430 main_task_runner_->RunUntilIdle(); | 431 main_task_runner_->RunUntilIdle(); |
| 431 } | 432 } |
| 432 | 433 |
| 434 TEST_P(MainThreadEventQueueTest, RafAlignedTouchInputCoalescedMoves) { |
| 435 // Don't run the test when we aren't supporting rAF aligned input. |
| 436 if ((raf_aligned_input_setting_ & kRafAlignedEnabledTouch) == 0) |
| 437 return; |
| 438 |
| 439 SyntheticWebTouchEvent kEvents[2]; |
| 440 kEvents[0].PressPoint(10, 10); |
| 441 kEvents[0].MovePoint(0, 50, 50); |
| 442 kEvents[1].PressPoint(10, 10); |
| 443 kEvents[1].MovePoint(0, 20, 20); |
| 444 kEvents[0].dispatchType = WebInputEvent::EventNonBlocking; |
| 445 |
| 446 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 447 EXPECT_EQ(0u, event_queue().size()); |
| 448 |
| 449 // Send a continuous input event (ack required) and then |
| 450 // a discrete event. The events should coalesce together |
| 451 // and a post task should be on the queue at the end. |
| 452 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 453 EXPECT_EQ(1u, event_queue().size()); |
| 454 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 455 EXPECT_TRUE(needs_main_frame_); |
| 456 HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 457 EXPECT_EQ(1u, event_queue().size()); |
| 458 EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
| 459 EXPECT_TRUE(needs_main_frame_); |
| 460 RunPendingTasksWithSimulatedRaf(); |
| 461 EXPECT_EQ(0u, event_queue().size()); |
| 462 EXPECT_EQ(1u, additional_acked_events_.size()); |
| 463 additional_acked_events_.clear(); |
| 464 |
| 465 // Send a non-cancelable ack required event, and then a non-ack |
| 466 // required event they should be coalesced together. |
| 467 EXPECT_TRUE(HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED)); |
| 468 EXPECT_EQ(1u, event_queue().size()); |
| 469 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 470 EXPECT_TRUE(needs_main_frame_); |
| 471 EXPECT_TRUE(HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING)); |
| 472 EXPECT_EQ(1u, event_queue().size()); |
| 473 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 474 EXPECT_TRUE(needs_main_frame_); |
| 475 RunPendingTasksWithSimulatedRaf(); |
| 476 EXPECT_EQ(0u, event_queue().size()); |
| 477 EXPECT_EQ(0u, additional_acked_events_.size()); |
| 478 |
| 479 // Send a non-ack required event, and then a non-cancelable ack |
| 480 // required event they should be coalesced together. |
| 481 EXPECT_TRUE(HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING)); |
| 482 EXPECT_EQ(1u, event_queue().size()); |
| 483 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 484 EXPECT_TRUE(needs_main_frame_); |
| 485 EXPECT_TRUE(HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED)); |
| 486 EXPECT_EQ(1u, event_queue().size()); |
| 487 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 488 EXPECT_TRUE(needs_main_frame_); |
| 489 RunPendingTasksWithSimulatedRaf(); |
| 490 EXPECT_EQ(0u, event_queue().size()); |
| 491 EXPECT_EQ(0u, additional_acked_events_.size()); |
| 492 } |
| 493 |
| 433 TEST_P(MainThreadEventQueueTest, BlockingTouchesDuringFling) { | 494 TEST_P(MainThreadEventQueueTest, BlockingTouchesDuringFling) { |
| 434 SyntheticWebTouchEvent kEvents; | 495 SyntheticWebTouchEvent kEvents; |
| 435 kEvents.PressPoint(10, 10); | 496 kEvents.PressPoint(10, 10); |
| 436 kEvents.touchStartOrFirstTouchMove = true; | 497 kEvents.touchStartOrFirstTouchMove = true; |
| 437 set_enable_fling_passive_listener_flag(true); | 498 set_enable_fling_passive_listener_flag(true); |
| 438 | 499 |
| 439 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); | 500 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); |
| 440 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING_DUE_TO_FLING); | 501 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING_DUE_TO_FLING); |
| 441 RunPendingTasksWithSimulatedRaf(); | 502 RunPendingTasksWithSimulatedRaf(); |
| 442 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 503 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 | 620 |
| 560 // The boolean parameterized test varies whether rAF aligned input | 621 // The boolean parameterized test varies whether rAF aligned input |
| 561 // is enabled or not. | 622 // is enabled or not. |
| 562 INSTANTIATE_TEST_CASE_P( | 623 INSTANTIATE_TEST_CASE_P( |
| 563 MainThreadEventQueueTests, | 624 MainThreadEventQueueTests, |
| 564 MainThreadEventQueueTest, | 625 MainThreadEventQueueTest, |
| 565 testing::Range(0u, | 626 testing::Range(0u, |
| 566 (kRafAlignedEnabledTouch | kRafAlignedEnabledMouse) + 1)); | 627 (kRafAlignedEnabledTouch | kRafAlignedEnabledMouse) + 1)); |
| 567 | 628 |
| 568 } // namespace content | 629 } // namespace content |
| OLD | NEW |