| 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 f2020e3d6aac743a0afa6bc733617e256370d14d..799325c54e6e3fcdad69748ea7a4a791233a0d26 100644
|
| --- a/content/renderer/input/main_thread_event_queue_unittest.cc
|
| +++ b/content/renderer/input/main_thread_event_queue_unittest.cc
|
| @@ -70,6 +70,18 @@ class MainThreadEventQueueTest : public testing::Test,
|
| return queue_->events_;
|
| }
|
|
|
| + void set_is_flinging(bool is_flinging) {
|
| + queue_->set_is_flinging(is_flinging);
|
| + }
|
| +
|
| + bool last_touch_start_forced_nonblocking_due_to_fling() {
|
| + return queue_->last_touch_start_forced_nonblocking_due_to_fling_;
|
| + }
|
| +
|
| + void set_enable_fling_passive_listener_flag(bool enable_flag) {
|
| + queue_->enable_fling_passive_listener_flag_ = enable_flag;
|
| + }
|
| +
|
| protected:
|
| scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_;
|
| scoped_refptr<MainThreadEventQueue> queue_;
|
| @@ -246,4 +258,142 @@ TEST_F(MainThreadEventQueueTest, InterleavedEvents) {
|
| }
|
| }
|
|
|
| -} // namespace content
|
| +TEST_F(MainThreadEventQueueTest, BlockingTouchesDuringFling) {
|
| + SyntheticWebTouchEvent kEvents[1];
|
| + kEvents[0].PressPoint(10, 10);
|
| + kEvents[0].touchStartOrFirstTouchMove = true;
|
| + set_is_flinging(true);
|
| + set_enable_fling_passive_listener_flag(true);
|
| +
|
| + EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
|
| + 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(last_touch_start_forced_nonblocking_due_to_fling());
|
| + const WebTouchEvent* last_touch_event =
|
| + static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
|
| + kEvents[0].dispatchedDuringFling = true;
|
| + kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling;
|
| + 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(last_touch_start_forced_nonblocking_due_to_fling());
|
| + last_touch_event =
|
| + static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
|
| + kEvents[0].dispatchedDuringFling = true;
|
| + kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling;
|
| + 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) {
|
| + SyntheticWebTouchEvent kEvents[1];
|
| + kEvents[0].PressPoint(10, 10);
|
| + kEvents[0].touchStartOrFirstTouchMove = true;
|
| + set_is_flinging(false);
|
| + set_enable_fling_passive_listener_flag(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(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(last_touch_start_forced_nonblocking_due_to_fling());
|
| + const WebTouchEvent* last_touch_event =
|
| + static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
|
| + EXPECT_EQ(kEvents[0], *last_touch_event);
|
| +
|
| + set_is_flinging(true);
|
| + set_enable_fling_passive_listener_flag(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(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(last_touch_start_forced_nonblocking_due_to_fling());
|
| + last_touch_event =
|
| + static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
|
| + kEvents[0].dispatchedDuringFling = true;
|
| + EXPECT_EQ(kEvents[0], *last_touch_event);
|
| +
|
| + set_is_flinging(false);
|
| + set_enable_fling_passive_listener_flag(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(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);
|
| + EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
|
| + last_touch_event =
|
| + static_cast<const WebTouchEvent*>(handled_events_.at(2).get());
|
| + kEvents[0].dispatchedDuringFling = false;
|
| + 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(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_FALSE(kEvents[0].dispatchedDuringFling);
|
| + EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
|
| + EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
|
| + last_touch_event =
|
| + static_cast<const WebTouchEvent*>(handled_events_.at(3).get());
|
| + EXPECT_EQ(kEvents[0], *last_touch_event);
|
| +}
|
| +
|
| +} // namespace content
|
|
|