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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 |
OLD | NEW |