Index: content/renderer/input/main_thread_event_queue_unittest.cc |
diff --git a/content/renderer/input/main_thread_event_queue_unittest.cc b/content/renderer/input/main_thread_event_queue_unittest.cc |
index e54d0794fab5dd50764a14075c38c9ad7e97652d..5ae8efeff6a284369af6c97408f7a1233895e78c 100644 |
--- a/content/renderer/input/main_thread_event_queue_unittest.cc |
+++ b/content/renderer/input/main_thread_event_queue_unittest.cc |
@@ -71,6 +71,10 @@ class MainThreadEventQueueTest : public testing::Test, |
return queue_->events_; |
} |
+ bool is_last_touch_start_force_passive() { |
+ return queue_->is_last_touch_start_force_passive_; |
+ } |
+ |
protected: |
scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; |
scoped_refptr<MainThreadEventQueue> queue_; |
@@ -247,4 +251,119 @@ TEST_F(MainThreadEventQueueTest, InterleavedEvents) { |
} |
} |
+TEST_F(MainThreadEventQueueTest, BlockingTouchesDuringFling) { |
+ std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); |
+ feature_list->InitializeFromCommandLine( |
+ features::kPassiveEventListenersDueToFling.name, std::string()); |
+ base::FeatureList::ClearInstanceForTesting(); |
+ base::FeatureList::SetInstance(std::move(feature_list)); |
+ |
+ SyntheticWebTouchEvent kEvents[1]; |
+ kEvents[0].PressPoint(10, 10); |
+ kEvents[0].touchStartOrFirstTouchMove = true; |
+ queue_->set_is_flinging(true); |
+ |
+ EXPECT_FALSE(is_last_touch_start_force_passive()); |
+ HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ main_task_runner_->RunUntilIdle(); |
+ EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
+ EXPECT_EQ(0u, event_queue().size()); |
+ EXPECT_EQ(1u, handled_events_.size()); |
+ EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); |
+ EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); |
+ EXPECT_TRUE(is_last_touch_start_force_passive()); |
+ const WebTouchEvent* last_touch_event = |
+ static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); |
+ kEvents[0].dispatchedDuringFling = true; |
+ kEvents[0].dispatchType = |
+ WebInputEvent::ListenersForcedNonBlockingPassiveDueToFling; |
+ EXPECT_EQ(kEvents[0], *last_touch_event); |
+ |
+ kEvents[0].MovePoint(0, 30, 30); |
+ HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ main_task_runner_->RunUntilIdle(); |
+ EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
+ EXPECT_EQ(0u, event_queue().size()); |
+ EXPECT_EQ(2u, handled_events_.size()); |
+ EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size); |
+ EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type); |
+ EXPECT_TRUE(is_last_touch_start_force_passive()); |
+ last_touch_event = |
+ static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); |
+ kEvents[0].dispatchedDuringFling = true; |
+ kEvents[0].dispatchType = |
+ WebInputEvent::ListenersForcedNonBlockingPassiveDueToFling; |
+ EXPECT_EQ(kEvents[0], *last_touch_event); |
+ |
+ kEvents[0].MovePoint(0, 50, 50); |
+ kEvents[0].touchStartOrFirstTouchMove = false; |
+ HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ main_task_runner_->RunUntilIdle(); |
+ EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
+ EXPECT_EQ(0u, event_queue().size()); |
+ EXPECT_EQ(3u, handled_events_.size()); |
+ EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size); |
+ EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type); |
+ EXPECT_TRUE(kEvents[0].dispatchedDuringFling); |
+ EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); |
+ last_touch_event = |
+ static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); |
+ EXPECT_EQ(kEvents[0], *last_touch_event); |
+ |
+ kEvents[0].ReleasePoint(0); |
+ HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ main_task_runner_->RunUntilIdle(); |
+ EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
+ EXPECT_EQ(0u, event_queue().size()); |
+ EXPECT_EQ(4u, handled_events_.size()); |
+ EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size); |
+ EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type); |
+ EXPECT_TRUE(kEvents[0].dispatchedDuringFling); |
+ EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); |
+ last_touch_event = |
+ static_cast<const WebTouchEvent*>(handled_events_.at(3).get()); |
+ EXPECT_EQ(kEvents[0], *last_touch_event); |
+} |
+ |
+TEST_F(MainThreadEventQueueTest, BlockingTouchesOutsideFling) { |
+ std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); |
+ feature_list->InitializeFromCommandLine( |
+ features::kPassiveEventListenersDueToFling.name, std::string()); |
+ base::FeatureList::ClearInstanceForTesting(); |
+ base::FeatureList::SetInstance(std::move(feature_list)); |
+ |
+ SyntheticWebTouchEvent kEvents[1]; |
+ kEvents[0].PressPoint(10, 10); |
+ kEvents[0].touchStartOrFirstTouchMove = true; |
+ |
+ HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ main_task_runner_->RunUntilIdle(); |
+ EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
+ EXPECT_EQ(0u, event_queue().size()); |
+ EXPECT_EQ(1u, handled_events_.size()); |
+ EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); |
+ EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); |
+ EXPECT_FALSE(kEvents[0].dispatchedDuringFling); |
+ EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); |
+ EXPECT_FALSE(is_last_touch_start_force_passive()); |
+ const WebTouchEvent* last_touch_event = |
+ static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); |
+ EXPECT_EQ(kEvents[0], *last_touch_event); |
+ |
+ kEvents[0].MovePoint(0, 30, 30); |
+ HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ main_task_runner_->RunUntilIdle(); |
+ EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
+ EXPECT_EQ(0u, event_queue().size()); |
+ EXPECT_EQ(2u, handled_events_.size()); |
+ EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size); |
+ EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type); |
+ EXPECT_FALSE(kEvents[0].dispatchedDuringFling); |
+ EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); |
+ EXPECT_FALSE(is_last_touch_start_force_passive()); |
+ last_touch_event = |
+ static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); |
+ EXPECT_EQ(kEvents[0], *last_touch_event); |
+} |
+ |
} // namespace content |