| Index: content/renderer/input/input_event_filter_unittest.cc
|
| diff --git a/content/renderer/input/input_event_filter_unittest.cc b/content/renderer/input/input_event_filter_unittest.cc
|
| index 4520228fb5438a75f0d66dd189e0a7c0b9fc600b..c20bd9cc3f79a62e64c5c48a70bb446a74d34ad7 100644
|
| --- a/content/renderer/input/input_event_filter_unittest.cc
|
| +++ b/content/renderer/input/input_event_filter_unittest.cc
|
| @@ -59,9 +59,7 @@ class InputEventRecorder {
|
| const WebInputEvent* event,
|
| ui::LatencyInfo* latency_info) {
|
| DCHECK_EQ(kTestRoutingID, routing_id);
|
| -
|
| records_.push_back(Record(event));
|
| -
|
| if (handle_events_) {
|
| return INPUT_EVENT_ACK_STATE_CONSUMED;
|
| } else if (send_to_widget_) {
|
| @@ -113,9 +111,8 @@ class IPCMessageRecorder : public IPC::Listener {
|
|
|
| void AddMessagesToFilter(IPC::MessageFilter* message_filter,
|
| const std::vector<IPC::Message>& events) {
|
| - for (size_t i = 0; i < events.size(); ++i) {
|
| + for (size_t i = 0; i < events.size(); ++i)
|
| message_filter->OnMessageReceived(events[i]);
|
| - }
|
|
|
| base::MessageLoop::current()->RunUntilIdle();
|
| }
|
| @@ -128,7 +125,9 @@ void AddEventsToFilter(IPC::MessageFilter* message_filter,
|
| for (size_t i = 0; i < count; ++i) {
|
| messages.push_back(InputMsg_HandleInputEvent(
|
| kTestRoutingID, &events[i], ui::LatencyInfo(),
|
| - InputEventDispatchType::DISPATCH_TYPE_NORMAL));
|
| + WebInputEventTraits::ShouldBlockEventStream(events[i])
|
| + ? InputEventDispatchType::DISPATCH_TYPE_BLOCKING
|
| + : InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING));
|
| }
|
|
|
| AddMessagesToFilter(message_filter, messages);
|
| @@ -264,9 +263,11 @@ TEST_F(InputEventFilterTest, PreserveRelativeOrder) {
|
| SyntheticWebMouseEventBuilder::Build(WebMouseEvent::MouseUp);
|
|
|
| std::vector<IPC::Message> messages;
|
| - messages.push_back(
|
| - InputMsg_HandleInputEvent(kTestRoutingID, &mouse_down, ui::LatencyInfo(),
|
| - InputEventDispatchType::DISPATCH_TYPE_NORMAL));
|
| + messages.push_back(InputMsg_HandleInputEvent(
|
| + kTestRoutingID, &mouse_down, ui::LatencyInfo(),
|
| + WebInputEventTraits::ShouldBlockEventStream(mouse_down)
|
| + ? InputEventDispatchType::DISPATCH_TYPE_BLOCKING
|
| + : InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING));
|
| // Control where input events are delivered.
|
| messages.push_back(InputMsg_MouseCaptureLost(kTestRoutingID));
|
| messages.push_back(InputMsg_SetFocus(kTestRoutingID, true));
|
| @@ -292,9 +293,11 @@ TEST_F(InputEventFilterTest, PreserveRelativeOrder) {
|
| gfx::Point(), gfx::Point()));
|
| messages.push_back(InputMsg_MoveCaret(kTestRoutingID, gfx::Point()));
|
|
|
| - messages.push_back(
|
| - InputMsg_HandleInputEvent(kTestRoutingID, &mouse_up, ui::LatencyInfo(),
|
| - InputEventDispatchType::DISPATCH_TYPE_NORMAL));
|
| + messages.push_back(InputMsg_HandleInputEvent(
|
| + kTestRoutingID, &mouse_up, ui::LatencyInfo(),
|
| + WebInputEventTraits::ShouldBlockEventStream(mouse_up)
|
| + ? InputEventDispatchType::DISPATCH_TYPE_BLOCKING
|
| + : InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING));
|
| AddMessagesToFilter(filter_.get(), messages);
|
|
|
| // We should have sent all messages back to the main thread and preserved
|
| @@ -325,22 +328,19 @@ TEST_F(InputEventFilterTest, NonBlockingWheel) {
|
| EXPECT_EQ(1u, message_recorder_.message_count());
|
|
|
| // Second event was queued; ack the first.
|
| - filter_->NonBlockingInputEventHandled(kTestRoutingID,
|
| - WebInputEvent::MouseWheel);
|
| + filter_->NotifyInputEventHandled(kTestRoutingID, WebInputEvent::MouseWheel);
|
| base::MessageLoop::current()->RunUntilIdle();
|
| ASSERT_EQ(4u, ipc_sink_.message_count());
|
| EXPECT_EQ(2u, message_recorder_.message_count());
|
|
|
| // Third event won't be coalesced into the second because modifiers are
|
| // different.
|
| - filter_->NonBlockingInputEventHandled(kTestRoutingID,
|
| - WebInputEvent::MouseWheel);
|
| + filter_->NotifyInputEventHandled(kTestRoutingID, WebInputEvent::MouseWheel);
|
| base::MessageLoop::current()->RunUntilIdle();
|
| EXPECT_EQ(3u, message_recorder_.message_count());
|
|
|
| // The last events will be coalesced.
|
| - filter_->NonBlockingInputEventHandled(kTestRoutingID,
|
| - WebInputEvent::MouseWheel);
|
| + filter_->NotifyInputEventHandled(kTestRoutingID, WebInputEvent::MouseWheel);
|
| base::MessageLoop::current()->RunUntilIdle();
|
| EXPECT_EQ(3u, message_recorder_.message_count());
|
|
|
| @@ -356,7 +356,7 @@ TEST_F(InputEventFilterTest, NonBlockingWheel) {
|
|
|
| EXPECT_EQ(kEvents[i].size, event->size);
|
| EXPECT_TRUE(memcmp(&kEvents[i], event, event->size) == 0);
|
| - EXPECT_EQ(InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING,
|
| + EXPECT_EQ(InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING_NOTIFY_MAIN,
|
| dispatch_type);
|
| }
|
|
|
| @@ -374,7 +374,7 @@ TEST_F(InputEventFilterTest, NonBlockingWheel) {
|
| EXPECT_EQ(kEvents[2].size, event->size);
|
| EXPECT_EQ(kEvents[2].deltaX + kEvents[3].deltaX, event->deltaX);
|
| EXPECT_EQ(kEvents[2].deltaY + kEvents[3].deltaY, event->deltaY);
|
| - EXPECT_EQ(InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING,
|
| + EXPECT_EQ(InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING_NOTIFY_MAIN,
|
| dispatch_type);
|
| }
|
| }
|
| @@ -402,22 +402,19 @@ TEST_F(InputEventFilterTest, NonBlockingTouch) {
|
| EXPECT_EQ(1u, message_recorder_.message_count());
|
|
|
| // Second event was queued; ack the first.
|
| - filter_->NonBlockingInputEventHandled(kTestRoutingID,
|
| - WebInputEvent::TouchStart);
|
| + filter_->NotifyInputEventHandled(kTestRoutingID, WebInputEvent::TouchStart);
|
| base::MessageLoop::current()->RunUntilIdle();
|
| ASSERT_EQ(4u, ipc_sink_.message_count());
|
| EXPECT_EQ(2u, message_recorder_.message_count());
|
|
|
| // Third event won't be coalesced into the second because modifiers are
|
| // different.
|
| - filter_->NonBlockingInputEventHandled(kTestRoutingID,
|
| - WebInputEvent::TouchMove);
|
| + filter_->NotifyInputEventHandled(kTestRoutingID, WebInputEvent::TouchMove);
|
| base::MessageLoop::current()->RunUntilIdle();
|
| EXPECT_EQ(3u, message_recorder_.message_count());
|
|
|
| // The last events will be coalesced.
|
| - filter_->NonBlockingInputEventHandled(kTestRoutingID,
|
| - WebInputEvent::TouchMove);
|
| + filter_->NotifyInputEventHandled(kTestRoutingID, WebInputEvent::TouchMove);
|
| base::MessageLoop::current()->RunUntilIdle();
|
| EXPECT_EQ(3u, message_recorder_.message_count());
|
|
|
| @@ -433,7 +430,7 @@ TEST_F(InputEventFilterTest, NonBlockingTouch) {
|
|
|
| EXPECT_EQ(kEvents[i].size, event->size);
|
| EXPECT_TRUE(memcmp(&kEvents[i], event, event->size) == 0);
|
| - EXPECT_EQ(InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING,
|
| + EXPECT_EQ(InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING_NOTIFY_MAIN,
|
| dispatch_type);
|
| }
|
|
|
| @@ -452,7 +449,83 @@ TEST_F(InputEventFilterTest, NonBlockingTouch) {
|
| EXPECT_EQ(1u, kEvents[3].touchesLength);
|
| EXPECT_EQ(kEvents[3].touches[0].position.x, event->touches[0].position.x);
|
| EXPECT_EQ(kEvents[3].touches[0].position.y, event->touches[0].position.y);
|
| - EXPECT_EQ(InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING,
|
| + EXPECT_EQ(InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING_NOTIFY_MAIN,
|
| + dispatch_type);
|
| + }
|
| +}
|
| +
|
| +TEST_F(InputEventFilterTest, IntermingledNonBlockingTouch) {
|
| + SyntheticWebTouchEvent kEvents[2];
|
| + kEvents[0].PressPoint(10, 10);
|
| + kEvents[1].PressPoint(10, 10);
|
| + kEvents[1].ReleasePoint(0);
|
| + SyntheticWebTouchEvent kBlockingEvents[1];
|
| + kBlockingEvents[0].PressPoint(10, 10);
|
| +
|
| + filter_->DidAddInputHandler(kTestRoutingID);
|
| + event_recorder_.set_send_to_widget(true);
|
| + event_recorder_.set_passive(true);
|
| + AddEventsToFilter(filter_.get(), kEvents, arraysize(kEvents));
|
| + EXPECT_EQ(arraysize(kEvents), event_recorder_.record_count());
|
| +
|
| + event_recorder_.set_passive(false);
|
| + AddEventsToFilter(filter_.get(), kBlockingEvents, arraysize(kBlockingEvents));
|
| + EXPECT_EQ(arraysize(kEvents) + arraysize(kBlockingEvents),
|
| + event_recorder_.record_count());
|
| + ASSERT_EQ(3u, event_recorder_.record_count());
|
| +
|
| + {
|
| + // First event is sent right away.
|
| + EXPECT_EQ(1u, message_recorder_.message_count());
|
| +
|
| + const IPC::Message& message = message_recorder_.message_at(0);
|
| + ASSERT_EQ(InputMsg_HandleInputEvent::ID, message.type());
|
| + InputMsg_HandleInputEvent::Param params;
|
| + EXPECT_TRUE(InputMsg_HandleInputEvent::Read(&message, ¶ms));
|
| + const WebInputEvent* event = base::get<0>(params);
|
| + InputEventDispatchType dispatch_type = base::get<2>(params);
|
| +
|
| + EXPECT_EQ(kEvents[0].size, event->size);
|
| + EXPECT_TRUE(memcmp(&kEvents[0], event, event->size) == 0);
|
| + EXPECT_EQ(InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING_NOTIFY_MAIN,
|
| + dispatch_type);
|
| + }
|
| +
|
| + {
|
| + // Second event was queued; ack the first.
|
| + filter_->NotifyInputEventHandled(kTestRoutingID, WebInputEvent::TouchStart);
|
| + base::MessageLoop::current()->RunUntilIdle();
|
| + EXPECT_EQ(2u, message_recorder_.message_count());
|
| +
|
| + const IPC::Message& message = message_recorder_.message_at(1);
|
| + ASSERT_EQ(InputMsg_HandleInputEvent::ID, message.type());
|
| + InputMsg_HandleInputEvent::Param params;
|
| + EXPECT_TRUE(InputMsg_HandleInputEvent::Read(&message, ¶ms));
|
| + const WebInputEvent* event = base::get<0>(params);
|
| + InputEventDispatchType dispatch_type = base::get<2>(params);
|
| +
|
| + EXPECT_EQ(kEvents[1].size, event->size);
|
| + EXPECT_TRUE(memcmp(&kEvents[1], event, event->size) == 0);
|
| + EXPECT_EQ(InputEventDispatchType::DISPATCH_TYPE_NON_BLOCKING_NOTIFY_MAIN,
|
| + dispatch_type);
|
| + }
|
| +
|
| + {
|
| + // Third event should be put in the queue.
|
| + filter_->NotifyInputEventHandled(kTestRoutingID, WebInputEvent::TouchEnd);
|
| + base::MessageLoop::current()->RunUntilIdle();
|
| + EXPECT_EQ(3u, message_recorder_.message_count());
|
| +
|
| + const IPC::Message& message = message_recorder_.message_at(2);
|
| + ASSERT_EQ(InputMsg_HandleInputEvent::ID, message.type());
|
| + InputMsg_HandleInputEvent::Param params;
|
| + EXPECT_TRUE(InputMsg_HandleInputEvent::Read(&message, ¶ms));
|
| + const WebInputEvent* event = base::get<0>(params);
|
| + InputEventDispatchType dispatch_type = base::get<2>(params);
|
| +
|
| + EXPECT_EQ(kBlockingEvents[0].size, event->size);
|
| + EXPECT_TRUE(memcmp(&kBlockingEvents[0], event, event->size) == 0);
|
| + EXPECT_EQ(InputEventDispatchType::DISPATCH_TYPE_BLOCKING_NOTIFY_MAIN,
|
| dispatch_type);
|
| }
|
| }
|
|
|