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

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

Issue 2233543002: Make first TouchStart and first TouchMove events on a flinging layer non-blocking (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rename Created 4 years, 4 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 63
64 void HandleEvent(WebInputEvent& event, InputEventAckState ack_result) { 64 void HandleEvent(WebInputEvent& event, InputEventAckState ack_result) {
65 queue_->HandleEvent(ui::WebInputEventTraits::Clone(event), 65 queue_->HandleEvent(ui::WebInputEventTraits::Clone(event),
66 ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, ack_result); 66 ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, ack_result);
67 } 67 }
68 68
69 WebInputEventQueue<EventWithDispatchType>& event_queue() { 69 WebInputEventQueue<EventWithDispatchType>& event_queue() {
70 return queue_->events_; 70 return queue_->events_;
71 } 71 }
72 72
73 void set_is_flinging(bool is_flinging) {
74 queue_->set_is_flinging(is_flinging);
75 }
76
77 bool last_touch_start_forced_nonblocking_due_to_fling() {
78 return queue_->last_touch_start_forced_nonblocking_due_to_fling_;
79 }
80
81 void set_enable_fling_passive_listener_flag(bool enable_flag) {
82 queue_->enable_fling_passive_listener_flag_ = enable_flag;
83 }
84
73 protected: 85 protected:
74 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; 86 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_;
75 scoped_refptr<MainThreadEventQueue> queue_; 87 scoped_refptr<MainThreadEventQueue> queue_;
76 std::vector<ui::ScopedWebInputEvent> handled_events_; 88 std::vector<ui::ScopedWebInputEvent> handled_events_;
77 std::vector<uint32_t> additional_acked_events_; 89 std::vector<uint32_t> additional_acked_events_;
78 }; 90 };
79 91
80 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { 92 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) {
81 WebMouseWheelEvent kEvents[4] = { 93 WebMouseWheelEvent kEvents[4] = {
82 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), 94 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false),
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 const WebTouchEvent* last_touch_event = 251 const WebTouchEvent* last_touch_event =
240 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); 252 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
241 WebTouchEvent coalesced_event = kTouchEvents[0]; 253 WebTouchEvent coalesced_event = kTouchEvents[0];
242 internal::Coalesce(kTouchEvents[1], &coalesced_event); 254 internal::Coalesce(kTouchEvents[1], &coalesced_event);
243 coalesced_event.dispatchType = 255 coalesced_event.dispatchType =
244 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 256 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
245 EXPECT_EQ(coalesced_event, *last_touch_event); 257 EXPECT_EQ(coalesced_event, *last_touch_event);
246 } 258 }
247 } 259 }
248 260
249 } // namespace content 261 TEST_F(MainThreadEventQueueTest, BlockingTouchesDuringFling) {
262 SyntheticWebTouchEvent kEvents[1];
263 kEvents[0].PressPoint(10, 10);
264 kEvents[0].touchStartOrFirstTouchMove = true;
265 set_is_flinging(true);
266 set_enable_fling_passive_listener_flag(true);
267
268 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
269 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
270 main_task_runner_->RunUntilIdle();
271 EXPECT_FALSE(main_task_runner_->HasPendingTask());
272 EXPECT_EQ(0u, event_queue().size());
273 EXPECT_EQ(1u, handled_events_.size());
274 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size);
275 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type);
276 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling());
277 const WebTouchEvent* last_touch_event =
278 static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
279 kEvents[0].dispatchedDuringFling = true;
280 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling;
281 EXPECT_EQ(kEvents[0], *last_touch_event);
282
283 kEvents[0].MovePoint(0, 30, 30);
284 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
285 main_task_runner_->RunUntilIdle();
286 EXPECT_FALSE(main_task_runner_->HasPendingTask());
287 EXPECT_EQ(0u, event_queue().size());
288 EXPECT_EQ(2u, handled_events_.size());
289 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size);
290 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type);
291 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling());
292 last_touch_event =
293 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
294 kEvents[0].dispatchedDuringFling = true;
295 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling;
296 EXPECT_EQ(kEvents[0], *last_touch_event);
297
298 kEvents[0].MovePoint(0, 50, 50);
299 kEvents[0].touchStartOrFirstTouchMove = false;
300 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
301 main_task_runner_->RunUntilIdle();
302 EXPECT_FALSE(main_task_runner_->HasPendingTask());
303 EXPECT_EQ(0u, event_queue().size());
304 EXPECT_EQ(3u, handled_events_.size());
305 EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size);
306 EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type);
307 EXPECT_TRUE(kEvents[0].dispatchedDuringFling);
308 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
309 last_touch_event =
310 static_cast<const WebTouchEvent*>(handled_events_.at(2).get());
311 EXPECT_EQ(kEvents[0], *last_touch_event);
312
313 kEvents[0].ReleasePoint(0);
314 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
315 main_task_runner_->RunUntilIdle();
316 EXPECT_FALSE(main_task_runner_->HasPendingTask());
317 EXPECT_EQ(0u, event_queue().size());
318 EXPECT_EQ(4u, handled_events_.size());
319 EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size);
320 EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type);
321 EXPECT_TRUE(kEvents[0].dispatchedDuringFling);
322 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
323 last_touch_event =
324 static_cast<const WebTouchEvent*>(handled_events_.at(3).get());
325 EXPECT_EQ(kEvents[0], *last_touch_event);
326 }
327
328 TEST_F(MainThreadEventQueueTest, BlockingTouchesOutsideFling) {
329 SyntheticWebTouchEvent kEvents[1];
330 kEvents[0].PressPoint(10, 10);
331 kEvents[0].touchStartOrFirstTouchMove = true;
332 set_is_flinging(false);
333 set_enable_fling_passive_listener_flag(false);
334
335 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
336 main_task_runner_->RunUntilIdle();
337 EXPECT_FALSE(main_task_runner_->HasPendingTask());
338 EXPECT_EQ(0u, event_queue().size());
339 EXPECT_EQ(1u, handled_events_.size());
340 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size);
341 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type);
342 EXPECT_FALSE(kEvents[0].dispatchedDuringFling);
343 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
344 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
345 const WebTouchEvent* last_touch_event =
346 static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
347 EXPECT_EQ(kEvents[0], *last_touch_event);
348
349 set_is_flinging(true);
350 set_enable_fling_passive_listener_flag(false);
351 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
352 main_task_runner_->RunUntilIdle();
353 EXPECT_FALSE(main_task_runner_->HasPendingTask());
354 EXPECT_EQ(0u, event_queue().size());
355 EXPECT_EQ(2u, handled_events_.size());
356 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size);
357 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type);
358 EXPECT_FALSE(kEvents[0].dispatchedDuringFling);
359 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
360 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
361 last_touch_event =
362 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
363 kEvents[0].dispatchedDuringFling = true;
364 EXPECT_EQ(kEvents[0], *last_touch_event);
365
366 set_is_flinging(false);
367 set_enable_fling_passive_listener_flag(true);
368 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
369 main_task_runner_->RunUntilIdle();
370 EXPECT_FALSE(main_task_runner_->HasPendingTask());
371 EXPECT_EQ(0u, event_queue().size());
372 EXPECT_EQ(3u, handled_events_.size());
373 EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size);
374 EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type);
375 EXPECT_TRUE(kEvents[0].dispatchedDuringFling);
376 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
377 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
378 last_touch_event =
379 static_cast<const WebTouchEvent*>(handled_events_.at(2).get());
380 kEvents[0].dispatchedDuringFling = false;
381 EXPECT_EQ(kEvents[0], *last_touch_event);
382
383 kEvents[0].MovePoint(0, 30, 30);
384 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
385 main_task_runner_->RunUntilIdle();
386 EXPECT_FALSE(main_task_runner_->HasPendingTask());
387 EXPECT_EQ(0u, event_queue().size());
388 EXPECT_EQ(4u, handled_events_.size());
389 EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size);
390 EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type);
391 EXPECT_FALSE(kEvents[0].dispatchedDuringFling);
392 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
393 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
394 last_touch_event =
395 static_cast<const WebTouchEvent*>(handled_events_.at(3).get());
396 EXPECT_EQ(kEvents[0], *last_touch_event);
397 }
398
399 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/input/main_thread_event_queue.cc ('k') | content/renderer/input/render_widget_input_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698