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_SET_NON_BLOCKING_DUE_TO_FLING); |
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_SET_NON_BLOCKING_DUE_TO_FLING); |
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_SET_NON_BLOCKING_DUE_TO_FLING); |
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_SET_NON_BLOCKING_DUE_TO_FLING); |
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 |