OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |