| 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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 } | 101 } |
| 102 | 102 |
| 103 bool HandleEvent(WebInputEvent& event, InputEventAckState ack_result) { | 103 bool HandleEvent(WebInputEvent& event, InputEventAckState ack_result) { |
| 104 return queue_->HandleEvent(ui::WebInputEventTraits::Clone(event), | 104 return queue_->HandleEvent(ui::WebInputEventTraits::Clone(event), |
| 105 ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 105 ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 106 ack_result); | 106 ack_result); |
| 107 } | 107 } |
| 108 | 108 |
| 109 void NeedsMainFrame(int routing_id) override { needs_main_frame_ = true; } | 109 void NeedsMainFrame(int routing_id) override { needs_main_frame_ = true; } |
| 110 | 110 |
| 111 WebInputEventQueue<EventWithDispatchType>& event_queue() { | 111 MainThreadEventQueueTaskList& event_queue() { |
| 112 return queue_->shared_state_.events_; | 112 return queue_->shared_state_.events_; |
| 113 } | 113 } |
| 114 | 114 |
| 115 bool last_touch_start_forced_nonblocking_due_to_fling() { | 115 bool last_touch_start_forced_nonblocking_due_to_fling() { |
| 116 return queue_->last_touch_start_forced_nonblocking_due_to_fling_; | 116 return queue_->last_touch_start_forced_nonblocking_due_to_fling_; |
| 117 } | 117 } |
| 118 | 118 |
| 119 void set_enable_fling_passive_listener_flag(bool enable_flag) { | 119 void set_enable_fling_passive_listener_flag(bool enable_flag) { |
| 120 queue_->enable_fling_passive_listener_flag_ = enable_flag; | 120 queue_->enable_fling_passive_listener_flag_ = enable_flag; |
| 121 } | 121 } |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 | 433 |
| 434 WebMouseEvent mouseDown = | 434 WebMouseEvent mouseDown = |
| 435 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseDown, 10, 10, 0); | 435 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseDown, 10, 10, 0); |
| 436 | 436 |
| 437 WebMouseEvent mouseMove = | 437 WebMouseEvent mouseMove = |
| 438 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseMove, 10, 10, 0); | 438 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseMove, 10, 10, 0); |
| 439 | 439 |
| 440 WebMouseEvent mouseUp = | 440 WebMouseEvent mouseUp = |
| 441 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseUp, 10, 10, 0); | 441 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseUp, 10, 10, 0); |
| 442 | 442 |
| 443 WebMouseWheelEvent wheelEvents[2] = { | 443 WebMouseWheelEvent wheelEvents[3] = { |
| 444 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), | 444 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), |
| 445 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), | 445 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), |
| 446 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 1, false), |
| 446 }; | 447 }; |
| 447 | 448 |
| 448 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 449 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 449 EXPECT_EQ(0u, event_queue().size()); | 450 EXPECT_EQ(0u, event_queue().size()); |
| 450 | 451 |
| 451 // Simulate enqueing a discrete event, followed by continuous events and | 452 // Simulate enqueing a discrete event, followed by continuous events and |
| 452 // then a discrete event. The last discrete event should flush the | 453 // then a discrete event. The last discrete event should flush the |
| 453 // continuous events so the aren't aligned to rAF and are processed | 454 // continuous events so the aren't aligned to rAF and are processed |
| 454 // immediately. | 455 // immediately. |
| 455 HandleEvent(mouseDown, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 456 HandleEvent(mouseDown, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 456 HandleEvent(mouseMove, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 457 HandleEvent(mouseMove, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 457 HandleEvent(wheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 458 HandleEvent(wheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 458 HandleEvent(wheelEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 459 HandleEvent(wheelEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 459 HandleEvent(mouseUp, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 460 HandleEvent(mouseUp, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 460 | 461 |
| 461 EXPECT_EQ(4u, event_queue().size()); | 462 EXPECT_EQ(4u, event_queue().size()); |
| 462 EXPECT_TRUE(main_task_runner_->HasPendingTask()); | 463 EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
| 463 EXPECT_TRUE(needs_main_frame_); | 464 EXPECT_TRUE(needs_main_frame_); |
| 464 main_task_runner_->RunUntilIdle(); | 465 main_task_runner_->RunUntilIdle(); |
| 465 EXPECT_EQ(0u, event_queue().size()); | 466 EXPECT_EQ(0u, event_queue().size()); |
| 466 RunPendingTasksWithSimulatedRaf(); | 467 RunPendingTasksWithSimulatedRaf(); |
| 467 | 468 |
| 468 // Simulate the rAF running before the PostTask occurs. The first rAF | 469 // Simulate the rAF running before the PostTask occurs. The rAF |
| 469 // shouldn't do anything. | 470 // will consume everything. |
| 470 HandleEvent(mouseDown, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 471 HandleEvent(mouseDown, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 471 HandleEvent(wheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 472 HandleEvent(wheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 472 EXPECT_EQ(2u, event_queue().size()); | 473 EXPECT_EQ(2u, event_queue().size()); |
| 473 EXPECT_TRUE(needs_main_frame_); | 474 EXPECT_TRUE(needs_main_frame_); |
| 474 RunSimulatedRafOnce(); | 475 RunSimulatedRafOnce(); |
| 475 EXPECT_FALSE(needs_main_frame_); | 476 EXPECT_FALSE(needs_main_frame_); |
| 476 EXPECT_EQ(2u, event_queue().size()); | 477 EXPECT_EQ(0u, event_queue().size()); |
| 478 main_task_runner_->RunUntilIdle(); |
| 479 |
| 480 // Simulate event consumption but no rAF signal. The mouse wheel events |
| 481 // should still be in the queue. |
| 482 handled_events_.clear(); |
| 483 HandleEvent(mouseDown, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 484 HandleEvent(wheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 485 HandleEvent(mouseUp, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 486 HandleEvent(wheelEvents[2], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 487 HandleEvent(wheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 488 EXPECT_EQ(5u, event_queue().size()); |
| 489 EXPECT_TRUE(needs_main_frame_); |
| 477 main_task_runner_->RunUntilIdle(); | 490 main_task_runner_->RunUntilIdle(); |
| 478 EXPECT_TRUE(needs_main_frame_); | 491 EXPECT_TRUE(needs_main_frame_); |
| 479 EXPECT_EQ(1u, event_queue().size()); | 492 EXPECT_EQ(2u, event_queue().size()); |
| 480 RunPendingTasksWithSimulatedRaf(); | 493 RunSimulatedRafOnce(); |
| 481 EXPECT_EQ(0u, event_queue().size()); | 494 EXPECT_EQ(wheelEvents[2].modifiers(), |
| 495 handled_events_.at(3).event().modifiers()); |
| 496 EXPECT_EQ(wheelEvents[0].modifiers(), |
| 497 handled_events_.at(4).event().modifiers()); |
| 482 } | 498 } |
| 483 | 499 |
| 484 TEST_P(MainThreadEventQueueTest, RafAlignedTouchInput) { | 500 TEST_P(MainThreadEventQueueTest, RafAlignedTouchInput) { |
| 485 // Don't run the test when we aren't supporting rAF aligned input. | 501 // Don't run the test when we aren't supporting rAF aligned input. |
| 486 if ((raf_aligned_input_setting_ & kRafAlignedEnabledTouch) == 0) | 502 if ((raf_aligned_input_setting_ & kRafAlignedEnabledTouch) == 0) |
| 487 return; | 503 return; |
| 488 | 504 |
| 489 SyntheticWebTouchEvent kEvents[3]; | 505 SyntheticWebTouchEvent kEvents[3]; |
| 490 kEvents[0].PressPoint(10, 10); | 506 kEvents[0].PressPoint(10, 10); |
| 491 kEvents[1].PressPoint(10, 10); | 507 kEvents[1].PressPoint(10, 10); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 503 for (SyntheticWebTouchEvent& event : kEvents) | 519 for (SyntheticWebTouchEvent& event : kEvents) |
| 504 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 520 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 505 | 521 |
| 506 EXPECT_EQ(3u, event_queue().size()); | 522 EXPECT_EQ(3u, event_queue().size()); |
| 507 EXPECT_TRUE(main_task_runner_->HasPendingTask()); | 523 EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
| 508 EXPECT_TRUE(needs_main_frame_); | 524 EXPECT_TRUE(needs_main_frame_); |
| 509 main_task_runner_->RunUntilIdle(); | 525 main_task_runner_->RunUntilIdle(); |
| 510 EXPECT_EQ(0u, event_queue().size()); | 526 EXPECT_EQ(0u, event_queue().size()); |
| 511 RunPendingTasksWithSimulatedRaf(); | 527 RunPendingTasksWithSimulatedRaf(); |
| 512 | 528 |
| 513 // Simulate the rAF running before the PostTask occurs. The first rAF | 529 // Simulate the rAF running before the PostTask occurs. The rAF |
| 514 // shouldn't do anything. | 530 // will consume everything. |
| 515 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 531 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 516 HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 532 HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 517 EXPECT_EQ(2u, event_queue().size()); | 533 EXPECT_EQ(2u, event_queue().size()); |
| 518 EXPECT_TRUE(needs_main_frame_); | 534 EXPECT_TRUE(needs_main_frame_); |
| 519 RunSimulatedRafOnce(); | 535 RunSimulatedRafOnce(); |
| 520 EXPECT_FALSE(needs_main_frame_); | 536 EXPECT_FALSE(needs_main_frame_); |
| 537 EXPECT_EQ(0u, event_queue().size()); |
| 538 main_task_runner_->RunUntilIdle(); |
| 539 |
| 540 // Simulate event consumption but no rAF signal. The touch events |
| 541 // should still be in the queue. |
| 542 handled_events_.clear(); |
| 543 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 544 HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 521 EXPECT_EQ(2u, event_queue().size()); | 545 EXPECT_EQ(2u, event_queue().size()); |
| 522 RunPendingTasksWithSimulatedRaf(); | 546 EXPECT_TRUE(needs_main_frame_); |
| 523 EXPECT_EQ(0u, event_queue().size()); | 547 main_task_runner_->RunUntilIdle(); |
| 548 EXPECT_TRUE(needs_main_frame_); |
| 549 EXPECT_EQ(1u, event_queue().size()); |
| 550 RunSimulatedRafOnce(); |
| 524 | 551 |
| 525 // Simulate the touch move being discrete | 552 // Simulate the touch move being discrete |
| 526 kEvents[0].touchStartOrFirstTouchMove = true; | 553 kEvents[0].touchStartOrFirstTouchMove = true; |
| 527 kEvents[1].touchStartOrFirstTouchMove = true; | 554 kEvents[1].touchStartOrFirstTouchMove = true; |
| 528 | 555 |
| 529 for (SyntheticWebTouchEvent& event : kEvents) | 556 for (SyntheticWebTouchEvent& event : kEvents) |
| 530 HandleEvent(event, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 557 HandleEvent(event, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 531 | 558 |
| 532 EXPECT_EQ(3u, event_queue().size()); | 559 EXPECT_EQ(3u, event_queue().size()); |
| 533 EXPECT_TRUE(main_task_runner_->HasPendingTask()); | 560 EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 829 "MainThreadResponsivenessScrollIntervention", "Control"); | 856 "MainThreadResponsivenessScrollIntervention", "Control"); |
| 830 queue_ = new MainThreadEventQueue(kTestRoutingID, | 857 queue_ = new MainThreadEventQueue(kTestRoutingID, |
| 831 &dummy_main_thread_event_queue_client_, | 858 &dummy_main_thread_event_queue_client_, |
| 832 main_task_runner_, &renderer_scheduler_); | 859 main_task_runner_, &renderer_scheduler_); |
| 833 EXPECT_FALSE(enable_non_blocking_due_to_main_thread_responsiveness_flag()); | 860 EXPECT_FALSE(enable_non_blocking_due_to_main_thread_responsiveness_flag()); |
| 834 EXPECT_EQ(base::TimeDelta::FromMilliseconds(0), | 861 EXPECT_EQ(base::TimeDelta::FromMilliseconds(0), |
| 835 main_thread_responsiveness_threshold()); | 862 main_thread_responsiveness_threshold()); |
| 836 } | 863 } |
| 837 | 864 |
| 838 } // namespace content | 865 } // namespace content |
| OLD | NEW |