Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: content/renderer/input/main_thread_event_queue_unittest.cc

Issue 2765583002: Teach main thread event queue about closures. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 WebInputEventQueue<QueuedItem>& 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
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
mustaq 2017/03/24 15:31:18 "Discrete" vs "continuous": do we define these ter
dtapuska 2017/03/24 20:16:34 Continuous are rAF aligned events. Discrete aren't
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(wheelEvents[2], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
mustaq 2017/03/24 15:31:18 Wondering why wheelEvent[2] not [1]? Event |modifi
dtapuska 2017/03/24 20:16:35 Because 0 and 1 will get coalesced together. The m
486 EXPECT_EQ(3u, event_queue().size());
487 EXPECT_TRUE(needs_main_frame_);
477 main_task_runner_->RunUntilIdle(); 488 main_task_runner_->RunUntilIdle();
478 EXPECT_TRUE(needs_main_frame_); 489 EXPECT_TRUE(needs_main_frame_);
479 EXPECT_EQ(1u, event_queue().size()); 490 EXPECT_EQ(2u, event_queue().size());
480 RunPendingTasksWithSimulatedRaf(); 491 RunSimulatedRafOnce();
481 EXPECT_EQ(0u, event_queue().size()); 492 EXPECT_EQ(wheelEvents[0].modifiers(),
493 handled_events_.at(1).event().modifiers());
494 EXPECT_EQ(wheelEvents[2].modifiers(),
495 handled_events_.at(2).event().modifiers());
mustaq 2017/03/24 15:31:18 Please add a longer raf/non-raf queued sequence, t
dtapuska 2017/03/24 20:16:37 Done.
482 } 496 }
483 497
484 TEST_P(MainThreadEventQueueTest, RafAlignedTouchInput) { 498 TEST_P(MainThreadEventQueueTest, RafAlignedTouchInput) {
485 // Don't run the test when we aren't supporting rAF aligned input. 499 // Don't run the test when we aren't supporting rAF aligned input.
486 if ((raf_aligned_input_setting_ & kRafAlignedEnabledTouch) == 0) 500 if ((raf_aligned_input_setting_ & kRafAlignedEnabledTouch) == 0)
487 return; 501 return;
488 502
489 SyntheticWebTouchEvent kEvents[3]; 503 SyntheticWebTouchEvent kEvents[3];
490 kEvents[0].PressPoint(10, 10); 504 kEvents[0].PressPoint(10, 10);
491 kEvents[1].PressPoint(10, 10); 505 kEvents[1].PressPoint(10, 10);
(...skipping 11 matching lines...) Expand all
503 for (SyntheticWebTouchEvent& event : kEvents) 517 for (SyntheticWebTouchEvent& event : kEvents)
504 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 518 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
505 519
506 EXPECT_EQ(3u, event_queue().size()); 520 EXPECT_EQ(3u, event_queue().size());
507 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 521 EXPECT_TRUE(main_task_runner_->HasPendingTask());
508 EXPECT_TRUE(needs_main_frame_); 522 EXPECT_TRUE(needs_main_frame_);
509 main_task_runner_->RunUntilIdle(); 523 main_task_runner_->RunUntilIdle();
510 EXPECT_EQ(0u, event_queue().size()); 524 EXPECT_EQ(0u, event_queue().size());
511 RunPendingTasksWithSimulatedRaf(); 525 RunPendingTasksWithSimulatedRaf();
512 526
513 // Simulate the rAF running before the PostTask occurs. The first rAF 527 // Simulate the rAF running before the PostTask occurs. The rAF
514 // shouldn't do anything. 528 // will consume everything.
515 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 529 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
516 HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 530 HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
517 EXPECT_EQ(2u, event_queue().size()); 531 EXPECT_EQ(2u, event_queue().size());
518 EXPECT_TRUE(needs_main_frame_); 532 EXPECT_TRUE(needs_main_frame_);
519 RunSimulatedRafOnce(); 533 RunSimulatedRafOnce();
520 EXPECT_FALSE(needs_main_frame_); 534 EXPECT_FALSE(needs_main_frame_);
535 EXPECT_EQ(0u, event_queue().size());
536 main_task_runner_->RunUntilIdle();
537
538 // Simulate event consumption but no rAF signal. The mouse wheel events
mustaq 2017/03/24 15:31:18 s/mouse wheel events/touchmove event/.
dtapuska 2017/03/24 20:16:36 Done.
539 // should still be in the queue.
540 handled_events_.clear();
541 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
542 HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
521 EXPECT_EQ(2u, event_queue().size()); 543 EXPECT_EQ(2u, event_queue().size());
522 RunPendingTasksWithSimulatedRaf(); 544 EXPECT_TRUE(needs_main_frame_);
523 EXPECT_EQ(0u, event_queue().size()); 545 main_task_runner_->RunUntilIdle();
546 EXPECT_TRUE(needs_main_frame_);
547 EXPECT_EQ(1u, event_queue().size());
548 RunSimulatedRafOnce();
524 549
525 // Simulate the touch move being discrete 550 // Simulate the touch move being discrete
526 kEvents[0].touchStartOrFirstTouchMove = true; 551 kEvents[0].touchStartOrFirstTouchMove = true;
527 kEvents[1].touchStartOrFirstTouchMove = true; 552 kEvents[1].touchStartOrFirstTouchMove = true;
528 553
529 for (SyntheticWebTouchEvent& event : kEvents) 554 for (SyntheticWebTouchEvent& event : kEvents)
530 HandleEvent(event, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 555 HandleEvent(event, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
531 556
532 EXPECT_EQ(3u, event_queue().size()); 557 EXPECT_EQ(3u, event_queue().size());
533 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 558 EXPECT_TRUE(main_task_runner_->HasPendingTask());
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
829 "MainThreadResponsivenessScrollIntervention", "Control"); 854 "MainThreadResponsivenessScrollIntervention", "Control");
830 queue_ = new MainThreadEventQueue(kTestRoutingID, 855 queue_ = new MainThreadEventQueue(kTestRoutingID,
831 &dummy_main_thread_event_queue_client_, 856 &dummy_main_thread_event_queue_client_,
832 main_task_runner_, &renderer_scheduler_); 857 main_task_runner_, &renderer_scheduler_);
833 EXPECT_FALSE(enable_non_blocking_due_to_main_thread_responsiveness_flag()); 858 EXPECT_FALSE(enable_non_blocking_due_to_main_thread_responsiveness_flag());
834 EXPECT_EQ(base::TimeDelta::FromMilliseconds(0), 859 EXPECT_EQ(base::TimeDelta::FromMilliseconds(0),
835 main_thread_responsiveness_threshold()); 860 main_thread_responsiveness_threshold());
836 } 861 }
837 862
838 } // namespace content 863 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698