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

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

Issue 2621303004: Keep track of coalesced events in main thread event queue (Closed)
Patch Set: Improve MainThreadEventQueue unittests Created 3 years, 11 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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 feature_list_.InitFromCommandLine(base::JoinString(features, ","), 63 feature_list_.InitFromCommandLine(base::JoinString(features, ","),
64 std::string()); 64 std::string());
65 } 65 }
66 66
67 void SetUp() override { 67 void SetUp() override {
68 queue_ = new MainThreadEventQueue(kTestRoutingID, this, main_task_runner_, 68 queue_ = new MainThreadEventQueue(kTestRoutingID, this, main_task_runner_,
69 &renderer_scheduler_); 69 &renderer_scheduler_);
70 } 70 }
71 71
72 void HandleEventOnMainThread(int routing_id, 72 void HandleEventOnMainThread(int routing_id,
73 const blink::WebInputEvent* event, 73 const blink::WebCoalescedInputEvent* event,
74 const ui::LatencyInfo& latency, 74 const ui::LatencyInfo& latency,
75 InputEventDispatchType type) override { 75 InputEventDispatchType type) override {
76 EXPECT_EQ(kTestRoutingID, routing_id); 76 EXPECT_EQ(kTestRoutingID, routing_id);
77 handled_events_.push_back(ui::WebInputEventTraits::Clone(*event)); 77 handled_events_.push_back(ui::WebInputEventTraits::Clone(event->event()));
78 queue_->EventHandled(event->type(), INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 78 std::vector<blink::WebScopedInputEvent> coalescedEvents;
dtapuska 2017/01/13 18:56:23 Is it not possible to just update the handled_even
Navid Zolghadr 2017/01/13 19:02:10 Yeah. I didn't like what I did either. Only when I
dtapuska 2017/01/13 19:10:23 I'd prefer to have cleaner code than minimizing th
Navid Zolghadr 2017/01/16 18:01:55 Done.
79 for (size_t i = 0; i < event->coalescedEventSize(); i++) {
80 coalescedEvents.push_back(
81 ui::WebInputEventTraits::Clone(event->coalescedEvent(i)));
82 }
83 handled_coalesced_events_.push_back(std::move(coalescedEvents));
84
85 queue_->EventHandled(event->event().type(),
86 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
79 } 87 }
80 88
81 void SendInputEventAck(int routing_id, 89 void SendInputEventAck(int routing_id,
82 blink::WebInputEvent::Type type, 90 blink::WebInputEvent::Type type,
83 InputEventAckState ack_result, 91 InputEventAckState ack_result,
84 uint32_t touch_event_id) override { 92 uint32_t touch_event_id) override {
85 additional_acked_events_.push_back(touch_event_id); 93 additional_acked_events_.push_back(touch_event_id);
86 } 94 }
87 95
88 bool HandleEvent(WebInputEvent& event, InputEventAckState ack_result) { 96 bool HandleEvent(WebInputEvent& event, InputEventAckState ack_result) {
(...skipping 30 matching lines...) Expand all
119 queue_->DispatchRafAlignedInput(); 127 queue_->DispatchRafAlignedInput();
120 } 128 }
121 } 129 }
122 130
123 protected: 131 protected:
124 base::test::ScopedFeatureList feature_list_; 132 base::test::ScopedFeatureList feature_list_;
125 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; 133 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_;
126 blink::scheduler::MockRendererScheduler renderer_scheduler_; 134 blink::scheduler::MockRendererScheduler renderer_scheduler_;
127 scoped_refptr<MainThreadEventQueue> queue_; 135 scoped_refptr<MainThreadEventQueue> queue_;
128 std::vector<blink::WebScopedInputEvent> handled_events_; 136 std::vector<blink::WebScopedInputEvent> handled_events_;
137 std::vector<std::vector<blink::WebScopedInputEvent>>
138 handled_coalesced_events_;
139
129 std::vector<uint32_t> additional_acked_events_; 140 std::vector<uint32_t> additional_acked_events_;
130 int raf_aligned_input_setting_; 141 int raf_aligned_input_setting_;
131 bool needs_main_frame_; 142 bool needs_main_frame_;
132 }; 143 };
133 144
134 TEST_P(MainThreadEventQueueTest, NonBlockingWheel) { 145 TEST_P(MainThreadEventQueueTest, NonBlockingWheel) {
135 base::HistogramTester histogram_tester; 146 base::HistogramTester histogram_tester;
136 147
137 WebMouseWheelEvent kEvents[4] = { 148 WebMouseWheelEvent kEvents[4] = {
138 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), 149 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false),
139 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), 150 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false),
140 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), 151 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false),
141 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), 152 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false),
142 }; 153 };
143 154
144 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 155 EXPECT_FALSE(main_task_runner_->HasPendingTask());
145 EXPECT_EQ(0u, event_queue().size()); 156 EXPECT_EQ(0u, event_queue().size());
146 157
147 for (WebMouseWheelEvent& event : kEvents) 158 for (WebMouseWheelEvent& event : kEvents)
148 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 159 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
149 160
150 EXPECT_EQ(2u, event_queue().size()); 161 EXPECT_EQ(2u, event_queue().size());
151 EXPECT_EQ((raf_aligned_input_setting_ & kRafAlignedEnabledMouse) == 0, 162 EXPECT_EQ((raf_aligned_input_setting_ & kRafAlignedEnabledMouse) == 0,
152 main_task_runner_->HasPendingTask()); 163 main_task_runner_->HasPendingTask());
153 RunPendingTasksWithSimulatedRaf(); 164 RunPendingTasksWithSimulatedRaf();
154 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 165 EXPECT_FALSE(main_task_runner_->HasPendingTask());
155 EXPECT_EQ(0u, event_queue().size()); 166 EXPECT_EQ(0u, event_queue().size());
156 EXPECT_EQ(2u, handled_events_.size()); 167 EXPECT_EQ(2u, handled_events_.size());
168 for (const auto& coalescedEvents : handled_coalesced_events_) {
169 EXPECT_EQ(2u, coalescedEvents.size());
170 }
157 171
158 { 172 {
159 EXPECT_EQ(kEvents[0].size(), handled_events_.at(0)->size()); 173 EXPECT_EQ(kEvents[0].size(), handled_events_.at(0)->size());
160 EXPECT_EQ(kEvents[0].type(), handled_events_.at(0)->type()); 174 EXPECT_EQ(kEvents[0].type(), handled_events_.at(0)->type());
161 const WebMouseWheelEvent* last_wheel_event = 175 const WebMouseWheelEvent* last_wheel_event =
162 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get()); 176 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get());
163 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, 177 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive,
164 last_wheel_event->dispatchType); 178 last_wheel_event->dispatchType);
165 WebMouseWheelEvent coalesced_event = kEvents[0]; 179 WebMouseWheelEvent coalesced_event = kEvents[0];
166 ui::Coalesce(kEvents[1], &coalesced_event); 180 ui::Coalesce(kEvents[1], &coalesced_event);
167 coalesced_event.dispatchType = 181 coalesced_event.dispatchType =
168 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 182 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
169 EXPECT_EQ(coalesced_event, *last_wheel_event); 183 EXPECT_EQ(coalesced_event, *last_wheel_event);
170 } 184 }
171 185
172 { 186 {
187 WebMouseWheelEvent coalesced_event = kEvents[0];
188 const WebMouseWheelEvent* coalesced_wheel_event0 =
189 static_cast<const WebMouseWheelEvent*>(
190 handled_coalesced_events_[0][0].get());
191 coalesced_event.dispatchType =
192 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
193 EXPECT_EQ(coalesced_event, *coalesced_wheel_event0);
194
195 coalesced_event = kEvents[1];
196 const WebMouseWheelEvent* coalesced_wheel_event1 =
197 static_cast<const WebMouseWheelEvent*>(
198 handled_coalesced_events_[0][1].get());
199 coalesced_event.dispatchType =
200 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
201 EXPECT_EQ(coalesced_event, *coalesced_wheel_event1);
202 }
203
204 {
173 const WebMouseWheelEvent* last_wheel_event = 205 const WebMouseWheelEvent* last_wheel_event =
174 static_cast<const WebMouseWheelEvent*>(handled_events_.at(1).get()); 206 static_cast<const WebMouseWheelEvent*>(handled_events_.at(1).get());
175 WebMouseWheelEvent coalesced_event = kEvents[2]; 207 WebMouseWheelEvent coalesced_event = kEvents[2];
176 ui::Coalesce(kEvents[3], &coalesced_event); 208 ui::Coalesce(kEvents[3], &coalesced_event);
177 coalesced_event.dispatchType = 209 coalesced_event.dispatchType =
178 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 210 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
179 EXPECT_EQ(coalesced_event, *last_wheel_event); 211 EXPECT_EQ(coalesced_event, *last_wheel_event);
180 } 212 }
213
214 {
215 WebMouseWheelEvent coalesced_event = kEvents[2];
216 const WebMouseWheelEvent* coalesced_wheel_event0 =
217 static_cast<const WebMouseWheelEvent*>(
218 handled_coalesced_events_[1][0].get());
219 coalesced_event.dispatchType =
220 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
221 EXPECT_EQ(coalesced_event, *coalesced_wheel_event0);
222
223 coalesced_event = kEvents[3];
224 const WebMouseWheelEvent* coalesced_wheel_event1 =
225 static_cast<const WebMouseWheelEvent*>(
226 handled_coalesced_events_[1][1].get());
227 coalesced_event.dispatchType =
228 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
229 EXPECT_EQ(coalesced_event, *coalesced_wheel_event1);
230 }
231
181 histogram_tester.ExpectUniqueSample(kCoalescedCountHistogram, 1, 2); 232 histogram_tester.ExpectUniqueSample(kCoalescedCountHistogram, 1, 2);
182 } 233 }
183 234
184 TEST_P(MainThreadEventQueueTest, NonBlockingTouch) { 235 TEST_P(MainThreadEventQueueTest, NonBlockingTouch) {
185 base::HistogramTester histogram_tester; 236 base::HistogramTester histogram_tester;
186 237
187 SyntheticWebTouchEvent kEvents[4]; 238 SyntheticWebTouchEvent kEvents[4];
188 kEvents[0].PressPoint(10, 10); 239 kEvents[0].PressPoint(10, 10);
189 kEvents[1].PressPoint(10, 10); 240 kEvents[1].PressPoint(10, 10);
190 kEvents[1].setModifiers(1); 241 kEvents[1].setModifiers(1);
191 kEvents[1].MovePoint(0, 20, 20); 242 kEvents[1].MovePoint(0, 20, 20);
192 kEvents[2].PressPoint(10, 10); 243 kEvents[2].PressPoint(10, 10);
193 kEvents[2].MovePoint(0, 30, 30); 244 kEvents[2].MovePoint(0, 30, 30);
194 kEvents[3].PressPoint(10, 10); 245 kEvents[3].PressPoint(10, 10);
195 kEvents[3].MovePoint(0, 35, 35); 246 kEvents[3].MovePoint(0, 35, 35);
196 247
197 for (SyntheticWebTouchEvent& event : kEvents) 248 for (SyntheticWebTouchEvent& event : kEvents)
198 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 249 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
199 250
200 EXPECT_EQ(3u, event_queue().size()); 251 EXPECT_EQ(3u, event_queue().size());
201 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 252 EXPECT_TRUE(main_task_runner_->HasPendingTask());
202 RunPendingTasksWithSimulatedRaf(); 253 RunPendingTasksWithSimulatedRaf();
203 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 254 EXPECT_FALSE(main_task_runner_->HasPendingTask());
204 EXPECT_EQ(0u, event_queue().size()); 255 EXPECT_EQ(0u, event_queue().size());
205 EXPECT_EQ(3u, handled_events_.size()); 256 EXPECT_EQ(3u, handled_events_.size());
257 EXPECT_EQ(3u, handled_coalesced_events_.size());
206 258
207 EXPECT_EQ(kEvents[0].size(), handled_events_.at(0)->size()); 259 EXPECT_EQ(kEvents[0].size(), handled_events_.at(0)->size());
208 EXPECT_EQ(kEvents[0].type(), handled_events_.at(0)->type()); 260 EXPECT_EQ(kEvents[0].type(), handled_events_.at(0)->type());
209 const WebTouchEvent* last_touch_event = 261 const WebTouchEvent* last_touch_event =
210 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); 262 static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
211 kEvents[0].dispatchType = 263 kEvents[0].dispatchType =
212 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 264 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
213 EXPECT_EQ(kEvents[0], *last_touch_event); 265 EXPECT_EQ(kEvents[0], *last_touch_event);
266 EXPECT_EQ(1u, handled_coalesced_events_[0].size());
267
268 {
269 EXPECT_EQ(1u, handled_coalesced_events_[0].size());
270 const WebTouchEvent* coalesced_touch_event =
271 static_cast<const WebTouchEvent*>(
272 handled_coalesced_events_[0][0].get());
273 EXPECT_EQ(kEvents[0], *coalesced_touch_event);
274 }
214 275
215 EXPECT_EQ(kEvents[1].size(), handled_events_.at(1)->size()); 276 EXPECT_EQ(kEvents[1].size(), handled_events_.at(1)->size());
216 EXPECT_EQ(kEvents[1].type(), handled_events_.at(1)->type()); 277 EXPECT_EQ(kEvents[1].type(), handled_events_.at(1)->type());
217 last_touch_event = 278 last_touch_event =
218 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); 279 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
219 kEvents[1].dispatchType = 280 kEvents[1].dispatchType =
220 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 281 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
221 EXPECT_EQ(kEvents[1], *last_touch_event); 282 EXPECT_EQ(kEvents[1], *last_touch_event);
222 283
284 {
285 EXPECT_EQ(1u, handled_coalesced_events_[1].size());
286 const WebTouchEvent* coalesced_touch_event =
287 static_cast<const WebTouchEvent*>(
288 handled_coalesced_events_[1][0].get());
289 EXPECT_EQ(kEvents[1], *coalesced_touch_event);
290 }
291
223 EXPECT_EQ(kEvents[2].size(), handled_events_.at(1)->size()); 292 EXPECT_EQ(kEvents[2].size(), handled_events_.at(1)->size());
224 EXPECT_EQ(kEvents[2].type(), handled_events_.at(2)->type()); 293 EXPECT_EQ(kEvents[2].type(), handled_events_.at(2)->type());
225 last_touch_event = 294 last_touch_event =
226 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); 295 static_cast<const WebTouchEvent*>(handled_events_.at(2).get());
227 WebTouchEvent coalesced_event = kEvents[2]; 296 WebTouchEvent coalesced_event = kEvents[2];
228 ui::Coalesce(kEvents[3], &coalesced_event); 297 ui::Coalesce(kEvents[3], &coalesced_event);
229 coalesced_event.dispatchType = 298 coalesced_event.dispatchType =
230 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 299 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
231 EXPECT_EQ(coalesced_event, *last_touch_event); 300 EXPECT_EQ(coalesced_event, *last_touch_event);
301
302 {
303 EXPECT_EQ(2u, handled_coalesced_events_[2].size());
304 WebTouchEvent coalesced_event = kEvents[2];
305 const WebTouchEvent* coalesced_touch_event0 =
306 static_cast<const WebTouchEvent*>(
307 handled_coalesced_events_[2][0].get());
308 coalesced_event.dispatchType =
309 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
310 EXPECT_EQ(coalesced_event, *coalesced_touch_event0);
311
312 coalesced_event = kEvents[3];
313 const WebTouchEvent* coalesced_touch_event1 =
314 static_cast<const WebTouchEvent*>(
315 handled_coalesced_events_[2][1].get());
316 coalesced_event.dispatchType =
317 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
318 EXPECT_EQ(coalesced_event, *coalesced_touch_event1);
319 }
320
232 histogram_tester.ExpectBucketCount(kCoalescedCountHistogram, 0, 1); 321 histogram_tester.ExpectBucketCount(kCoalescedCountHistogram, 0, 1);
233 histogram_tester.ExpectBucketCount(kCoalescedCountHistogram, 1, 1); 322 histogram_tester.ExpectBucketCount(kCoalescedCountHistogram, 1, 1);
234 } 323 }
235 324
236 TEST_P(MainThreadEventQueueTest, BlockingTouch) { 325 TEST_P(MainThreadEventQueueTest, BlockingTouch) {
237 base::HistogramTester histogram_tester; 326 base::HistogramTester histogram_tester;
238 SyntheticWebTouchEvent kEvents[4]; 327 SyntheticWebTouchEvent kEvents[4];
239 kEvents[0].PressPoint(10, 10); 328 kEvents[0].PressPoint(10, 10);
240 kEvents[1].PressPoint(10, 10); 329 kEvents[1].PressPoint(10, 10);
241 kEvents[1].MovePoint(0, 20, 20); 330 kEvents[1].MovePoint(0, 20, 20);
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 709
621 // The boolean parameterized test varies whether rAF aligned input 710 // The boolean parameterized test varies whether rAF aligned input
622 // is enabled or not. 711 // is enabled or not.
623 INSTANTIATE_TEST_CASE_P( 712 INSTANTIATE_TEST_CASE_P(
624 MainThreadEventQueueTests, 713 MainThreadEventQueueTests,
625 MainThreadEventQueueTest, 714 MainThreadEventQueueTest,
626 testing::Range(0u, 715 testing::Range(0u,
627 (kRafAlignedEnabledTouch | kRafAlignedEnabledMouse) + 1)); 716 (kRafAlignedEnabledTouch | kRafAlignedEnabledMouse) + 1));
628 717
629 } // namespace content 718 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698