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); |
} |
} |