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 40a99c5131fbfb82c14a0b3cbbfb5f0a271a3a52..1760b26eed28b5aba1b927db28b25cf6ba36fe89 100644 |
--- a/content/renderer/input/main_thread_event_queue_unittest.cc |
+++ b/content/renderer/input/main_thread_event_queue_unittest.cc |
@@ -52,13 +52,53 @@ const char* kCoalescedCountHistogram = |
} // namespace |
+class HandledTask { |
+ public: |
+ virtual ~HandledTask() {} |
+ |
+ virtual blink::WebCoalescedInputEvent* taskAsEvent() = 0; |
+ virtual unsigned taskAsClosure() const = 0; |
+}; |
+ |
+class HandledEvent : public HandledTask { |
+ public: |
+ explicit HandledEvent(const blink::WebCoalescedInputEvent* event) |
+ : event_(event->event(), event->getCoalescedEventsPointers()) {} |
+ ~HandledEvent() override {} |
+ |
+ blink::WebCoalescedInputEvent* taskAsEvent() override { return &event_; } |
+ unsigned taskAsClosure() const override { |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ |
+ private: |
+ blink::WebCoalescedInputEvent event_; |
+}; |
+ |
+class HandledClosure : public HandledTask { |
+ public: |
+ explicit HandledClosure(unsigned closure_id) : closure_id_(closure_id) {} |
+ ~HandledClosure() override {} |
+ |
+ blink::WebCoalescedInputEvent* taskAsEvent() override { |
+ NOTREACHED(); |
+ return nullptr; |
+ } |
+ unsigned taskAsClosure() const override { return closure_id_; } |
+ |
+ private: |
+ unsigned closure_id_; |
+}; |
+ |
class MainThreadEventQueueTest : public testing::TestWithParam<unsigned>, |
public MainThreadEventQueueClient { |
public: |
MainThreadEventQueueTest() |
: main_task_runner_(new base::TestSimpleTaskRunner()), |
raf_aligned_input_setting_(GetParam()), |
- needs_main_frame_(false) { |
+ needs_main_frame_(false), |
+ closure_count_(0) { |
std::vector<base::StringPiece> features; |
std::vector<base::StringPiece> disabled_features; |
if (raf_aligned_input_setting_ & kRafAlignedEnabledTouch) { |
@@ -86,8 +126,9 @@ class MainThreadEventQueueTest : public testing::TestWithParam<unsigned>, |
const ui::LatencyInfo& latency, |
InputEventDispatchType type) override { |
EXPECT_EQ(kTestRoutingID, routing_id); |
- handled_events_.push_back(blink::WebCoalescedInputEvent( |
- event->event(), event->getCoalescedEventsPointers())); |
+ |
+ std::unique_ptr<HandledTask> handled_event(new HandledEvent(event)); |
+ handled_tasks_.push_back(std::move(handled_event)); |
queue_->EventHandled(event->event().type(), |
blink::WebInputEventResult::HandledApplication, |
@@ -107,9 +148,20 @@ class MainThreadEventQueueTest : public testing::TestWithParam<unsigned>, |
ack_result); |
} |
+ void RunClosure(unsigned closure_id) { |
+ std::unique_ptr<HandledTask> closure(new HandledClosure(closure_id)); |
+ handled_tasks_.push_back(std::move(closure)); |
+ } |
+ |
+ void QueueClosure() { |
+ unsigned closure_id = ++closure_count_; |
+ queue_->QueueClosure(base::Bind(&MainThreadEventQueueTest::RunClosure, |
+ base::Unretained(this), closure_id)); |
+ } |
+ |
void NeedsMainFrame(int routing_id) override { needs_main_frame_ = true; } |
- WebInputEventQueue<EventWithDispatchType>& event_queue() { |
+ MainThreadEventQueueTaskList& event_queue() { |
return queue_->shared_state_.events_; |
} |
@@ -143,12 +195,13 @@ class MainThreadEventQueueTest : public testing::TestWithParam<unsigned>, |
scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; |
blink::scheduler::MockRendererScheduler renderer_scheduler_; |
scoped_refptr<MainThreadEventQueue> queue_; |
- std::vector<blink::WebCoalescedInputEvent> handled_events_; |
+ std::vector<std::unique_ptr<HandledTask>> handled_tasks_; |
std::vector<uint32_t> additional_acked_events_; |
int raf_aligned_input_setting_; |
bool needs_main_frame_; |
base::TimeTicks frame_time_; |
+ unsigned closure_count_; |
}; |
TEST_P(MainThreadEventQueueTest, NonBlockingWheel) { |
@@ -173,17 +226,19 @@ TEST_P(MainThreadEventQueueTest, NonBlockingWheel) { |
RunPendingTasksWithSimulatedRaf(); |
EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
EXPECT_EQ(0u, event_queue().size()); |
- EXPECT_EQ(2u, handled_events_.size()); |
- for (const auto& coalesced_event : handled_events_) { |
- EXPECT_EQ(2u, coalesced_event.coalescedEventSize()); |
+ EXPECT_EQ(2u, handled_tasks_.size()); |
+ for (const auto& task : handled_tasks_) { |
+ EXPECT_EQ(2u, task->taskAsEvent()->coalescedEventSize()); |
} |
{ |
- EXPECT_EQ(kEvents[0].size(), handled_events_.at(0).event().size()); |
- EXPECT_EQ(kEvents[0].type(), handled_events_.at(0).event().type()); |
+ EXPECT_EQ(kEvents[0].size(), |
+ handled_tasks_.at(0)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents[0].type(), |
+ handled_tasks_.at(0)->taskAsEvent()->event().type()); |
const WebMouseWheelEvent* last_wheel_event = |
static_cast<const WebMouseWheelEvent*>( |
- handled_events_.at(0).eventPointer()); |
+ handled_tasks_.at(0)->taskAsEvent()->eventPointer()); |
EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, |
last_wheel_event->dispatchType); |
WebMouseWheelEvent coalesced_event = kEvents[0]; |
@@ -196,7 +251,7 @@ TEST_P(MainThreadEventQueueTest, NonBlockingWheel) { |
{ |
WebMouseWheelEvent coalesced_event = kEvents[0]; |
std::vector<const WebInputEvent*> coalesced_events = |
- handled_events_[0].getCoalescedEventsPointers(); |
+ handled_tasks_[0]->taskAsEvent()->getCoalescedEventsPointers(); |
const WebMouseWheelEvent* coalesced_wheel_event0 = |
static_cast<const WebMouseWheelEvent*>(coalesced_events[0]); |
coalesced_event.dispatchType = |
@@ -214,7 +269,7 @@ TEST_P(MainThreadEventQueueTest, NonBlockingWheel) { |
{ |
const WebMouseWheelEvent* last_wheel_event = |
static_cast<const WebMouseWheelEvent*>( |
- handled_events_.at(1).eventPointer()); |
+ handled_tasks_.at(1)->taskAsEvent()->eventPointer()); |
WebMouseWheelEvent coalesced_event = kEvents[2]; |
ui::Coalesce(kEvents[3], &coalesced_event); |
coalesced_event.dispatchType = |
@@ -225,7 +280,7 @@ TEST_P(MainThreadEventQueueTest, NonBlockingWheel) { |
{ |
WebMouseWheelEvent coalesced_event = kEvents[2]; |
std::vector<const WebInputEvent*> coalesced_events = |
- handled_events_[1].getCoalescedEventsPointers(); |
+ handled_tasks_[1]->taskAsEvent()->getCoalescedEventsPointers(); |
const WebMouseWheelEvent* coalesced_wheel_event0 = |
static_cast<const WebMouseWheelEvent*>(coalesced_events[0]); |
coalesced_event.dispatchType = |
@@ -264,44 +319,50 @@ TEST_P(MainThreadEventQueueTest, NonBlockingTouch) { |
RunPendingTasksWithSimulatedRaf(); |
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(0).event().size()); |
- EXPECT_EQ(kEvents[0].type(), handled_events_.at(0).event().type()); |
- const WebTouchEvent* last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(0).eventPointer()); |
+ EXPECT_EQ(3u, handled_tasks_.size()); |
+ |
+ EXPECT_EQ(kEvents[0].size(), |
+ handled_tasks_.at(0)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents[0].type(), |
+ handled_tasks_.at(0)->taskAsEvent()->event().type()); |
+ const WebTouchEvent* last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(0)->taskAsEvent()->eventPointer()); |
kEvents[0].dispatchType = |
WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
EXPECT_EQ(kEvents[0], *last_touch_event); |
{ |
- EXPECT_EQ(1u, handled_events_[0].coalescedEventSize()); |
+ EXPECT_EQ(1u, handled_tasks_[0]->taskAsEvent()->coalescedEventSize()); |
const WebTouchEvent* coalesced_touch_event = |
static_cast<const WebTouchEvent*>( |
- handled_events_[0].getCoalescedEventsPointers()[0]); |
+ handled_tasks_[0]->taskAsEvent()->getCoalescedEventsPointers()[0]); |
EXPECT_EQ(kEvents[0], *coalesced_touch_event); |
} |
- EXPECT_EQ(kEvents[1].size(), handled_events_.at(1).event().size()); |
- EXPECT_EQ(kEvents[1].type(), handled_events_.at(1).event().type()); |
- last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(1).eventPointer()); |
+ EXPECT_EQ(kEvents[1].size(), |
+ handled_tasks_.at(1)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents[1].type(), |
+ handled_tasks_.at(1)->taskAsEvent()->event().type()); |
+ last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(1)->taskAsEvent()->eventPointer()); |
kEvents[1].dispatchType = |
WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
EXPECT_EQ(kEvents[1], *last_touch_event); |
{ |
- EXPECT_EQ(1u, handled_events_[1].coalescedEventSize()); |
+ EXPECT_EQ(1u, handled_tasks_[1]->taskAsEvent()->coalescedEventSize()); |
const WebTouchEvent* coalesced_touch_event = |
static_cast<const WebTouchEvent*>( |
- handled_events_[1].getCoalescedEventsPointers()[0]); |
+ handled_tasks_[1]->taskAsEvent()->getCoalescedEventsPointers()[0]); |
EXPECT_EQ(kEvents[1], *coalesced_touch_event); |
} |
- EXPECT_EQ(kEvents[2].size(), handled_events_.at(1).event().size()); |
- EXPECT_EQ(kEvents[2].type(), handled_events_.at(2).event().type()); |
- last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(2).eventPointer()); |
+ EXPECT_EQ(kEvents[2].size(), |
+ handled_tasks_.at(1)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents[2].type(), |
+ handled_tasks_.at(2)->taskAsEvent()->event().type()); |
+ last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(2)->taskAsEvent()->eventPointer()); |
WebTouchEvent coalesced_event = kEvents[2]; |
ui::Coalesce(kEvents[3], &coalesced_event); |
coalesced_event.dispatchType = |
@@ -309,10 +370,10 @@ TEST_P(MainThreadEventQueueTest, NonBlockingTouch) { |
EXPECT_EQ(coalesced_event, *last_touch_event); |
{ |
- EXPECT_EQ(2u, handled_events_[2].coalescedEventSize()); |
+ EXPECT_EQ(2u, handled_tasks_[2]->taskAsEvent()->coalescedEventSize()); |
WebTouchEvent coalesced_event = kEvents[2]; |
std::vector<const WebInputEvent*> coalesced_events = |
- handled_events_[2].getCoalescedEventsPointers(); |
+ handled_tasks_[2]->taskAsEvent()->getCoalescedEventsPointers(); |
const WebTouchEvent* coalesced_touch_event0 = |
static_cast<const WebTouchEvent*>(coalesced_events[0]); |
coalesced_event.dispatchType = |
@@ -360,8 +421,8 @@ TEST_P(MainThreadEventQueueTest, BlockingTouch) { |
EXPECT_EQ(kEvents[1].uniqueTouchEventId, additional_acked_events_.at(0)); |
EXPECT_EQ(kEvents[2].uniqueTouchEventId, additional_acked_events_.at(1)); |
- const WebTouchEvent* last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(1).eventPointer()); |
+ const WebTouchEvent* last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(1)->taskAsEvent()->eventPointer()); |
EXPECT_EQ(kEvents[3].uniqueTouchEventId, |
last_touch_event->uniqueTouchEventId); |
@@ -399,13 +460,15 @@ TEST_P(MainThreadEventQueueTest, InterleavedEvents) { |
RunPendingTasksWithSimulatedRaf(); |
EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
EXPECT_EQ(0u, event_queue().size()); |
- EXPECT_EQ(2u, handled_events_.size()); |
+ EXPECT_EQ(2u, handled_tasks_.size()); |
{ |
- EXPECT_EQ(kWheelEvents[0].size(), handled_events_.at(0).event().size()); |
- EXPECT_EQ(kWheelEvents[0].type(), handled_events_.at(0).event().type()); |
+ EXPECT_EQ(kWheelEvents[0].size(), |
+ handled_tasks_.at(0)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kWheelEvents[0].type(), |
+ handled_tasks_.at(0)->taskAsEvent()->event().type()); |
const WebMouseWheelEvent* last_wheel_event = |
static_cast<const WebMouseWheelEvent*>( |
- handled_events_.at(0).eventPointer()); |
+ handled_tasks_.at(0)->taskAsEvent()->eventPointer()); |
EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, |
last_wheel_event->dispatchType); |
WebMouseWheelEvent coalesced_event = kWheelEvents[0]; |
@@ -415,10 +478,12 @@ TEST_P(MainThreadEventQueueTest, InterleavedEvents) { |
EXPECT_EQ(coalesced_event, *last_wheel_event); |
} |
{ |
- EXPECT_EQ(kTouchEvents[0].size(), handled_events_.at(1).event().size()); |
- EXPECT_EQ(kTouchEvents[0].type(), handled_events_.at(1).event().type()); |
- const WebTouchEvent* last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(1).eventPointer()); |
+ EXPECT_EQ(kTouchEvents[0].size(), |
+ handled_tasks_.at(1)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kTouchEvents[0].type(), |
+ handled_tasks_.at(1)->taskAsEvent()->event().type()); |
+ const WebTouchEvent* last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(1)->taskAsEvent()->eventPointer()); |
WebTouchEvent coalesced_event = kTouchEvents[0]; |
ui::Coalesce(kTouchEvents[1], &coalesced_event); |
coalesced_event.dispatchType = |
@@ -441,9 +506,10 @@ TEST_P(MainThreadEventQueueTest, RafAlignedMouseInput) { |
WebMouseEvent mouseUp = |
SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseUp, 10, 10, 0); |
- WebMouseWheelEvent wheelEvents[2] = { |
+ WebMouseWheelEvent wheelEvents[3] = { |
SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), |
SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), |
+ SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 1, false), |
}; |
EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
@@ -466,20 +532,35 @@ TEST_P(MainThreadEventQueueTest, RafAlignedMouseInput) { |
EXPECT_EQ(0u, event_queue().size()); |
RunPendingTasksWithSimulatedRaf(); |
- // Simulate the rAF running before the PostTask occurs. The first rAF |
- // shouldn't do anything. |
+ // Simulate the rAF running before the PostTask occurs. The rAF |
+ // will consume everything. |
HandleEvent(mouseDown, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
HandleEvent(wheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
EXPECT_EQ(2u, event_queue().size()); |
EXPECT_TRUE(needs_main_frame_); |
RunSimulatedRafOnce(); |
EXPECT_FALSE(needs_main_frame_); |
- EXPECT_EQ(2u, event_queue().size()); |
+ EXPECT_EQ(0u, event_queue().size()); |
+ main_task_runner_->RunUntilIdle(); |
+ |
+ // Simulate event consumption but no rAF signal. The mouse wheel events |
+ // should still be in the queue. |
+ handled_tasks_.clear(); |
+ HandleEvent(mouseDown, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
+ HandleEvent(wheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
+ HandleEvent(mouseUp, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
+ HandleEvent(wheelEvents[2], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
+ HandleEvent(wheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
+ EXPECT_EQ(5u, event_queue().size()); |
+ EXPECT_TRUE(needs_main_frame_); |
main_task_runner_->RunUntilIdle(); |
EXPECT_TRUE(needs_main_frame_); |
- EXPECT_EQ(1u, event_queue().size()); |
- RunPendingTasksWithSimulatedRaf(); |
- EXPECT_EQ(0u, event_queue().size()); |
+ EXPECT_EQ(2u, event_queue().size()); |
+ RunSimulatedRafOnce(); |
+ EXPECT_EQ(wheelEvents[2].modifiers(), |
+ handled_tasks_.at(3)->taskAsEvent()->event().modifiers()); |
+ EXPECT_EQ(wheelEvents[0].modifiers(), |
+ handled_tasks_.at(4)->taskAsEvent()->event().modifiers()); |
} |
TEST_P(MainThreadEventQueueTest, RafAlignedTouchInput) { |
@@ -511,17 +592,28 @@ TEST_P(MainThreadEventQueueTest, RafAlignedTouchInput) { |
EXPECT_EQ(0u, event_queue().size()); |
RunPendingTasksWithSimulatedRaf(); |
- // Simulate the rAF running before the PostTask occurs. The first rAF |
- // shouldn't do anything. |
+ // Simulate the rAF running before the PostTask occurs. The rAF |
+ // will consume everything. |
HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
EXPECT_EQ(2u, event_queue().size()); |
EXPECT_TRUE(needs_main_frame_); |
RunSimulatedRafOnce(); |
EXPECT_FALSE(needs_main_frame_); |
- EXPECT_EQ(2u, event_queue().size()); |
- RunPendingTasksWithSimulatedRaf(); |
EXPECT_EQ(0u, event_queue().size()); |
+ main_task_runner_->RunUntilIdle(); |
+ |
+ // Simulate event consumption but no rAF signal. The touch events |
+ // should still be in the queue. |
+ handled_tasks_.clear(); |
+ HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
+ HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
+ EXPECT_EQ(2u, event_queue().size()); |
+ EXPECT_TRUE(needs_main_frame_); |
+ main_task_runner_->RunUntilIdle(); |
+ EXPECT_TRUE(needs_main_frame_); |
+ EXPECT_EQ(1u, event_queue().size()); |
+ RunSimulatedRafOnce(); |
// Simulate the touch move being discrete |
kEvents[0].touchStartOrFirstTouchMove = true; |
@@ -648,12 +740,14 @@ TEST_P(MainThreadEventQueueTest, BlockingTouchesDuringFling) { |
RunPendingTasksWithSimulatedRaf(); |
EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
EXPECT_EQ(0u, event_queue().size()); |
- EXPECT_EQ(1u, handled_events_.size()); |
- EXPECT_EQ(kEvents.size(), handled_events_.at(0).event().size()); |
- EXPECT_EQ(kEvents.type(), handled_events_.at(0).event().type()); |
+ EXPECT_EQ(1u, handled_tasks_.size()); |
+ EXPECT_EQ(kEvents.size(), |
+ handled_tasks_.at(0)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents.type(), |
+ handled_tasks_.at(0)->taskAsEvent()->event().type()); |
EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); |
- const WebTouchEvent* last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(0).eventPointer()); |
+ const WebTouchEvent* last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(0)->taskAsEvent()->eventPointer()); |
kEvents.dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; |
EXPECT_EQ(kEvents, *last_touch_event); |
@@ -665,12 +759,14 @@ TEST_P(MainThreadEventQueueTest, BlockingTouchesDuringFling) { |
RunPendingTasksWithSimulatedRaf(); |
EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
EXPECT_EQ(0u, event_queue().size()); |
- EXPECT_EQ(2u, handled_events_.size()); |
- EXPECT_EQ(kEvents.size(), handled_events_.at(1).event().size()); |
- EXPECT_EQ(kEvents.type(), handled_events_.at(1).event().type()); |
+ EXPECT_EQ(2u, handled_tasks_.size()); |
+ EXPECT_EQ(kEvents.size(), |
+ handled_tasks_.at(1)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents.type(), |
+ handled_tasks_.at(1)->taskAsEvent()->event().type()); |
EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); |
- last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(1).eventPointer()); |
+ last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(1)->taskAsEvent()->eventPointer()); |
kEvents.dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; |
EXPECT_EQ(kEvents, *last_touch_event); |
@@ -680,12 +776,14 @@ TEST_P(MainThreadEventQueueTest, BlockingTouchesDuringFling) { |
RunPendingTasksWithSimulatedRaf(); |
EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
EXPECT_EQ(0u, event_queue().size()); |
- EXPECT_EQ(3u, handled_events_.size()); |
- EXPECT_EQ(kEvents.size(), handled_events_.at(2).event().size()); |
- EXPECT_EQ(kEvents.type(), handled_events_.at(2).event().type()); |
+ EXPECT_EQ(3u, handled_tasks_.size()); |
+ EXPECT_EQ(kEvents.size(), |
+ handled_tasks_.at(2)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents.type(), |
+ handled_tasks_.at(2)->taskAsEvent()->event().type()); |
EXPECT_EQ(kEvents.dispatchType, WebInputEvent::Blocking); |
- last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(2).eventPointer()); |
+ last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(2)->taskAsEvent()->eventPointer()); |
EXPECT_EQ(kEvents, *last_touch_event); |
kEvents.ReleasePoint(0); |
@@ -693,12 +791,14 @@ TEST_P(MainThreadEventQueueTest, BlockingTouchesDuringFling) { |
RunPendingTasksWithSimulatedRaf(); |
EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
EXPECT_EQ(0u, event_queue().size()); |
- EXPECT_EQ(4u, handled_events_.size()); |
- EXPECT_EQ(kEvents.size(), handled_events_.at(3).event().size()); |
- EXPECT_EQ(kEvents.type(), handled_events_.at(3).event().type()); |
+ EXPECT_EQ(4u, handled_tasks_.size()); |
+ EXPECT_EQ(kEvents.size(), |
+ handled_tasks_.at(3)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents.type(), |
+ handled_tasks_.at(3)->taskAsEvent()->event().type()); |
EXPECT_EQ(kEvents.dispatchType, WebInputEvent::Blocking); |
- last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(3).eventPointer()); |
+ last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(3)->taskAsEvent()->eventPointer()); |
EXPECT_EQ(kEvents, *last_touch_event); |
} |
@@ -712,13 +812,15 @@ TEST_P(MainThreadEventQueueTest, BlockingTouchesOutsideFling) { |
RunPendingTasksWithSimulatedRaf(); |
EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
EXPECT_EQ(0u, event_queue().size()); |
- EXPECT_EQ(1u, handled_events_.size()); |
- EXPECT_EQ(kEvents.size(), handled_events_.at(0).event().size()); |
- EXPECT_EQ(kEvents.type(), handled_events_.at(0).event().type()); |
+ EXPECT_EQ(1u, handled_tasks_.size()); |
+ EXPECT_EQ(kEvents.size(), |
+ handled_tasks_.at(0)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents.type(), |
+ handled_tasks_.at(0)->taskAsEvent()->event().type()); |
EXPECT_EQ(kEvents.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).eventPointer()); |
+ const WebTouchEvent* last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(0)->taskAsEvent()->eventPointer()); |
EXPECT_EQ(kEvents, *last_touch_event); |
set_enable_fling_passive_listener_flag(false); |
@@ -726,13 +828,15 @@ TEST_P(MainThreadEventQueueTest, BlockingTouchesOutsideFling) { |
RunPendingTasksWithSimulatedRaf(); |
EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
EXPECT_EQ(0u, event_queue().size()); |
- EXPECT_EQ(2u, handled_events_.size()); |
- EXPECT_EQ(kEvents.size(), handled_events_.at(1).event().size()); |
- EXPECT_EQ(kEvents.type(), handled_events_.at(1).event().type()); |
+ EXPECT_EQ(2u, handled_tasks_.size()); |
+ EXPECT_EQ(kEvents.size(), |
+ handled_tasks_.at(1)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents.type(), |
+ handled_tasks_.at(1)->taskAsEvent()->event().type()); |
EXPECT_EQ(kEvents.dispatchType, WebInputEvent::Blocking); |
EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); |
- last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(1).eventPointer()); |
+ last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(1)->taskAsEvent()->eventPointer()); |
EXPECT_EQ(kEvents, *last_touch_event); |
set_enable_fling_passive_listener_flag(true); |
@@ -740,13 +844,15 @@ TEST_P(MainThreadEventQueueTest, BlockingTouchesOutsideFling) { |
RunPendingTasksWithSimulatedRaf(); |
EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
EXPECT_EQ(0u, event_queue().size()); |
- EXPECT_EQ(3u, handled_events_.size()); |
- EXPECT_EQ(kEvents.size(), handled_events_.at(2).event().size()); |
- EXPECT_EQ(kEvents.type(), handled_events_.at(2).event().type()); |
+ EXPECT_EQ(3u, handled_tasks_.size()); |
+ EXPECT_EQ(kEvents.size(), |
+ handled_tasks_.at(2)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents.type(), |
+ handled_tasks_.at(2)->taskAsEvent()->event().type()); |
EXPECT_EQ(kEvents.dispatchType, WebInputEvent::Blocking); |
EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); |
- last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(2).eventPointer()); |
+ last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(2)->taskAsEvent()->eventPointer()); |
EXPECT_EQ(kEvents, *last_touch_event); |
kEvents.MovePoint(0, 30, 30); |
@@ -754,13 +860,15 @@ TEST_P(MainThreadEventQueueTest, BlockingTouchesOutsideFling) { |
RunPendingTasksWithSimulatedRaf(); |
EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
EXPECT_EQ(0u, event_queue().size()); |
- EXPECT_EQ(4u, handled_events_.size()); |
- EXPECT_EQ(kEvents.size(), handled_events_.at(3).event().size()); |
- EXPECT_EQ(kEvents.type(), handled_events_.at(3).event().type()); |
+ EXPECT_EQ(4u, handled_tasks_.size()); |
+ EXPECT_EQ(kEvents.size(), |
+ handled_tasks_.at(3)->taskAsEvent()->event().size()); |
+ EXPECT_EQ(kEvents.type(), |
+ handled_tasks_.at(3)->taskAsEvent()->event().type()); |
EXPECT_EQ(kEvents.dispatchType, WebInputEvent::Blocking); |
EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); |
- last_touch_event = |
- static_cast<const WebTouchEvent*>(handled_events_.at(3).eventPointer()); |
+ last_touch_event = static_cast<const WebTouchEvent*>( |
+ handled_tasks_.at(3)->taskAsEvent()->eventPointer()); |
EXPECT_EQ(kEvents, *last_touch_event); |
} |
@@ -836,4 +944,93 @@ TEST_F(MainThreadEventQueueInitializationTest, |
main_thread_responsiveness_threshold()); |
} |
+TEST_P(MainThreadEventQueueTest, QueuingTwoClosures) { |
+ EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
+ EXPECT_EQ(0u, event_queue().size()); |
+ |
+ QueueClosure(); |
+ QueueClosure(); |
+ EXPECT_EQ(2u, event_queue().size()); |
+ EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
+ EXPECT_FALSE(needs_main_frame_); |
+ main_task_runner_->RunUntilIdle(); |
+ EXPECT_EQ(1u, handled_tasks_.at(0)->taskAsClosure()); |
+ EXPECT_EQ(2u, handled_tasks_.at(1)->taskAsClosure()); |
+} |
+ |
+TEST_P(MainThreadEventQueueTest, QueuingClosureWithRafEvent) { |
+ SyntheticWebTouchEvent kEvents[2]; |
+ kEvents[0].PressPoint(10, 10); |
+ kEvents[1].PressPoint(10, 10); |
+ kEvents[1].MovePoint(0, 20, 20); |
+ |
+ // Simulate queueuing closure, event, closure, raf aligned event. |
+ EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
+ EXPECT_EQ(0u, event_queue().size()); |
+ QueueClosure(); |
+ EXPECT_EQ(1u, event_queue().size()); |
+ EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
+ EXPECT_FALSE(needs_main_frame_); |
+ |
+ EXPECT_FALSE(HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED)); |
+ QueueClosure(); |
+ EXPECT_EQ(3u, event_queue().size()); |
+ EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
+ EXPECT_FALSE(needs_main_frame_); |
+ EXPECT_FALSE(HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_NOT_CONSUMED)); |
+ EXPECT_EQ(4u, event_queue().size()); |
+ |
+ if ((raf_aligned_input_setting_ & kRafAlignedEnabledTouch) != 0) { |
+ EXPECT_TRUE(needs_main_frame_); |
+ main_task_runner_->RunUntilIdle(); |
+ |
+ // The queue should still have the rAF event. |
+ EXPECT_TRUE(needs_main_frame_); |
+ EXPECT_EQ(1u, event_queue().size()); |
+ RunPendingTasksWithSimulatedRaf(); |
+ } else { |
+ EXPECT_FALSE(needs_main_frame_); |
+ main_task_runner_->RunUntilIdle(); |
+ } |
+ |
+ EXPECT_EQ(0u, event_queue().size()); |
+ EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
+ EXPECT_FALSE(needs_main_frame_); |
+ |
+ EXPECT_EQ(1u, handled_tasks_.at(0)->taskAsClosure()); |
+ EXPECT_EQ(kEvents[0].type(), |
+ handled_tasks_.at(1)->taskAsEvent()->event().type()); |
+ EXPECT_EQ(2u, handled_tasks_.at(2)->taskAsClosure()); |
+ EXPECT_EQ(kEvents[1].type(), |
+ handled_tasks_.at(3)->taskAsEvent()->event().type()); |
+} |
+ |
+TEST_P(MainThreadEventQueueTest, QueuingClosuresBetweenEvents) { |
+ SyntheticWebTouchEvent kEvents[2]; |
+ kEvents[0].PressPoint(10, 10); |
+ kEvents[1].PressPoint(10, 10); |
+ kEvents[1].ReleasePoint(0); |
+ |
+ EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
+ EXPECT_EQ(0u, event_queue().size()); |
+ |
+ EXPECT_FALSE(HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED)); |
+ QueueClosure(); |
+ QueueClosure(); |
+ EXPECT_FALSE(HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_NOT_CONSUMED)); |
+ EXPECT_EQ(4u, event_queue().size()); |
+ EXPECT_FALSE(needs_main_frame_); |
+ main_task_runner_->RunUntilIdle(); |
+ EXPECT_EQ(0u, event_queue().size()); |
+ EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
+ EXPECT_FALSE(needs_main_frame_); |
+ |
+ EXPECT_EQ(kEvents[0].type(), |
+ handled_tasks_.at(0)->taskAsEvent()->event().type()); |
+ EXPECT_EQ(1u, handled_tasks_.at(1)->taskAsClosure()); |
+ EXPECT_EQ(2u, handled_tasks_.at(2)->taskAsClosure()); |
+ EXPECT_EQ(kEvents[1].type(), |
+ handled_tasks_.at(3)->taskAsEvent()->event().type()); |
+} |
+ |
} // namespace content |