| 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 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 queue_->HandleEvent(ui::WebInputEventTraits::Clone(event), | 89 queue_->HandleEvent(ui::WebInputEventTraits::Clone(event), |
| 90 ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, ack_result); | 90 ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, ack_result); |
| 91 } | 91 } |
| 92 | 92 |
| 93 void NeedsMainFrame(int routing_id) override { needs_main_frame_ = true; } | 93 void NeedsMainFrame(int routing_id) override { needs_main_frame_ = true; } |
| 94 | 94 |
| 95 WebInputEventQueue<EventWithDispatchType>& event_queue() { | 95 WebInputEventQueue<EventWithDispatchType>& event_queue() { |
| 96 return queue_->shared_state_.events_; | 96 return queue_->shared_state_.events_; |
| 97 } | 97 } |
| 98 | 98 |
| 99 void set_is_flinging(bool is_flinging) { | |
| 100 queue_->set_is_flinging(is_flinging); | |
| 101 } | |
| 102 | |
| 103 bool last_touch_start_forced_nonblocking_due_to_fling() { | 99 bool last_touch_start_forced_nonblocking_due_to_fling() { |
| 104 return queue_->last_touch_start_forced_nonblocking_due_to_fling_; | 100 return queue_->last_touch_start_forced_nonblocking_due_to_fling_; |
| 105 } | 101 } |
| 106 | 102 |
| 107 void set_enable_fling_passive_listener_flag(bool enable_flag) { | 103 void set_enable_fling_passive_listener_flag(bool enable_flag) { |
| 108 queue_->enable_fling_passive_listener_flag_ = enable_flag; | 104 queue_->enable_fling_passive_listener_flag_ = enable_flag; |
| 109 } | 105 } |
| 110 | 106 |
| 111 void RunPendingTasksWithSimulatedRaf() { | 107 void RunPendingTasksWithSimulatedRaf() { |
| 112 while (needs_main_frame_ || main_task_runner_->HasPendingTask()) { | 108 while (needs_main_frame_ || main_task_runner_->HasPendingTask()) { |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 for (SyntheticWebTouchEvent& event : kEvents) | 424 for (SyntheticWebTouchEvent& event : kEvents) |
| 429 HandleEvent(event, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 425 HandleEvent(event, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 430 | 426 |
| 431 EXPECT_EQ(3u, event_queue().size()); | 427 EXPECT_EQ(3u, event_queue().size()); |
| 432 EXPECT_TRUE(main_task_runner_->HasPendingTask()); | 428 EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
| 433 EXPECT_FALSE(needs_main_frame_); | 429 EXPECT_FALSE(needs_main_frame_); |
| 434 main_task_runner_->RunUntilIdle(); | 430 main_task_runner_->RunUntilIdle(); |
| 435 } | 431 } |
| 436 | 432 |
| 437 TEST_P(MainThreadEventQueueTest, BlockingTouchesDuringFling) { | 433 TEST_P(MainThreadEventQueueTest, BlockingTouchesDuringFling) { |
| 438 SyntheticWebTouchEvent kEvents[1]; | 434 SyntheticWebTouchEvent kEvents; |
| 439 kEvents[0].PressPoint(10, 10); | 435 kEvents.PressPoint(10, 10); |
| 440 kEvents[0].touchStartOrFirstTouchMove = true; | 436 kEvents.touchStartOrFirstTouchMove = true; |
| 441 set_is_flinging(true); | |
| 442 set_enable_fling_passive_listener_flag(true); | 437 set_enable_fling_passive_listener_flag(true); |
| 443 | 438 |
| 444 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); | 439 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); |
| 445 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 440 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_NOT_CONSUMED_NON_BLOCKING); |
| 446 RunPendingTasksWithSimulatedRaf(); | 441 RunPendingTasksWithSimulatedRaf(); |
| 447 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 442 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 448 EXPECT_EQ(0u, event_queue().size()); | 443 EXPECT_EQ(0u, event_queue().size()); |
| 449 EXPECT_EQ(1u, handled_events_.size()); | 444 EXPECT_EQ(1u, handled_events_.size()); |
| 450 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); | 445 EXPECT_EQ(kEvents.size, handled_events_.at(0)->size); |
| 451 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); | 446 EXPECT_EQ(kEvents.type, handled_events_.at(0)->type); |
| 452 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); | 447 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); |
| 453 const WebTouchEvent* last_touch_event = | 448 const WebTouchEvent* last_touch_event = |
| 454 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); | 449 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); |
| 455 kEvents[0].dispatchedDuringFling = true; | 450 kEvents.dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; |
| 456 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; | 451 EXPECT_EQ(kEvents, *last_touch_event); |
| 457 EXPECT_EQ(kEvents[0], *last_touch_event); | |
| 458 | 452 |
| 459 kEvents[0].MovePoint(0, 30, 30); | 453 kEvents.MovePoint(0, 30, 30); |
| 460 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 454 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 461 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 455 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_NOT_CONSUMED_NON_BLOCKING); |
| 462 EXPECT_EQ((raf_aligned_input_setting_ & kRafAlignedEnabledTouch) == 0, | 456 EXPECT_EQ((raf_aligned_input_setting_ & kRafAlignedEnabledTouch) == 0, |
| 463 main_task_runner_->HasPendingTask()); | 457 main_task_runner_->HasPendingTask()); |
| 464 RunPendingTasksWithSimulatedRaf(); | 458 RunPendingTasksWithSimulatedRaf(); |
| 465 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 459 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 466 EXPECT_EQ(0u, event_queue().size()); | 460 EXPECT_EQ(0u, event_queue().size()); |
| 467 EXPECT_EQ(2u, handled_events_.size()); | 461 EXPECT_EQ(2u, handled_events_.size()); |
| 468 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size); | 462 EXPECT_EQ(kEvents.size, handled_events_.at(1)->size); |
| 469 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type); | 463 EXPECT_EQ(kEvents.type, handled_events_.at(1)->type); |
| 470 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); | 464 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); |
| 471 last_touch_event = | 465 last_touch_event = |
| 472 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); | 466 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); |
| 473 kEvents[0].dispatchedDuringFling = true; | 467 kEvents.dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; |
| 474 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; | 468 EXPECT_EQ(kEvents, *last_touch_event); |
| 475 EXPECT_EQ(kEvents[0], *last_touch_event); | |
| 476 | 469 |
| 477 kEvents[0].MovePoint(0, 50, 50); | 470 kEvents.MovePoint(0, 50, 50); |
| 478 kEvents[0].touchStartOrFirstTouchMove = false; | 471 kEvents.touchStartOrFirstTouchMove = false; |
| 479 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 472 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_NOT_CONSUMED_NON_BLOCKING); |
| 480 RunPendingTasksWithSimulatedRaf(); | 473 RunPendingTasksWithSimulatedRaf(); |
| 481 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 474 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 482 EXPECT_EQ(0u, event_queue().size()); | 475 EXPECT_EQ(0u, event_queue().size()); |
| 483 EXPECT_EQ(3u, handled_events_.size()); | 476 EXPECT_EQ(3u, handled_events_.size()); |
| 484 EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size); | 477 EXPECT_EQ(kEvents.size, handled_events_.at(2)->size); |
| 485 EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type); | 478 EXPECT_EQ(kEvents.type, handled_events_.at(2)->type); |
| 486 EXPECT_TRUE(kEvents[0].dispatchedDuringFling); | 479 EXPECT_EQ(kEvents.dispatchType, WebInputEvent::Blocking); |
| 487 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); | |
| 488 last_touch_event = | 480 last_touch_event = |
| 489 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); | 481 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); |
| 490 EXPECT_EQ(kEvents[0], *last_touch_event); | 482 EXPECT_EQ(kEvents, *last_touch_event); |
| 491 | 483 |
| 492 kEvents[0].ReleasePoint(0); | 484 kEvents.ReleasePoint(0); |
| 493 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 485 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_NOT_CONSUMED_NON_BLOCKING); |
| 494 RunPendingTasksWithSimulatedRaf(); | 486 RunPendingTasksWithSimulatedRaf(); |
| 495 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 487 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 496 EXPECT_EQ(0u, event_queue().size()); | 488 EXPECT_EQ(0u, event_queue().size()); |
| 497 EXPECT_EQ(4u, handled_events_.size()); | 489 EXPECT_EQ(4u, handled_events_.size()); |
| 498 EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size); | 490 EXPECT_EQ(kEvents.size, handled_events_.at(3)->size); |
| 499 EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type); | 491 EXPECT_EQ(kEvents.type, handled_events_.at(3)->type); |
| 500 EXPECT_TRUE(kEvents[0].dispatchedDuringFling); | 492 EXPECT_EQ(kEvents.dispatchType, WebInputEvent::Blocking); |
| 501 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); | |
| 502 last_touch_event = | 493 last_touch_event = |
| 503 static_cast<const WebTouchEvent*>(handled_events_.at(3).get()); | 494 static_cast<const WebTouchEvent*>(handled_events_.at(3).get()); |
| 504 EXPECT_EQ(kEvents[0], *last_touch_event); | 495 EXPECT_EQ(kEvents, *last_touch_event); |
| 505 } | 496 } |
| 506 | 497 |
| 507 TEST_P(MainThreadEventQueueTest, BlockingTouchesOutsideFling) { | 498 TEST_P(MainThreadEventQueueTest, BlockingTouchesOutsideFling) { |
| 508 SyntheticWebTouchEvent kEvents[1]; | 499 SyntheticWebTouchEvent kEvents; |
| 509 kEvents[0].PressPoint(10, 10); | 500 kEvents.PressPoint(10, 10); |
| 510 kEvents[0].touchStartOrFirstTouchMove = true; | 501 kEvents.touchStartOrFirstTouchMove = true; |
| 511 set_is_flinging(false); | |
| 512 set_enable_fling_passive_listener_flag(false); | 502 set_enable_fling_passive_listener_flag(false); |
| 513 | 503 |
| 514 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 504 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 515 RunPendingTasksWithSimulatedRaf(); | 505 RunPendingTasksWithSimulatedRaf(); |
| 516 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 506 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 517 EXPECT_EQ(0u, event_queue().size()); | 507 EXPECT_EQ(0u, event_queue().size()); |
| 518 EXPECT_EQ(1u, handled_events_.size()); | 508 EXPECT_EQ(1u, handled_events_.size()); |
| 519 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); | 509 EXPECT_EQ(kEvents.size, handled_events_.at(0)->size); |
| 520 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); | 510 EXPECT_EQ(kEvents.type, handled_events_.at(0)->type); |
| 521 EXPECT_FALSE(kEvents[0].dispatchedDuringFling); | 511 EXPECT_EQ(kEvents.dispatchType, WebInputEvent::Blocking); |
| 522 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); | |
| 523 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); | 512 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); |
| 524 const WebTouchEvent* last_touch_event = | 513 const WebTouchEvent* last_touch_event = |
| 525 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); | 514 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); |
| 526 EXPECT_EQ(kEvents[0], *last_touch_event); | 515 EXPECT_EQ(kEvents, *last_touch_event); |
| 527 | 516 |
| 528 set_is_flinging(true); | |
| 529 set_enable_fling_passive_listener_flag(false); | 517 set_enable_fling_passive_listener_flag(false); |
| 530 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 518 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 531 RunPendingTasksWithSimulatedRaf(); | 519 RunPendingTasksWithSimulatedRaf(); |
| 532 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 520 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 533 EXPECT_EQ(0u, event_queue().size()); | 521 EXPECT_EQ(0u, event_queue().size()); |
| 534 EXPECT_EQ(2u, handled_events_.size()); | 522 EXPECT_EQ(2u, handled_events_.size()); |
| 535 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size); | 523 EXPECT_EQ(kEvents.size, handled_events_.at(1)->size); |
| 536 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type); | 524 EXPECT_EQ(kEvents.type, handled_events_.at(1)->type); |
| 537 EXPECT_FALSE(kEvents[0].dispatchedDuringFling); | 525 EXPECT_EQ(kEvents.dispatchType, WebInputEvent::Blocking); |
| 538 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); | |
| 539 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); | 526 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); |
| 540 last_touch_event = | 527 last_touch_event = |
| 541 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); | 528 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); |
| 542 kEvents[0].dispatchedDuringFling = true; | 529 EXPECT_EQ(kEvents, *last_touch_event); |
| 543 EXPECT_EQ(kEvents[0], *last_touch_event); | |
| 544 | 530 |
| 545 set_is_flinging(false); | |
| 546 set_enable_fling_passive_listener_flag(true); | 531 set_enable_fling_passive_listener_flag(true); |
| 547 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 532 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 548 RunPendingTasksWithSimulatedRaf(); | 533 RunPendingTasksWithSimulatedRaf(); |
| 549 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 534 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 550 EXPECT_EQ(0u, event_queue().size()); | 535 EXPECT_EQ(0u, event_queue().size()); |
| 551 EXPECT_EQ(3u, handled_events_.size()); | 536 EXPECT_EQ(3u, handled_events_.size()); |
| 552 EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size); | 537 EXPECT_EQ(kEvents.size, handled_events_.at(2)->size); |
| 553 EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type); | 538 EXPECT_EQ(kEvents.type, handled_events_.at(2)->type); |
| 554 EXPECT_TRUE(kEvents[0].dispatchedDuringFling); | 539 EXPECT_EQ(kEvents.dispatchType, WebInputEvent::Blocking); |
| 555 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); | |
| 556 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); | 540 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); |
| 557 last_touch_event = | 541 last_touch_event = |
| 558 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); | 542 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); |
| 559 kEvents[0].dispatchedDuringFling = false; | 543 EXPECT_EQ(kEvents, *last_touch_event); |
| 560 EXPECT_EQ(kEvents[0], *last_touch_event); | |
| 561 | 544 |
| 562 kEvents[0].MovePoint(0, 30, 30); | 545 kEvents.MovePoint(0, 30, 30); |
| 563 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 546 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 564 RunPendingTasksWithSimulatedRaf(); | 547 RunPendingTasksWithSimulatedRaf(); |
| 565 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 548 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 566 EXPECT_EQ(0u, event_queue().size()); | 549 EXPECT_EQ(0u, event_queue().size()); |
| 567 EXPECT_EQ(4u, handled_events_.size()); | 550 EXPECT_EQ(4u, handled_events_.size()); |
| 568 EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size); | 551 EXPECT_EQ(kEvents.size, handled_events_.at(3)->size); |
| 569 EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type); | 552 EXPECT_EQ(kEvents.type, handled_events_.at(3)->type); |
| 570 EXPECT_FALSE(kEvents[0].dispatchedDuringFling); | 553 EXPECT_EQ(kEvents.dispatchType, WebInputEvent::Blocking); |
| 571 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); | |
| 572 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); | 554 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); |
| 573 last_touch_event = | 555 last_touch_event = |
| 574 static_cast<const WebTouchEvent*>(handled_events_.at(3).get()); | 556 static_cast<const WebTouchEvent*>(handled_events_.at(3).get()); |
| 575 EXPECT_EQ(kEvents[0], *last_touch_event); | 557 EXPECT_EQ(kEvents, *last_touch_event); |
| 576 } | 558 } |
| 577 | 559 |
| 578 // The boolean parameterized test varies whether rAF aligned input | 560 // The boolean parameterized test varies whether rAF aligned input |
| 579 // is enabled or not. | 561 // is enabled or not. |
| 580 INSTANTIATE_TEST_CASE_P( | 562 INSTANTIATE_TEST_CASE_P( |
| 581 MainThreadEventQueueTests, | 563 MainThreadEventQueueTests, |
| 582 MainThreadEventQueueTest, | 564 MainThreadEventQueueTest, |
| 583 testing::Range(0u, | 565 testing::Range(0u, |
| 584 (kRafAlignedEnabledTouch | kRafAlignedEnabledMouse) + 1)); | 566 (kRafAlignedEnabledTouch | kRafAlignedEnabledMouse) + 1)); |
| 585 | 567 |
| 586 } // namespace content | 568 } // namespace content |
| OLD | NEW |