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

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: fling intervetion 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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 void HandleEvent(WebInputEvent& event, InputEventAckState ack_result) { 64 void HandleEvent(WebInputEvent& event, InputEventAckState ack_result) {
65 queue_->HandleEvent(WebInputEventTraits::Clone(event), ui::LatencyInfo(), 65 queue_->HandleEvent(WebInputEventTraits::Clone(event), ui::LatencyInfo(),
66 DISPATCH_TYPE_BLOCKING, 66 DISPATCH_TYPE_BLOCKING,
67 ack_result); 67 ack_result);
68 } 68 }
69 69
70 WebInputEventQueue<EventWithDispatchType>& event_queue() { 70 WebInputEventQueue<EventWithDispatchType>& event_queue() {
71 return queue_->events_; 71 return queue_->events_;
72 } 72 }
73 73
74 bool is_last_touch_start_force_passive() {
75 return queue_->is_last_touch_start_force_passive_;
76 }
77
74 protected: 78 protected:
75 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; 79 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_;
76 scoped_refptr<MainThreadEventQueue> queue_; 80 scoped_refptr<MainThreadEventQueue> queue_;
77 std::vector<ScopedWebInputEvent> handled_events_; 81 std::vector<ScopedWebInputEvent> handled_events_;
78 std::vector<uint32_t> additional_acked_events_; 82 std::vector<uint32_t> additional_acked_events_;
79 }; 83 };
80 84
81 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { 85 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) {
82 WebMouseWheelEvent kEvents[4] = { 86 WebMouseWheelEvent kEvents[4] = {
83 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), 87 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false),
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 const WebTouchEvent* last_touch_event = 244 const WebTouchEvent* last_touch_event =
241 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); 245 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
242 WebTouchEvent coalesced_event = kTouchEvents[0]; 246 WebTouchEvent coalesced_event = kTouchEvents[0];
243 internal::Coalesce(kTouchEvents[1], &coalesced_event); 247 internal::Coalesce(kTouchEvents[1], &coalesced_event);
244 coalesced_event.dispatchType = 248 coalesced_event.dispatchType =
245 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 249 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
246 EXPECT_EQ(coalesced_event, *last_touch_event); 250 EXPECT_EQ(coalesced_event, *last_touch_event);
247 } 251 }
248 } 252 }
249 253
254 TEST_F(MainThreadEventQueueTest, BlockingTouchesDuringFling) {
255 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
256 feature_list->InitializeFromCommandLine(
257 features::kPassiveEventListenersDueToFling.name, std::string());
258 base::FeatureList::ClearInstanceForTesting();
259 base::FeatureList::SetInstance(std::move(feature_list));
260
261 SyntheticWebTouchEvent kEvents[1];
262 kEvents[0].PressPoint(10, 10);
263 kEvents[0].touchStartOrFirstTouchMove = true;
264 queue_->set_is_flinging(true);
265
266 EXPECT_FALSE(is_last_touch_start_force_passive());
267 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
268 main_task_runner_->RunUntilIdle();
269 EXPECT_FALSE(main_task_runner_->HasPendingTask());
270 EXPECT_EQ(0u, event_queue().size());
271 EXPECT_EQ(1u, handled_events_.size());
272 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size);
273 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type);
274 EXPECT_TRUE(is_last_touch_start_force_passive());
275 const WebTouchEvent* last_touch_event =
276 static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
277 kEvents[0].dispatchedDuringFling = true;
278 kEvents[0].dispatchType =
279 WebInputEvent::ListenersForcedNonBlockingPassiveDueToFling;
280 EXPECT_EQ(kEvents[0], *last_touch_event);
281
282 kEvents[0].MovePoint(0, 30, 30);
283 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
284 main_task_runner_->RunUntilIdle();
285 EXPECT_FALSE(main_task_runner_->HasPendingTask());
286 EXPECT_EQ(0u, event_queue().size());
287 EXPECT_EQ(2u, handled_events_.size());
288 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size);
289 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type);
290 EXPECT_TRUE(is_last_touch_start_force_passive());
291 last_touch_event =
292 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
293 kEvents[0].dispatchedDuringFling = true;
294 kEvents[0].dispatchType =
295 WebInputEvent::ListenersForcedNonBlockingPassiveDueToFling;
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 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
330 feature_list->InitializeFromCommandLine(
331 features::kPassiveEventListenersDueToFling.name, std::string());
332 base::FeatureList::ClearInstanceForTesting();
333 base::FeatureList::SetInstance(std::move(feature_list));
334
335 SyntheticWebTouchEvent kEvents[1];
336 kEvents[0].PressPoint(10, 10);
337 kEvents[0].touchStartOrFirstTouchMove = true;
338
339 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
340 main_task_runner_->RunUntilIdle();
341 EXPECT_FALSE(main_task_runner_->HasPendingTask());
342 EXPECT_EQ(0u, event_queue().size());
343 EXPECT_EQ(1u, handled_events_.size());
344 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size);
345 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type);
346 EXPECT_FALSE(kEvents[0].dispatchedDuringFling);
347 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
348 EXPECT_FALSE(is_last_touch_start_force_passive());
349 const WebTouchEvent* last_touch_event =
350 static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
351 EXPECT_EQ(kEvents[0], *last_touch_event);
352
353 kEvents[0].MovePoint(0, 30, 30);
354 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
355 main_task_runner_->RunUntilIdle();
356 EXPECT_FALSE(main_task_runner_->HasPendingTask());
357 EXPECT_EQ(0u, event_queue().size());
358 EXPECT_EQ(2u, handled_events_.size());
359 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size);
360 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type);
361 EXPECT_FALSE(kEvents[0].dispatchedDuringFling);
362 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
363 EXPECT_FALSE(is_last_touch_start_force_passive());
364 last_touch_event =
365 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
366 EXPECT_EQ(kEvents[0], *last_touch_event);
367 }
368
250 } // namespace content 369 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698