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

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

Issue 2713093005: Teach MainThreadEventQueue about touchmove throttling. (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 24 matching lines...) Expand all
35 return memcmp(&lhs, &rhs, lhs.size()) == 0; 35 return memcmp(&lhs, &rhs, lhs.size()) == 0;
36 } 36 }
37 } // namespace blink 37 } // namespace blink
38 38
39 namespace content { 39 namespace content {
40 namespace { 40 namespace {
41 41
42 const unsigned kRafAlignedEnabledTouch = 1; 42 const unsigned kRafAlignedEnabledTouch = 1;
43 const unsigned kRafAlignedEnabledMouse = 1 << 1; 43 const unsigned kRafAlignedEnabledMouse = 1 << 1;
44 44
45 // Simulate a 16ms frame signal.
46 const double kFrameInterval = 0.016;
47
45 const int kTestRoutingID = 13; 48 const int kTestRoutingID = 13;
46 const char* kCoalescedCountHistogram = 49 const char* kCoalescedCountHistogram =
47 "Event.MainThreadEventQueue.CoalescedCount"; 50 "Event.MainThreadEventQueue.CoalescedCount";
48 51
49 } // namespace 52 } // namespace
50 53
51 class MainThreadEventQueueTest : public testing::TestWithParam<unsigned>, 54 class MainThreadEventQueueTest : public testing::TestWithParam<unsigned>,
52 public MainThreadEventQueueClient { 55 public MainThreadEventQueueClient {
53 public: 56 public:
54 MainThreadEventQueueTest() 57 MainThreadEventQueueTest()
55 : main_task_runner_(new base::TestSimpleTaskRunner()), 58 : main_task_runner_(new base::TestSimpleTaskRunner()),
56 raf_aligned_input_setting_(GetParam()), 59 raf_aligned_input_setting_(GetParam()),
57 needs_main_frame_(false) { 60 needs_main_frame_(false),
61 frame_time_sec_(0) {
58 std::vector<std::string> features; 62 std::vector<std::string> features;
59 if (raf_aligned_input_setting_ & kRafAlignedEnabledTouch) 63 if (raf_aligned_input_setting_ & kRafAlignedEnabledTouch)
60 features.push_back(features::kRafAlignedTouchInputEvents.name); 64 features.push_back(features::kRafAlignedTouchInputEvents.name);
61 if (raf_aligned_input_setting_ & kRafAlignedEnabledMouse) 65 if (raf_aligned_input_setting_ & kRafAlignedEnabledMouse)
62 features.push_back(features::kRafAlignedMouseInputEvents.name); 66 features.push_back(features::kRafAlignedMouseInputEvents.name);
63 67
64 feature_list_.InitFromCommandLine(base::JoinString(features, ","), 68 feature_list_.InitFromCommandLine(base::JoinString(features, ","),
65 std::string()); 69 std::string());
66 } 70 }
67 71
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 } 111 }
108 112
109 void set_enable_fling_passive_listener_flag(bool enable_flag) { 113 void set_enable_fling_passive_listener_flag(bool enable_flag) {
110 queue_->enable_fling_passive_listener_flag_ = enable_flag; 114 queue_->enable_fling_passive_listener_flag_ = enable_flag;
111 } 115 }
112 116
113 void RunPendingTasksWithSimulatedRaf() { 117 void RunPendingTasksWithSimulatedRaf() {
114 while (needs_main_frame_ || main_task_runner_->HasPendingTask()) { 118 while (needs_main_frame_ || main_task_runner_->HasPendingTask()) {
115 main_task_runner_->RunUntilIdle(); 119 main_task_runner_->RunUntilIdle();
116 needs_main_frame_ = false; 120 needs_main_frame_ = false;
117 queue_->DispatchRafAlignedInput(); 121 frame_time_sec_ += kFrameInterval;
122 queue_->DispatchRafAlignedInput(frame_time_sec_);
118 } 123 }
119 } 124 }
120 125
121 void RunSimulatedRafOnce() { 126 void RunSimulatedRafOnce() {
122 if (needs_main_frame_) { 127 if (needs_main_frame_) {
123 needs_main_frame_ = false; 128 needs_main_frame_ = false;
124 queue_->DispatchRafAlignedInput(); 129 frame_time_sec_ += kFrameInterval;
130 queue_->DispatchRafAlignedInput(frame_time_sec_);
125 } 131 }
126 } 132 }
127 133
128 protected: 134 protected:
129 base::test::ScopedFeatureList feature_list_; 135 base::test::ScopedFeatureList feature_list_;
130 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; 136 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_;
131 blink::scheduler::MockRendererScheduler renderer_scheduler_; 137 blink::scheduler::MockRendererScheduler renderer_scheduler_;
132 scoped_refptr<MainThreadEventQueue> queue_; 138 scoped_refptr<MainThreadEventQueue> queue_;
133 std::vector<blink::WebCoalescedInputEvent> handled_events_; 139 std::vector<blink::WebCoalescedInputEvent> handled_events_;
134 140
135 std::vector<uint32_t> additional_acked_events_; 141 std::vector<uint32_t> additional_acked_events_;
136 int raf_aligned_input_setting_; 142 int raf_aligned_input_setting_;
137 bool needs_main_frame_; 143 bool needs_main_frame_;
144 double frame_time_sec_;
138 }; 145 };
139 146
140 TEST_P(MainThreadEventQueueTest, NonBlockingWheel) { 147 TEST_P(MainThreadEventQueueTest, NonBlockingWheel) {
141 base::HistogramTester histogram_tester; 148 base::HistogramTester histogram_tester;
142 149
143 WebMouseWheelEvent kEvents[4] = { 150 WebMouseWheelEvent kEvents[4] = {
144 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), 151 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false),
145 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), 152 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false),
146 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), 153 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false),
147 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), 154 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false),
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 EXPECT_TRUE(needs_main_frame_); 582 EXPECT_TRUE(needs_main_frame_);
576 EXPECT_TRUE(HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED)); 583 EXPECT_TRUE(HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED));
577 EXPECT_EQ(1u, event_queue().size()); 584 EXPECT_EQ(1u, event_queue().size());
578 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 585 EXPECT_FALSE(main_task_runner_->HasPendingTask());
579 EXPECT_TRUE(needs_main_frame_); 586 EXPECT_TRUE(needs_main_frame_);
580 RunPendingTasksWithSimulatedRaf(); 587 RunPendingTasksWithSimulatedRaf();
581 EXPECT_EQ(0u, event_queue().size()); 588 EXPECT_EQ(0u, event_queue().size());
582 EXPECT_EQ(0u, additional_acked_events_.size()); 589 EXPECT_EQ(0u, additional_acked_events_.size());
583 } 590 }
584 591
592 TEST_P(MainThreadEventQueueTest, RafAlignedTouchInputThrottlingMoves) {
593 // Don't run the test when we aren't supporting rAF aligned input.
594 if ((raf_aligned_input_setting_ & kRafAlignedEnabledTouch) == 0)
595 return;
596
597 SyntheticWebTouchEvent kEvents[2];
598 kEvents[0].PressPoint(10, 10);
599 kEvents[0].MovePoint(0, 50, 50);
600 kEvents[0].dispatchType = WebInputEvent::EventNonBlocking;
601 kEvents[1].PressPoint(10, 10);
602 kEvents[1].MovePoint(0, 20, 20);
603 kEvents[1].dispatchType = WebInputEvent::EventNonBlocking;
604
605 EXPECT_FALSE(main_task_runner_->HasPendingTask());
606 EXPECT_EQ(0u, event_queue().size());
607
608 // Send a non-cancelable touch move and then send it another one. The
609 // second one shouldn't go out with the next rAF call and should be throttled.
610 EXPECT_TRUE(HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED));
611 EXPECT_EQ(1u, event_queue().size());
612 EXPECT_FALSE(main_task_runner_->HasPendingTask());
613 EXPECT_TRUE(needs_main_frame_);
614 RunPendingTasksWithSimulatedRaf();
615 EXPECT_TRUE(HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED));
616 EXPECT_TRUE(HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_NOT_CONSUMED));
617 EXPECT_EQ(1u, event_queue().size());
618 EXPECT_FALSE(main_task_runner_->HasPendingTask());
619 EXPECT_TRUE(needs_main_frame_);
620
621 // Event should still be in queue after handling a single rAF call.
622 RunSimulatedRafOnce();
623 EXPECT_EQ(1u, event_queue().size());
624 EXPECT_FALSE(main_task_runner_->HasPendingTask());
625 EXPECT_TRUE(needs_main_frame_);
626
627 // And should eventually flush.
628 RunPendingTasksWithSimulatedRaf();
629 EXPECT_EQ(0u, event_queue().size());
630 EXPECT_EQ(0u, additional_acked_events_.size());
631 }
632
585 TEST_P(MainThreadEventQueueTest, BlockingTouchesDuringFling) { 633 TEST_P(MainThreadEventQueueTest, BlockingTouchesDuringFling) {
586 SyntheticWebTouchEvent kEvents; 634 SyntheticWebTouchEvent kEvents;
587 kEvents.PressPoint(10, 10); 635 kEvents.PressPoint(10, 10);
588 kEvents.touchStartOrFirstTouchMove = true; 636 kEvents.touchStartOrFirstTouchMove = true;
589 set_enable_fling_passive_listener_flag(true); 637 set_enable_fling_passive_listener_flag(true);
590 638
591 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 639 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
592 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING_DUE_TO_FLING); 640 HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING_DUE_TO_FLING);
593 RunPendingTasksWithSimulatedRaf(); 641 RunPendingTasksWithSimulatedRaf();
594 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 642 EXPECT_FALSE(main_task_runner_->HasPendingTask());
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 "MainThreadResponsivenessScrollIntervention", "Control"); 823 "MainThreadResponsivenessScrollIntervention", "Control");
776 queue_ = new MainThreadEventQueue(kTestRoutingID, 824 queue_ = new MainThreadEventQueue(kTestRoutingID,
777 &dummy_main_thread_event_queue_client_, 825 &dummy_main_thread_event_queue_client_,
778 main_task_runner_, &renderer_scheduler_); 826 main_task_runner_, &renderer_scheduler_);
779 EXPECT_FALSE(enable_non_blocking_due_to_main_thread_responsiveness_flag()); 827 EXPECT_FALSE(enable_non_blocking_due_to_main_thread_responsiveness_flag());
780 EXPECT_EQ(base::TimeDelta::FromMilliseconds(0), 828 EXPECT_EQ(base::TimeDelta::FromMilliseconds(0),
781 main_thread_responsiveness_threshold()); 829 main_thread_responsiveness_threshold());
782 } 830 }
783 831
784 } // namespace content 832 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698