1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #include "base/basictypes.h"
8 #include "base/command_line.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "content/browser/renderer_host/input/gesture_event_queue.h"
12 #include "content/browser/renderer_host/input/input_router_client.h"
13 #include "content/browser/renderer_host/input/input_router_impl.h"
14 #include "content/browser/renderer_host/input/mock_input_ack_handler.h"
15 #include "content/browser/renderer_host/input/mock_input_router_client.h"
16 #include "content/common/content_constants_internal.h"
17 #include "content/common/edit_command.h"
18 #include "content/common/input/synthetic_web_input_event_builders.h"
19 #include "content/common/input/touch_action.h"
20 #include "content/common/input/web_input_event_traits.h"
21 #include "content/common/input_messages.h"
22 #include "content/common/view_messages.h"
23 #include "content/public/common/content_switches.h"
24 #include "content/public/test/mock_render_process_host.h"
25 #include "content/public/test/test_browser_context.h"
26 #include "testing/gtest/include/gtest/gtest.h"
27 #include "ui/events/keycodes/keyboard_codes.h"
30 #include "content/browser/renderer_host/ui_events_helper.h"
31 #include "ui/events/event.h"
34 using base::TimeDelta
;
35 using blink::WebGestureDevice
;
36 using blink::WebGestureEvent
;
37 using blink::WebKeyboardEvent
;
38 using blink::WebInputEvent
;
39 using blink::WebMouseEvent
;
40 using blink::WebMouseWheelEvent
;
41 using blink::WebTouchEvent
;
42 using blink::WebTouchPoint
;
48 const WebInputEvent
* GetInputEventFromMessage(const IPC::Message
& message
) {
49 base::PickleIterator
iter(message
);
52 if (!iter
.ReadData(&data
, &data_length
))
54 return reinterpret_cast<const WebInputEvent
*>(data
);
57 WebInputEvent
& GetEventWithType(WebInputEvent::Type type
) {
58 WebInputEvent
* event
= NULL
;
59 if (WebInputEvent::isMouseEventType(type
)) {
60 static WebMouseEvent mouse
;
62 } else if (WebInputEvent::isTouchEventType(type
)) {
63 static WebTouchEvent touch
;
65 } else if (WebInputEvent::isKeyboardEventType(type
)) {
66 static WebKeyboardEvent key
;
68 } else if (WebInputEvent::isGestureEventType(type
)) {
69 static WebGestureEvent gesture
;
71 } else if (type
== WebInputEvent::MouseWheel
) {
72 static WebMouseWheelEvent wheel
;
80 bool GetIsShortcutFromHandleInputEventMessage(const IPC::Message
* msg
) {
81 InputMsg_HandleInputEvent::Schema::Param param
;
82 InputMsg_HandleInputEvent::Read(msg
, ¶m
);
83 return base::get
<2>(param
);
86 template<typename MSG_T
, typename ARG_T1
>
87 void ExpectIPCMessageWithArg1(const IPC::Message
* msg
, const ARG_T1
& arg1
) {
88 ASSERT_EQ(MSG_T::ID
, msg
->type());
89 typename
MSG_T::Schema::Param param
;
90 ASSERT_TRUE(MSG_T::Read(msg
, ¶m
));
91 EXPECT_EQ(arg1
, base::get
<0>(param
));
94 template<typename MSG_T
, typename ARG_T1
, typename ARG_T2
>
95 void ExpectIPCMessageWithArg2(const IPC::Message
* msg
,
98 ASSERT_EQ(MSG_T::ID
, msg
->type());
99 typename
MSG_T::Schema::Param param
;
100 ASSERT_TRUE(MSG_T::Read(msg
, ¶m
));
101 EXPECT_EQ(arg1
, base::get
<0>(param
));
102 EXPECT_EQ(arg2
, base::get
<1>(param
));
105 #if defined(USE_AURA)
106 bool TouchEventsAreEquivalent(const ui::TouchEvent
& first
,
107 const ui::TouchEvent
& second
) {
108 if (first
.type() != second
.type())
110 if (first
.location() != second
.location())
112 if (first
.touch_id() != second
.touch_id())
114 if (second
.time_stamp().InSeconds() != first
.time_stamp().InSeconds())
119 bool EventListIsSubset(const ScopedVector
<ui::TouchEvent
>& subset
,
120 const ScopedVector
<ui::TouchEvent
>& set
) {
121 if (subset
.size() > set
.size())
123 for (size_t i
= 0; i
< subset
.size(); ++i
) {
124 const ui::TouchEvent
* first
= subset
[i
];
125 const ui::TouchEvent
* second
= set
[i
];
126 bool equivalent
= TouchEventsAreEquivalent(*first
, *second
);
133 #endif // defined(USE_AURA)
137 class InputRouterImplTest
: public testing::Test
{
139 InputRouterImplTest() {}
140 ~InputRouterImplTest() override
{}
144 void SetUp() override
{
145 browser_context_
.reset(new TestBrowserContext());
146 process_
.reset(new MockRenderProcessHost(browser_context_
.get()));
147 client_
.reset(new MockInputRouterClient());
148 ack_handler_
.reset(new MockInputAckHandler());
149 base::CommandLine
* command_line
= base::CommandLine::ForCurrentProcess();
150 command_line
->AppendSwitch(switches::kValidateInputEventStream
);
151 input_router_
.reset(new InputRouterImpl(process_
.get(),
156 client_
->set_input_router(input_router());
157 ack_handler_
->set_input_router(input_router());
160 void TearDown() override
{
161 // Process all pending tasks to avoid leaks.
162 base::MessageLoop::current()->RunUntilIdle();
164 input_router_
.reset();
167 browser_context_
.reset();
170 void SetUpForTouchAckTimeoutTest(int timeout_ms
) {
171 config_
.touch_config
.touch_ack_timeout_delay
=
172 base::TimeDelta::FromMilliseconds(timeout_ms
);
173 config_
.touch_config
.touch_ack_timeout_supported
= true;
178 void SimulateKeyboardEvent(WebInputEvent::Type type
, bool is_shortcut
) {
179 WebKeyboardEvent event
= SyntheticWebKeyboardEventBuilder::Build(type
);
180 NativeWebKeyboardEvent native_event
;
181 memcpy(&native_event
, &event
, sizeof(event
));
182 input_router_
->SendKeyboardEvent(
188 void SimulateWheelEvent(float dX
, float dY
, int modifiers
, bool precise
) {
189 input_router_
->SendWheelEvent(MouseWheelEventWithLatencyInfo(
190 SyntheticWebMouseWheelEventBuilder::Build(dX
, dY
, modifiers
, precise
)));
193 void SimulateMouseEvent(WebInputEvent::Type type
, int x
, int y
) {
194 input_router_
->SendMouseEvent(MouseEventWithLatencyInfo(
195 SyntheticWebMouseEventBuilder::Build(type
, x
, y
, 0)));
198 void SimulateWheelEventWithPhase(WebMouseWheelEvent::Phase phase
) {
199 input_router_
->SendWheelEvent(MouseWheelEventWithLatencyInfo(
200 SyntheticWebMouseWheelEventBuilder::Build(phase
)));
203 void SimulateGestureEvent(WebGestureEvent gesture
) {
204 // Ensure non-zero touchscreen fling velocities, as the router will
205 // validate aganst such.
206 if (gesture
.type
== WebInputEvent::GestureFlingStart
&&
207 gesture
.sourceDevice
== blink::WebGestureDeviceTouchscreen
&&
208 !gesture
.data
.flingStart
.velocityX
&&
209 !gesture
.data
.flingStart
.velocityY
) {
210 gesture
.data
.flingStart
.velocityX
= 5.f
;
213 input_router_
->SendGestureEvent(GestureEventWithLatencyInfo(gesture
));
216 void SimulateGestureEvent(WebInputEvent::Type type
,
217 WebGestureDevice source_device
) {
218 SimulateGestureEvent(
219 SyntheticWebGestureEventBuilder::Build(type
, source_device
));
222 void SimulateGestureScrollUpdateEvent(float dX
,
225 WebGestureDevice source_device
) {
226 SimulateGestureEvent(SyntheticWebGestureEventBuilder::BuildScrollUpdate(
227 dX
, dY
, modifiers
, source_device
));
230 void SimulateGesturePinchUpdateEvent(float scale
,
234 WebGestureDevice source_device
) {
235 SimulateGestureEvent(SyntheticWebGestureEventBuilder::BuildPinchUpdate(
236 scale
, anchor_x
, anchor_y
, modifiers
, source_device
));
239 void SimulateGestureFlingStartEvent(float velocity_x
,
241 WebGestureDevice source_device
) {
242 SimulateGestureEvent(SyntheticWebGestureEventBuilder::BuildFling(
243 velocity_x
, velocity_y
, source_device
));
246 void SetTouchTimestamp(base::TimeDelta timestamp
) {
247 touch_event_
.SetTimestamp(timestamp
);
250 uint32
SendTouchEvent() {
251 uint32 touch_event_id
= touch_event_
.uniqueTouchEventId
;
252 input_router_
->SendTouchEvent(TouchEventWithLatencyInfo(touch_event_
));
253 touch_event_
.ResetPoints();
254 return touch_event_id
;
257 int PressTouchPoint(int x
, int y
) {
258 return touch_event_
.PressPoint(x
, y
);
261 void MoveTouchPoint(int index
, int x
, int y
) {
262 touch_event_
.MovePoint(index
, x
, y
);
265 void ReleaseTouchPoint(int index
) {
266 touch_event_
.ReleasePoint(index
);
269 void CancelTouchPoint(int index
) {
270 touch_event_
.CancelPoint(index
);
273 void SendInputEventACK(blink::WebInputEvent::Type type
,
274 InputEventAckState ack_result
) {
275 DCHECK(!WebInputEvent::isTouchEventType(type
));
276 InputEventAck
ack(type
, ack_result
);
277 input_router_
->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack
));
280 void SendTouchEventACK(blink::WebInputEvent::Type type
,
281 InputEventAckState ack_result
,
282 uint32 touch_event_id
) {
283 DCHECK(WebInputEvent::isTouchEventType(type
));
284 InputEventAck
ack(type
, ack_result
, touch_event_id
);
285 input_router_
->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack
));
288 InputRouterImpl
* input_router() const {
289 return input_router_
.get();
292 bool TouchEventQueueEmpty() const {
293 return input_router()->touch_event_queue_
.empty();
296 bool TouchEventTimeoutEnabled() const {
297 return input_router()->touch_event_queue_
.IsAckTimeoutEnabled();
300 void RequestNotificationWhenFlushed() const {
301 return input_router_
->RequestNotificationWhenFlushed();
304 size_t GetAndResetDidFlushCount() {
305 return client_
->GetAndResetDidFlushCount();
308 bool HasPendingEvents() const {
309 return input_router_
->HasPendingEvents();
312 void OnHasTouchEventHandlers(bool has_handlers
) {
313 input_router_
->OnMessageReceived(
314 ViewHostMsg_HasTouchEventHandlers(0, has_handlers
));
317 void OnSetTouchAction(content::TouchAction touch_action
) {
318 input_router_
->OnMessageReceived(
319 InputHostMsg_SetTouchAction(0, touch_action
));
322 size_t GetSentMessageCountAndResetSink() {
323 size_t count
= process_
->sink().message_count();
324 process_
->sink().ClearMessages();
328 static void RunTasksAndWait(base::TimeDelta delay
) {
329 base::MessageLoop::current()->PostDelayedTask(
330 FROM_HERE
, base::MessageLoop::QuitClosure(), delay
);
331 base::MessageLoop::current()->Run();
334 InputRouterImpl::Config config_
;
335 scoped_ptr
<MockRenderProcessHost
> process_
;
336 scoped_ptr
<MockInputRouterClient
> client_
;
337 scoped_ptr
<MockInputAckHandler
> ack_handler_
;
338 scoped_ptr
<InputRouterImpl
> input_router_
;
341 base::MessageLoopForUI message_loop_
;
342 SyntheticWebTouchEvent touch_event_
;
344 scoped_ptr
<TestBrowserContext
> browser_context_
;
347 TEST_F(InputRouterImplTest
, CoalescesRangeSelection
) {
348 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
349 new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4))));
350 ExpectIPCMessageWithArg2
<InputMsg_SelectRange
>(
351 process_
->sink().GetMessageAt(0),
354 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
356 // Send two more messages without acking.
357 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
358 new InputMsg_SelectRange(0, gfx::Point(5, 6), gfx::Point(7, 8))));
359 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
361 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
362 new InputMsg_SelectRange(0, gfx::Point(9, 10), gfx::Point(11, 12))));
363 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
365 // Now ack the first message.
367 scoped_ptr
<IPC::Message
> response(new InputHostMsg_SelectRange_ACK(0));
368 input_router_
->OnMessageReceived(*response
);
371 // Verify that the two messages are coalesced into one message.
372 ExpectIPCMessageWithArg2
<InputMsg_SelectRange
>(
373 process_
->sink().GetMessageAt(0),
376 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
378 // Acking the coalesced msg should not send any more msg.
380 scoped_ptr
<IPC::Message
> response(new InputHostMsg_SelectRange_ACK(0));
381 input_router_
->OnMessageReceived(*response
);
383 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
386 TEST_F(InputRouterImplTest
, CoalescesMoveRangeSelectionExtent
) {
387 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
388 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(1, 2))));
389 ExpectIPCMessageWithArg1
<InputMsg_MoveRangeSelectionExtent
>(
390 process_
->sink().GetMessageAt(0),
392 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
394 // Send two more messages without acking.
395 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
396 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(3, 4))));
397 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
399 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
400 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(5, 6))));
401 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
403 // Now ack the first message.
405 scoped_ptr
<IPC::Message
> response(
406 new InputHostMsg_MoveRangeSelectionExtent_ACK(0));
407 input_router_
->OnMessageReceived(*response
);
410 // Verify that the two messages are coalesced into one message.
411 ExpectIPCMessageWithArg1
<InputMsg_MoveRangeSelectionExtent
>(
412 process_
->sink().GetMessageAt(0),
414 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
416 // Acking the coalesced msg should not send any more msg.
418 scoped_ptr
<IPC::Message
> response(
419 new InputHostMsg_MoveRangeSelectionExtent_ACK(0));
420 input_router_
->OnMessageReceived(*response
);
422 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
425 TEST_F(InputRouterImplTest
, InterleaveSelectRangeAndMoveRangeSelectionExtent
) {
426 // Send first message: SelectRange.
427 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
428 new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4))));
429 ExpectIPCMessageWithArg2
<InputMsg_SelectRange
>(
430 process_
->sink().GetMessageAt(0),
433 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
435 // Send second message: MoveRangeSelectionExtent.
436 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
437 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(5, 6))));
438 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
440 // Send third message: SelectRange.
441 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
442 new InputMsg_SelectRange(0, gfx::Point(7, 8), gfx::Point(9, 10))));
443 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
445 // Ack the messages and verify that they're not coalesced and that they're in
448 // Ack the first message.
450 scoped_ptr
<IPC::Message
> response(
451 new InputHostMsg_SelectRange_ACK(0));
452 input_router_
->OnMessageReceived(*response
);
455 ExpectIPCMessageWithArg1
<InputMsg_MoveRangeSelectionExtent
>(
456 process_
->sink().GetMessageAt(0),
458 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
460 // Ack the second message.
462 scoped_ptr
<IPC::Message
> response(
463 new InputHostMsg_MoveRangeSelectionExtent_ACK(0));
464 input_router_
->OnMessageReceived(*response
);
467 ExpectIPCMessageWithArg2
<InputMsg_SelectRange
>(
468 process_
->sink().GetMessageAt(0),
471 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
473 // Ack the third message.
475 scoped_ptr
<IPC::Message
> response(
476 new InputHostMsg_SelectRange_ACK(0));
477 input_router_
->OnMessageReceived(*response
);
479 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
482 TEST_F(InputRouterImplTest
,
483 CoalescesInterleavedSelectRangeAndMoveRangeSelectionExtent
) {
484 // Send interleaved SelectRange and MoveRangeSelectionExtent messages. They
485 // should be coalesced as shown by the arrows.
487 // MoveRangeSelectionExtent
488 // MoveRangeSelectionExtent
489 // > MoveRangeSelectionExtent
492 // > MoveRangeSelectionExtent
494 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
495 new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4))));
496 ExpectIPCMessageWithArg2
<InputMsg_SelectRange
>(
497 process_
->sink().GetMessageAt(0),
500 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
502 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
503 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(5, 6))));
504 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
506 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
507 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(7, 8))));
508 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
510 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
511 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(9, 10))));
512 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
514 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
515 new InputMsg_SelectRange(0, gfx::Point(11, 12), gfx::Point(13, 14))));
516 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
518 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
519 new InputMsg_SelectRange(0, gfx::Point(15, 16), gfx::Point(17, 18))));
520 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
522 input_router_
->SendInput(scoped_ptr
<IPC::Message
>(
523 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(19, 20))));
524 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
526 // Ack the first message.
528 scoped_ptr
<IPC::Message
> response(
529 new InputHostMsg_SelectRange_ACK(0));
530 input_router_
->OnMessageReceived(*response
);
533 // Verify that the three MoveRangeSelectionExtent messages are coalesced into
535 ExpectIPCMessageWithArg1
<InputMsg_MoveRangeSelectionExtent
>(
536 process_
->sink().GetMessageAt(0),
538 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
540 // Ack the second message.
542 scoped_ptr
<IPC::Message
> response(
543 new InputHostMsg_MoveRangeSelectionExtent_ACK(0));
544 input_router_
->OnMessageReceived(*response
);
547 // Verify that the two SelectRange messages are coalesced into one message.
548 ExpectIPCMessageWithArg2
<InputMsg_SelectRange
>(
549 process_
->sink().GetMessageAt(0),
552 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
554 // Ack the third message.
556 scoped_ptr
<IPC::Message
> response(
557 new InputHostMsg_SelectRange_ACK(0));
558 input_router_
->OnMessageReceived(*response
);
561 // Verify the fourth message.
562 ExpectIPCMessageWithArg1
<InputMsg_MoveRangeSelectionExtent
>(
563 process_
->sink().GetMessageAt(0),
565 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
567 // Ack the fourth message.
569 scoped_ptr
<IPC::Message
> response(
570 new InputHostMsg_MoveRangeSelectionExtent_ACK(0));
571 input_router_
->OnMessageReceived(*response
);
573 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
576 TEST_F(InputRouterImplTest
, CoalescesCaretMove
) {
577 input_router_
->SendInput(
578 scoped_ptr
<IPC::Message
>(new InputMsg_MoveCaret(0, gfx::Point(1, 2))));
579 ExpectIPCMessageWithArg1
<InputMsg_MoveCaret
>(
580 process_
->sink().GetMessageAt(0), gfx::Point(1, 2));
581 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
583 // Send two more messages without acking.
584 input_router_
->SendInput(
585 scoped_ptr
<IPC::Message
>(new InputMsg_MoveCaret(0, gfx::Point(5, 6))));
586 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
588 input_router_
->SendInput(
589 scoped_ptr
<IPC::Message
>(new InputMsg_MoveCaret(0, gfx::Point(9, 10))));
590 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
592 // Now ack the first message.
594 scoped_ptr
<IPC::Message
> response(new InputHostMsg_MoveCaret_ACK(0));
595 input_router_
->OnMessageReceived(*response
);
598 // Verify that the two messages are coalesced into one message.
599 ExpectIPCMessageWithArg1
<InputMsg_MoveCaret
>(
600 process_
->sink().GetMessageAt(0), gfx::Point(9, 10));
601 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
603 // Acking the coalesced msg should not send any more msg.
605 scoped_ptr
<IPC::Message
> response(new InputHostMsg_MoveCaret_ACK(0));
606 input_router_
->OnMessageReceived(*response
);
608 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
611 TEST_F(InputRouterImplTest
, HandledInputEvent
) {
612 client_
->set_filter_state(INPUT_EVENT_ACK_STATE_CONSUMED
);
614 // Simulate a keyboard event.
615 SimulateKeyboardEvent(WebInputEvent::RawKeyDown
, false);
617 // Make sure no input event is sent to the renderer.
618 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
620 // OnKeyboardEventAck should be triggered without actual ack.
621 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
623 // As the event was acked already, keyboard event queue should be
625 ASSERT_EQ(NULL
, input_router_
->GetLastKeyboardEvent());
628 TEST_F(InputRouterImplTest
, ClientCanceledKeyboardEvent
) {
629 client_
->set_filter_state(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS
);
631 // Simulate a keyboard event that has no consumer.
632 SimulateKeyboardEvent(WebInputEvent::RawKeyDown
, false);
634 // Make sure no input event is sent to the renderer.
635 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
636 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
639 // Simulate a keyboard event that should be dropped.
640 client_
->set_filter_state(INPUT_EVENT_ACK_STATE_UNKNOWN
);
641 SimulateKeyboardEvent(WebInputEvent::RawKeyDown
, false);
643 // Make sure no input event is sent to the renderer, and no ack is sent.
644 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
645 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
648 TEST_F(InputRouterImplTest
, ShortcutKeyboardEvent
) {
649 SimulateKeyboardEvent(WebInputEvent::RawKeyDown
, true);
650 EXPECT_TRUE(GetIsShortcutFromHandleInputEventMessage(
651 process_
->sink().GetMessageAt(0)));
653 process_
->sink().ClearMessages();
655 SimulateKeyboardEvent(WebInputEvent::RawKeyDown
, false);
656 EXPECT_FALSE(GetIsShortcutFromHandleInputEventMessage(
657 process_
->sink().GetMessageAt(0)));
660 TEST_F(InputRouterImplTest
, NoncorrespondingKeyEvents
) {
661 SimulateKeyboardEvent(WebInputEvent::RawKeyDown
, false);
663 SendInputEventACK(WebInputEvent::KeyUp
,
664 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
665 EXPECT_TRUE(ack_handler_
->unexpected_event_ack_called());
668 // Tests ported from RenderWidgetHostTest --------------------------------------
670 TEST_F(InputRouterImplTest
, HandleKeyEventsWeSent
) {
671 // Simulate a keyboard event.
672 SimulateKeyboardEvent(WebInputEvent::RawKeyDown
, false);
673 ASSERT_TRUE(input_router_
->GetLastKeyboardEvent());
674 EXPECT_EQ(WebInputEvent::RawKeyDown
,
675 input_router_
->GetLastKeyboardEvent()->type
);
677 // Make sure we sent the input event to the renderer.
678 EXPECT_TRUE(process_
->sink().GetUniqueMessageMatching(
679 InputMsg_HandleInputEvent::ID
));
680 process_
->sink().ClearMessages();
682 // Send the simulated response from the renderer back.
683 SendInputEventACK(WebInputEvent::RawKeyDown
,
684 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
685 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
686 EXPECT_EQ(WebInputEvent::RawKeyDown
,
687 ack_handler_
->acked_keyboard_event().type
);
690 TEST_F(InputRouterImplTest
, IgnoreKeyEventsWeDidntSend
) {
691 // Send a simulated, unrequested key response. We should ignore this.
692 SendInputEventACK(WebInputEvent::RawKeyDown
,
693 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
695 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
698 TEST_F(InputRouterImplTest
, CoalescesWheelEvents
) {
699 // Simulate wheel events.
700 SimulateWheelEvent(0, -5, 0, false); // sent directly
701 SimulateWheelEvent(0, -10, 0, false); // enqueued
702 SimulateWheelEvent(8, -6, 0, false); // coalesced into previous event
703 SimulateWheelEvent(9, -7, 1, false); // enqueued, different modifiers
704 SimulateWheelEvent(0, -10, 0, false); // enqueued, different modifiers
705 // Explicitly verify that PhaseEnd isn't coalesced to avoid bugs like
706 // https://crbug.com/154740.
707 SimulateWheelEventWithPhase(WebMouseWheelEvent::PhaseEnded
); // enqueued
709 // Check that only the first event was sent.
710 EXPECT_TRUE(process_
->sink().GetUniqueMessageMatching(
711 InputMsg_HandleInputEvent::ID
));
712 const WebInputEvent
* input_event
=
713 GetInputEventFromMessage(*process_
->sink().GetMessageAt(0));
714 ASSERT_EQ(WebInputEvent::MouseWheel
, input_event
->type
);
715 const WebMouseWheelEvent
* wheel_event
=
716 static_cast<const WebMouseWheelEvent
*>(input_event
);
717 EXPECT_EQ(0, wheel_event
->deltaX
);
718 EXPECT_EQ(-5, wheel_event
->deltaY
);
719 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
721 // Check that the ACK sends the second message immediately.
722 SendInputEventACK(WebInputEvent::MouseWheel
,
723 INPUT_EVENT_ACK_STATE_CONSUMED
);
724 // The coalesced events can queue up a delayed ack
725 // so that additional input events can be processed before
726 // we turn off coalescing.
727 base::MessageLoop::current()->RunUntilIdle();
728 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
729 EXPECT_TRUE(process_
->sink().GetUniqueMessageMatching(
730 InputMsg_HandleInputEvent::ID
));
731 input_event
= GetInputEventFromMessage(*process_
->sink().GetMessageAt(0));
732 ASSERT_EQ(WebInputEvent::MouseWheel
, input_event
->type
);
733 wheel_event
= static_cast<const WebMouseWheelEvent
*>(input_event
);
734 EXPECT_EQ(8, wheel_event
->deltaX
);
735 EXPECT_EQ(-10 + -6, wheel_event
->deltaY
); // coalesced
736 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
738 // Ack the second event (which had the third coalesced into it).
739 SendInputEventACK(WebInputEvent::MouseWheel
,
740 INPUT_EVENT_ACK_STATE_CONSUMED
);
741 base::MessageLoop::current()->RunUntilIdle();
742 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
743 EXPECT_TRUE(process_
->sink().GetUniqueMessageMatching(
744 InputMsg_HandleInputEvent::ID
));
745 input_event
= GetInputEventFromMessage(*process_
->sink().GetMessageAt(0));
746 ASSERT_EQ(WebInputEvent::MouseWheel
, input_event
->type
);
747 wheel_event
= static_cast<const WebMouseWheelEvent
*>(input_event
);
748 EXPECT_EQ(9, wheel_event
->deltaX
);
749 EXPECT_EQ(-7, wheel_event
->deltaY
);
750 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
752 // Ack the fourth event.
753 SendInputEventACK(WebInputEvent::MouseWheel
,
754 INPUT_EVENT_ACK_STATE_CONSUMED
);
755 base::MessageLoop::current()->RunUntilIdle();
756 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
758 process_
->sink().GetUniqueMessageMatching(InputMsg_HandleInputEvent::ID
));
759 input_event
= GetInputEventFromMessage(*process_
->sink().GetMessageAt(0));
760 ASSERT_EQ(WebInputEvent::MouseWheel
, input_event
->type
);
761 wheel_event
= static_cast<const WebMouseWheelEvent
*>(input_event
);
762 EXPECT_EQ(0, wheel_event
->deltaX
);
763 EXPECT_EQ(-10, wheel_event
->deltaY
);
764 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
766 // Ack the fifth event.
767 SendInputEventACK(WebInputEvent::MouseWheel
, INPUT_EVENT_ACK_STATE_CONSUMED
);
768 base::MessageLoop::current()->RunUntilIdle();
769 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
771 process_
->sink().GetUniqueMessageMatching(InputMsg_HandleInputEvent::ID
));
772 input_event
= GetInputEventFromMessage(*process_
->sink().GetMessageAt(0));
773 ASSERT_EQ(WebInputEvent::MouseWheel
, input_event
->type
);
774 wheel_event
= static_cast<const WebMouseWheelEvent
*>(input_event
);
775 EXPECT_EQ(0, wheel_event
->deltaX
);
776 EXPECT_EQ(0, wheel_event
->deltaY
);
777 EXPECT_EQ(WebMouseWheelEvent::PhaseEnded
, wheel_event
->phase
);
778 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
780 // After the final ack, the queue should be empty.
781 SendInputEventACK(WebInputEvent::MouseWheel
, INPUT_EVENT_ACK_STATE_CONSUMED
);
782 base::MessageLoop::current()->RunUntilIdle();
783 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
784 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
787 // Tests that touch-events are queued properly.
788 TEST_F(InputRouterImplTest
, TouchEventQueue
) {
789 OnHasTouchEventHandlers(true);
791 PressTouchPoint(1, 1);
792 uint32 touch_press_event_id
= SendTouchEvent();
793 EXPECT_TRUE(client_
->GetAndResetFilterEventCalled());
794 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
795 EXPECT_FALSE(TouchEventQueueEmpty());
797 // The second touch should not be sent since one is already in queue.
798 MoveTouchPoint(0, 5, 5);
799 uint32 touch_move_event_id
= SendTouchEvent();
800 EXPECT_FALSE(client_
->GetAndResetFilterEventCalled());
801 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
802 EXPECT_FALSE(TouchEventQueueEmpty());
804 // Receive an ACK for the first touch-event.
805 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
806 touch_press_event_id
);
807 EXPECT_FALSE(TouchEventQueueEmpty());
808 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
809 EXPECT_EQ(WebInputEvent::TouchStart
,
810 ack_handler_
->acked_touch_event().event
.type
);
811 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
813 SendTouchEventACK(WebInputEvent::TouchMove
, INPUT_EVENT_ACK_STATE_CONSUMED
,
814 touch_move_event_id
);
815 EXPECT_TRUE(TouchEventQueueEmpty());
816 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
817 EXPECT_EQ(WebInputEvent::TouchMove
,
818 ack_handler_
->acked_touch_event().event
.type
);
819 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
822 // Tests that the touch-queue is emptied after a page stops listening for touch
823 // events and the outstanding ack is received.
824 TEST_F(InputRouterImplTest
, TouchEventQueueFlush
) {
825 OnHasTouchEventHandlers(true);
826 EXPECT_TRUE(client_
->has_touch_handler());
827 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
828 EXPECT_TRUE(TouchEventQueueEmpty());
830 // Send a touch-press event.
831 PressTouchPoint(1, 1);
832 uint32 touch_press_event_id
= SendTouchEvent();
833 MoveTouchPoint(0, 2, 2);
834 MoveTouchPoint(0, 3, 3);
835 EXPECT_FALSE(TouchEventQueueEmpty());
836 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
838 // The page stops listening for touch-events. Note that flushing is deferred
839 // until the outstanding ack is received.
840 OnHasTouchEventHandlers(false);
841 EXPECT_FALSE(client_
->has_touch_handler());
842 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
843 EXPECT_FALSE(TouchEventQueueEmpty());
845 // After the ack, the touch-event queue should be empty, and none of the
846 // flushed touch-events should have been sent to the renderer.
847 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
848 touch_press_event_id
);
849 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
850 EXPECT_TRUE(TouchEventQueueEmpty());
853 #if defined(USE_AURA)
854 // Tests that the acked events have correct state. (ui::Events are used only on
856 TEST_F(InputRouterImplTest
, AckedTouchEventState
) {
857 input_router_
->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
858 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
859 EXPECT_TRUE(TouchEventQueueEmpty());
861 // Send a bunch of events, and make sure the ACKed events are correct.
862 ScopedVector
<ui::TouchEvent
> expected_events
;
864 // Use a custom timestamp for all the events to test that the acked events
865 // have the same timestamp;
866 base::TimeDelta timestamp
= base::Time::NowFromSystemTime() - base::Time();
867 timestamp
-= base::TimeDelta::FromSeconds(600);
869 // Press the first finger.
870 PressTouchPoint(1, 1);
871 SetTouchTimestamp(timestamp
);
872 uint32 touch_press_event_id1
= SendTouchEvent();
873 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
874 expected_events
.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED
,
875 gfx::Point(1, 1), 0, timestamp
));
878 timestamp
+= base::TimeDelta::FromSeconds(10);
879 MoveTouchPoint(0, 500, 500);
880 SetTouchTimestamp(timestamp
);
881 uint32 touch_move_event_id1
= SendTouchEvent();
882 EXPECT_FALSE(TouchEventQueueEmpty());
883 expected_events
.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED
,
884 gfx::Point(500, 500), 0, timestamp
));
886 // Now press a second finger.
887 timestamp
+= base::TimeDelta::FromSeconds(10);
888 PressTouchPoint(2, 2);
889 SetTouchTimestamp(timestamp
);
890 uint32 touch_press_event_id2
= SendTouchEvent();
891 EXPECT_FALSE(TouchEventQueueEmpty());
892 expected_events
.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED
,
893 gfx::Point(2, 2), 1, timestamp
));
895 // Move both fingers.
896 timestamp
+= base::TimeDelta::FromSeconds(10);
897 MoveTouchPoint(0, 10, 10);
898 MoveTouchPoint(1, 20, 20);
899 SetTouchTimestamp(timestamp
);
900 uint32 touch_move_event_id2
= SendTouchEvent();
901 EXPECT_FALSE(TouchEventQueueEmpty());
902 expected_events
.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED
,
903 gfx::Point(10, 10), 0, timestamp
));
904 expected_events
.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED
,
905 gfx::Point(20, 20), 1, timestamp
));
907 // Receive the ACKs and make sure the generated events from the acked events
909 WebInputEvent::Type acks
[] = { WebInputEvent::TouchStart
,
910 WebInputEvent::TouchMove
,
911 WebInputEvent::TouchStart
,
912 WebInputEvent::TouchMove
};
914 uint32 touch_event_ids
[] = {touch_press_event_id1
,
915 touch_move_event_id1
,
916 touch_press_event_id2
,
917 touch_move_event_id2
};
919 TouchEventCoordinateSystem coordinate_system
= LOCAL_COORDINATES
;
921 coordinate_system
= SCREEN_COORDINATES
;
923 for (size_t i
= 0; i
< arraysize(acks
); ++i
) {
924 SendTouchEventACK(acks
[i
], INPUT_EVENT_ACK_STATE_NOT_CONSUMED
,
926 EXPECT_EQ(acks
[i
], ack_handler_
->acked_touch_event().event
.type
);
927 ScopedVector
<ui::TouchEvent
> acked
;
929 MakeUITouchEventsFromWebTouchEvents(
930 ack_handler_
->acked_touch_event(), &acked
, coordinate_system
);
931 bool success
= EventListIsSubset(acked
, expected_events
);
932 EXPECT_TRUE(success
) << "Failed on step: " << i
;
935 expected_events
.erase(expected_events
.begin(),
936 expected_events
.begin() + acked
.size());
939 EXPECT_TRUE(TouchEventQueueEmpty());
940 EXPECT_EQ(0U, expected_events
.size());
942 #endif // defined(USE_AURA)
944 TEST_F(InputRouterImplTest
, UnhandledWheelEvent
) {
945 // Simulate wheel events.
946 SimulateWheelEvent(0, -5, 0, false); // sent directly
947 SimulateWheelEvent(0, -10, 0, false); // enqueued
949 // Check that only the first event was sent.
950 EXPECT_TRUE(process_
->sink().GetUniqueMessageMatching(
951 InputMsg_HandleInputEvent::ID
));
952 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
954 // Indicate that the wheel event was unhandled.
955 SendInputEventACK(WebInputEvent::MouseWheel
,
956 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
958 // Check that the correct unhandled wheel event was received.
959 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
960 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED
, ack_handler_
->ack_state());
961 EXPECT_EQ(ack_handler_
->acked_wheel_event().deltaY
, -5);
963 // Check that the second event was sent.
964 EXPECT_TRUE(process_
->sink().GetUniqueMessageMatching(
965 InputMsg_HandleInputEvent::ID
));
966 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
968 // Check that the correct unhandled wheel event was received.
969 EXPECT_EQ(ack_handler_
->acked_wheel_event().deltaY
, -5);
972 TEST_F(InputRouterImplTest
, TouchTypesIgnoringAck
) {
973 OnHasTouchEventHandlers(true);
974 // Only acks for TouchCancel should always be ignored.
975 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
976 GetEventWithType(WebInputEvent::TouchStart
)));
977 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
978 GetEventWithType(WebInputEvent::TouchMove
)));
979 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
980 GetEventWithType(WebInputEvent::TouchEnd
)));
982 // Precede the TouchCancel with an appropriate TouchStart;
983 PressTouchPoint(1, 1);
984 uint32 touch_press_event_id
= SendTouchEvent();
985 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
986 touch_press_event_id
);
987 ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
988 ASSERT_EQ(1U, ack_handler_
->GetAndResetAckCount());
989 ASSERT_EQ(0, client_
->in_flight_event_count());
991 // The TouchCancel ack is always ignored.
993 uint32 touch_cancel_event_id
= SendTouchEvent();
994 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
995 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
996 EXPECT_EQ(0, client_
->in_flight_event_count());
997 EXPECT_FALSE(HasPendingEvents());
998 SendTouchEventACK(WebInputEvent::TouchCancel
,
999 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
, touch_cancel_event_id
);
1000 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1001 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1002 EXPECT_FALSE(HasPendingEvents());
1005 TEST_F(InputRouterImplTest
, GestureTypesIgnoringAck
) {
1006 // We test every gesture type, ensuring that the stream of gestures is valid.
1007 const WebInputEvent::Type eventTypes
[] = {
1008 WebInputEvent::GestureTapDown
,
1009 WebInputEvent::GestureShowPress
,
1010 WebInputEvent::GestureTapCancel
,
1011 WebInputEvent::GestureScrollBegin
,
1012 WebInputEvent::GestureFlingStart
,
1013 WebInputEvent::GestureFlingCancel
,
1014 WebInputEvent::GestureTapDown
,
1015 WebInputEvent::GestureTap
,
1016 WebInputEvent::GestureTapDown
,
1017 WebInputEvent::GestureLongPress
,
1018 WebInputEvent::GestureTapCancel
,
1019 WebInputEvent::GestureLongTap
,
1020 WebInputEvent::GestureTapDown
,
1021 WebInputEvent::GestureTapUnconfirmed
,
1022 WebInputEvent::GestureTapCancel
,
1023 WebInputEvent::GestureTapDown
,
1024 WebInputEvent::GestureDoubleTap
,
1025 WebInputEvent::GestureTapDown
,
1026 WebInputEvent::GestureTapCancel
,
1027 WebInputEvent::GestureTwoFingerTap
,
1028 WebInputEvent::GestureTapDown
,
1029 WebInputEvent::GestureTapCancel
,
1030 WebInputEvent::GestureScrollBegin
,
1031 WebInputEvent::GestureScrollUpdate
,
1032 WebInputEvent::GesturePinchBegin
,
1033 WebInputEvent::GesturePinchUpdate
,
1034 WebInputEvent::GesturePinchEnd
,
1035 WebInputEvent::GestureScrollEnd
};
1036 for (size_t i
= 0; i
< arraysize(eventTypes
); ++i
) {
1037 WebInputEvent::Type type
= eventTypes
[i
];
1038 if (WebInputEventTraits::WillReceiveAckFromRenderer(
1039 GetEventWithType(type
))) {
1040 SimulateGestureEvent(type
, blink::WebGestureDeviceTouchscreen
);
1041 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1042 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1043 EXPECT_EQ(1, client_
->in_flight_event_count());
1044 EXPECT_TRUE(HasPendingEvents());
1046 SendInputEventACK(type
, INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
1047 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1048 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1049 EXPECT_EQ(0, client_
->in_flight_event_count());
1050 EXPECT_FALSE(HasPendingEvents());
1054 SimulateGestureEvent(type
, blink::WebGestureDeviceTouchscreen
);
1055 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1056 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1057 EXPECT_EQ(0, client_
->in_flight_event_count());
1058 EXPECT_FALSE(HasPendingEvents());
1062 TEST_F(InputRouterImplTest
, MouseTypesIgnoringAck
) {
1063 int start_type
= static_cast<int>(WebInputEvent::MouseDown
);
1064 int end_type
= static_cast<int>(WebInputEvent::ContextMenu
);
1065 ASSERT_LT(start_type
, end_type
);
1066 for (int i
= start_type
; i
<= end_type
; ++i
) {
1067 WebInputEvent::Type type
= static_cast<WebInputEvent::Type
>(i
);
1068 int expected_in_flight_event_count
=
1069 !WebInputEventTraits::WillReceiveAckFromRenderer(GetEventWithType(type
))
1073 // Note: Mouse event acks are never forwarded to the ack handler, so the key
1074 // result here is that ignored ack types don't affect the in-flight count.
1075 SimulateMouseEvent(type
, 0, 0);
1076 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1077 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1078 EXPECT_EQ(expected_in_flight_event_count
, client_
->in_flight_event_count());
1079 if (expected_in_flight_event_count
) {
1080 SendInputEventACK(type
, INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
1081 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1082 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1083 EXPECT_EQ(0, client_
->in_flight_event_count());
1088 // Guard against breaking changes to the list of ignored event ack types in
1089 // |WebInputEventTraits::WillReceiveAckFromRenderer|.
1090 TEST_F(InputRouterImplTest
, RequiredEventAckTypes
) {
1091 const WebInputEvent::Type kRequiredEventAckTypes
[] = {
1092 WebInputEvent::MouseMove
,
1093 WebInputEvent::MouseWheel
,
1094 WebInputEvent::RawKeyDown
,
1095 WebInputEvent::KeyDown
,
1096 WebInputEvent::KeyUp
,
1097 WebInputEvent::Char
,
1098 WebInputEvent::GestureScrollUpdate
,
1099 WebInputEvent::GestureFlingStart
,
1100 WebInputEvent::GestureFlingCancel
,
1101 WebInputEvent::GesturePinchUpdate
,
1102 WebInputEvent::TouchStart
,
1103 WebInputEvent::TouchMove
1105 for (size_t i
= 0; i
< arraysize(kRequiredEventAckTypes
); ++i
) {
1106 const WebInputEvent::Type required_ack_type
= kRequiredEventAckTypes
[i
];
1107 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
1108 GetEventWithType(required_ack_type
)));
1112 // Test that GestureShowPress, GestureTapDown and GestureTapCancel events don't
1114 TEST_F(InputRouterImplTest
, GestureTypesIgnoringAckInterleaved
) {
1115 // Interleave a few events that do and do not ignore acks, ensuring that
1116 // ack-ignoring events aren't dispatched until all prior events which observe
1117 // their ack disposition have been dispatched.
1119 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1120 blink::WebGestureDeviceTouchscreen
);
1121 ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
1122 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1123 EXPECT_EQ(0, client_
->in_flight_event_count());
1125 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate
,
1126 blink::WebGestureDeviceTouchscreen
);
1127 ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
1128 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1129 EXPECT_EQ(1, client_
->in_flight_event_count());
1131 SimulateGestureEvent(WebInputEvent::GestureTapDown
,
1132 blink::WebGestureDeviceTouchscreen
);
1133 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1134 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1135 EXPECT_EQ(1, client_
->in_flight_event_count());
1137 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate
,
1138 blink::WebGestureDeviceTouchscreen
);
1139 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1140 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1142 SimulateGestureEvent(WebInputEvent::GestureShowPress
,
1143 blink::WebGestureDeviceTouchscreen
);
1144 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1145 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1147 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate
,
1148 blink::WebGestureDeviceTouchscreen
);
1149 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1150 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1152 SimulateGestureEvent(WebInputEvent::GestureTapCancel
,
1153 blink::WebGestureDeviceTouchscreen
);
1154 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1155 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1157 // Now ack each ack-respecting event. Ack-ignoring events should not be
1158 // dispatched until all prior events which observe ack disposition have been
1159 // fired, at which point they should be sent immediately. They should also
1160 // have no effect on the in-flight event count.
1161 SendInputEventACK(WebInputEvent::GestureScrollUpdate
,
1162 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
1163 EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1164 EXPECT_EQ(2U, ack_handler_
->GetAndResetAckCount());
1165 EXPECT_EQ(1, client_
->in_flight_event_count());
1167 SendInputEventACK(WebInputEvent::GestureScrollUpdate
,
1168 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
1169 EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1170 EXPECT_EQ(2U, ack_handler_
->GetAndResetAckCount());
1171 EXPECT_EQ(1, client_
->in_flight_event_count());
1173 SendInputEventACK(WebInputEvent::GestureScrollUpdate
,
1174 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
1175 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1176 EXPECT_EQ(2U, ack_handler_
->GetAndResetAckCount());
1177 EXPECT_EQ(0, client_
->in_flight_event_count());
1180 // Test that GestureShowPress events don't get out of order due to
1181 // ignoring their acks.
1182 TEST_F(InputRouterImplTest
, GestureShowPressIsInOrder
) {
1183 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1184 blink::WebGestureDeviceTouchscreen
);
1185 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1186 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1189 // GesturePinchBegin ignores its ack.
1190 SimulateGestureEvent(WebInputEvent::GesturePinchBegin
,
1191 blink::WebGestureDeviceTouchscreen
);
1192 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1193 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1195 // GesturePinchUpdate waits for an ack.
1196 // This also verifies that GesturePinchUpdates for touchscreen are sent
1197 // to the renderer (in contrast to the TrackpadPinchUpdate test).
1198 SimulateGestureEvent(WebInputEvent::GesturePinchUpdate
,
1199 blink::WebGestureDeviceTouchscreen
);
1200 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1201 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1203 SimulateGestureEvent(WebInputEvent::GestureShowPress
,
1204 blink::WebGestureDeviceTouchscreen
);
1205 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1206 // The ShowPress, though it ignores ack, is still stuck in the queue
1207 // behind the PinchUpdate which requires an ack.
1208 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1210 SimulateGestureEvent(WebInputEvent::GestureShowPress
,
1211 blink::WebGestureDeviceTouchscreen
);
1212 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1213 // ShowPress has entered the queue.
1214 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1216 SendInputEventACK(WebInputEvent::GesturePinchUpdate
,
1217 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
1218 // Now that the Tap has been ACKed, the ShowPress events should receive
1219 // synthetic acks, and fire immediately.
1220 EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1221 EXPECT_EQ(3U, ack_handler_
->GetAndResetAckCount());
1224 // Test that touch ack timeout behavior is properly toggled by view update flags
1225 // and allowed touch actions.
1226 TEST_F(InputRouterImplTest
, TouchAckTimeoutConfigured
) {
1227 const int timeout_ms
= 1;
1228 SetUpForTouchAckTimeoutTest(timeout_ms
);
1229 ASSERT_TRUE(TouchEventTimeoutEnabled());
1231 // Verify that the touch ack timeout fires upon the delayed ack.
1232 PressTouchPoint(1, 1);
1233 uint32 touch_press_event_id1
= SendTouchEvent();
1234 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1235 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1236 RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms
+ 1));
1238 // The timed-out event should have been ack'ed.
1239 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1240 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1242 // Ack'ing the timed-out event should fire a TouchCancel.
1243 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1244 touch_press_event_id1
);
1245 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1246 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1248 // The remainder of the touch sequence should be dropped.
1249 ReleaseTouchPoint(0);
1251 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1252 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1253 ASSERT_TRUE(TouchEventTimeoutEnabled());
1255 // A fixed page scale or mobile viewport should disable the touch timeout.
1256 input_router()->OnViewUpdated(InputRouter::FIXED_PAGE_SCALE
);
1257 EXPECT_FALSE(TouchEventTimeoutEnabled());
1259 input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE
);
1260 EXPECT_TRUE(TouchEventTimeoutEnabled());
1262 input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT
);
1263 EXPECT_FALSE(TouchEventTimeoutEnabled());
1265 input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT
|
1266 InputRouter::FIXED_PAGE_SCALE
);
1267 EXPECT_FALSE(TouchEventTimeoutEnabled());
1269 input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE
);
1270 EXPECT_TRUE(TouchEventTimeoutEnabled());
1272 // TOUCH_ACTION_NONE (and no other touch-action) should disable the timeout.
1273 OnHasTouchEventHandlers(true);
1274 PressTouchPoint(1, 1);
1275 uint32 touch_press_event_id2
= SendTouchEvent();
1276 OnSetTouchAction(TOUCH_ACTION_PAN_Y
);
1277 EXPECT_TRUE(TouchEventTimeoutEnabled());
1278 ReleaseTouchPoint(0);
1279 uint32 touch_release_event_id2
= SendTouchEvent();
1280 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1281 touch_press_event_id2
);
1282 SendTouchEventACK(WebInputEvent::TouchEnd
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1283 touch_release_event_id2
);
1285 PressTouchPoint(1, 1);
1286 uint32 touch_press_event_id3
= SendTouchEvent();
1287 OnSetTouchAction(TOUCH_ACTION_NONE
);
1288 EXPECT_FALSE(TouchEventTimeoutEnabled());
1289 ReleaseTouchPoint(0);
1290 uint32 touch_release_event_id3
= SendTouchEvent();
1291 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1292 touch_press_event_id3
);
1293 SendTouchEventACK(WebInputEvent::TouchEnd
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1294 touch_release_event_id3
);
1296 // As the touch-action is reset by a new touch sequence, the timeout behavior
1297 // should be restored.
1298 PressTouchPoint(1, 1);
1300 EXPECT_TRUE(TouchEventTimeoutEnabled());
1303 // Test that a touch sequenced preceded by TOUCH_ACTION_NONE is not affected by
1304 // the touch timeout.
1305 TEST_F(InputRouterImplTest
,
1306 TouchAckTimeoutDisabledForTouchSequenceAfterTouchActionNone
) {
1307 const int timeout_ms
= 1;
1308 SetUpForTouchAckTimeoutTest(timeout_ms
);
1309 ASSERT_TRUE(TouchEventTimeoutEnabled());
1310 OnHasTouchEventHandlers(true);
1312 // Start a touch sequence.
1313 PressTouchPoint(1, 1);
1314 uint32 touch_press_event_id
= SendTouchEvent();
1315 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1317 // TOUCH_ACTION_NONE should disable the timeout.
1318 OnSetTouchAction(TOUCH_ACTION_NONE
);
1319 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1320 touch_press_event_id
);
1321 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1322 EXPECT_FALSE(TouchEventTimeoutEnabled());
1324 MoveTouchPoint(0, 1, 2);
1325 uint32 touch_move_event_id
= SendTouchEvent();
1326 EXPECT_FALSE(TouchEventTimeoutEnabled());
1327 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1329 // Delay the move ack. The timeout should not fire.
1330 RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms
+ 1));
1331 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1332 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1333 SendTouchEventACK(WebInputEvent::TouchMove
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1334 touch_move_event_id
);
1335 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1337 // End the touch sequence.
1338 ReleaseTouchPoint(0);
1339 uint32 touch_release_event_id
= SendTouchEvent();
1340 SendTouchEventACK(WebInputEvent::TouchEnd
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1341 touch_release_event_id
);
1342 EXPECT_FALSE(TouchEventTimeoutEnabled());
1343 ack_handler_
->GetAndResetAckCount();
1344 GetSentMessageCountAndResetSink();
1346 // Start another touch sequence. This should restore the touch timeout.
1347 PressTouchPoint(1, 1);
1349 EXPECT_TRUE(TouchEventTimeoutEnabled());
1350 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1351 EXPECT_EQ(0U, ack_handler_
->GetAndResetAckCount());
1353 // Wait for the touch ack timeout to fire.
1354 RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms
+ 1));
1355 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1358 // Test that TouchActionFilter::ResetTouchAction is called before the
1359 // first touch event for a touch sequence reaches the renderer.
1360 TEST_F(InputRouterImplTest
, TouchActionResetBeforeEventReachesRenderer
) {
1361 OnHasTouchEventHandlers(true);
1364 PressTouchPoint(1, 1);
1365 uint32 touch_press_event_id1
= SendTouchEvent();
1366 OnSetTouchAction(TOUCH_ACTION_NONE
);
1367 MoveTouchPoint(0, 50, 50);
1368 uint32 touch_move_event_id1
= SendTouchEvent();
1369 ReleaseTouchPoint(0);
1370 uint32 touch_release_event_id1
= SendTouchEvent();
1373 PressTouchPoint(1, 1);
1374 uint32 touch_press_event_id2
= SendTouchEvent();
1375 MoveTouchPoint(0, 50, 50);
1376 uint32 touch_move_event_id2
= SendTouchEvent();
1377 ReleaseTouchPoint(0);
1378 uint32 touch_release_event_id2
= SendTouchEvent();
1380 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1381 touch_press_event_id1
);
1382 SendTouchEventACK(WebInputEvent::TouchMove
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1383 touch_move_event_id1
);
1385 // Ensure touch action is still none, as the next touch start hasn't been
1386 // acked yet. ScrollBegin and ScrollEnd don't require acks.
1387 EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
1388 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1389 blink::WebGestureDeviceTouchscreen
);
1390 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1391 SimulateGestureEvent(WebInputEvent::GestureScrollEnd
,
1392 blink::WebGestureDeviceTouchscreen
);
1393 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1395 // This allows the next touch sequence to start.
1396 SendTouchEventACK(WebInputEvent::TouchEnd
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1397 touch_release_event_id1
);
1399 // Ensure touch action has been set to auto, as a new touch sequence has
1401 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1402 touch_press_event_id2
);
1403 SendTouchEventACK(WebInputEvent::TouchMove
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1404 touch_move_event_id2
);
1405 EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
1406 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1407 blink::WebGestureDeviceTouchscreen
);
1408 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1409 SimulateGestureEvent(WebInputEvent::GestureScrollEnd
,
1410 blink::WebGestureDeviceTouchscreen
);
1411 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1412 SendTouchEventACK(WebInputEvent::TouchEnd
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1413 touch_release_event_id2
);
1416 // Test that TouchActionFilter::ResetTouchAction is called when a new touch
1417 // sequence has no consumer.
1418 TEST_F(InputRouterImplTest
, TouchActionResetWhenTouchHasNoConsumer
) {
1419 OnHasTouchEventHandlers(true);
1422 PressTouchPoint(1, 1);
1423 uint32 touch_press_event_id1
= SendTouchEvent();
1424 MoveTouchPoint(0, 50, 50);
1425 uint32 touch_move_event_id1
= SendTouchEvent();
1426 OnSetTouchAction(TOUCH_ACTION_NONE
);
1427 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1428 touch_press_event_id1
);
1429 SendTouchEventACK(WebInputEvent::TouchMove
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1430 touch_move_event_id1
);
1432 ReleaseTouchPoint(0);
1433 uint32 touch_release_event_id1
= SendTouchEvent();
1436 PressTouchPoint(1, 1);
1437 uint32 touch_press_event_id2
= SendTouchEvent();
1438 MoveTouchPoint(0, 50, 50);
1440 ReleaseTouchPoint(0);
1443 // Ensure we have touch-action:none. ScrollBegin and ScrollEnd don't require
1445 EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
1446 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1447 blink::WebGestureDeviceTouchscreen
);
1448 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1449 SimulateGestureEvent(WebInputEvent::GestureScrollEnd
,
1450 blink::WebGestureDeviceTouchscreen
);
1451 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1453 SendTouchEventACK(WebInputEvent::TouchEnd
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1454 touch_release_event_id1
);
1455 SendTouchEventACK(WebInputEvent::TouchStart
,
1456 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS
,
1457 touch_press_event_id2
);
1459 // Ensure touch action has been set to auto, as the touch had no consumer.
1460 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1461 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1462 blink::WebGestureDeviceTouchscreen
);
1463 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1464 SimulateGestureEvent(WebInputEvent::GestureScrollEnd
,
1465 blink::WebGestureDeviceTouchscreen
);
1466 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1469 // Test that TouchActionFilter::ResetTouchAction is called when the touch
1470 // handler is removed.
1471 TEST_F(InputRouterImplTest
, TouchActionResetWhenTouchHandlerRemoved
) {
1472 // Touch sequence with touch handler.
1473 OnHasTouchEventHandlers(true);
1474 PressTouchPoint(1, 1);
1475 uint32 touch_press_event_id
= SendTouchEvent();
1476 MoveTouchPoint(0, 50, 50);
1477 uint32 touch_move_event_id
= SendTouchEvent();
1478 OnSetTouchAction(TOUCH_ACTION_NONE
);
1479 ReleaseTouchPoint(0);
1480 uint32 touch_release_event_id
= SendTouchEvent();
1481 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1483 // Ensure we have touch-action:none, suppressing scroll events.
1484 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1485 touch_press_event_id
);
1486 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1487 SendTouchEventACK(WebInputEvent::TouchMove
,
1488 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
, touch_move_event_id
);
1489 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1490 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1491 blink::WebGestureDeviceTouchscreen
);
1492 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1494 SendTouchEventACK(WebInputEvent::TouchEnd
, INPUT_EVENT_ACK_STATE_NOT_CONSUMED
,
1495 touch_release_event_id
);
1496 SimulateGestureEvent(WebInputEvent::GestureScrollEnd
,
1497 blink::WebGestureDeviceTouchscreen
);
1498 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1500 // Sequence without a touch handler. Note that in this case, the view may not
1501 // necessarily forward touches to the router (as no touch handler exists).
1502 OnHasTouchEventHandlers(false);
1504 // Ensure touch action has been set to auto, as the touch handler has been
1506 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1507 blink::WebGestureDeviceTouchscreen
);
1508 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1509 SimulateGestureEvent(WebInputEvent::GestureScrollEnd
,
1510 blink::WebGestureDeviceTouchscreen
);
1511 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1514 // Test that the double tap gesture depends on the touch action of the first
1516 TEST_F(InputRouterImplTest
, DoubleTapGestureDependsOnFirstTap
) {
1517 OnHasTouchEventHandlers(true);
1520 PressTouchPoint(1, 1);
1521 uint32 touch_press_event_id1
= SendTouchEvent();
1522 OnSetTouchAction(TOUCH_ACTION_NONE
);
1523 SendTouchEventACK(WebInputEvent::TouchStart
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1524 touch_press_event_id1
);
1526 ReleaseTouchPoint(0);
1527 uint32 touch_release_event_id
= SendTouchEvent();
1530 PressTouchPoint(1, 1);
1531 uint32 touch_press_event_id2
= SendTouchEvent();
1534 EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1535 SimulateGestureEvent(WebInputEvent::GestureTapDown
,
1536 blink::WebGestureDeviceTouchscreen
);
1537 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1539 // The GestureTapUnconfirmed is converted into a tap, as the touch action is
1541 SimulateGestureEvent(WebInputEvent::GestureTapUnconfirmed
,
1542 blink::WebGestureDeviceTouchscreen
);
1543 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1544 // This test will become invalid if GestureTap stops requiring an ack.
1545 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
1546 GetEventWithType(WebInputEvent::GestureTap
)));
1547 EXPECT_EQ(2, client_
->in_flight_event_count());
1548 SendInputEventACK(WebInputEvent::GestureTap
,
1549 INPUT_EVENT_ACK_STATE_CONSUMED
);
1550 EXPECT_EQ(1, client_
->in_flight_event_count());
1552 // This tap gesture is dropped, since the GestureTapUnconfirmed was turned
1554 SimulateGestureEvent(WebInputEvent::GestureTap
,
1555 blink::WebGestureDeviceTouchscreen
);
1556 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1558 SendTouchEventACK(WebInputEvent::TouchEnd
, INPUT_EVENT_ACK_STATE_CONSUMED
,
1559 touch_release_event_id
);
1560 SendTouchEventACK(WebInputEvent::TouchStart
,
1561 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS
,
1562 touch_press_event_id2
);
1565 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1566 SimulateGestureEvent(WebInputEvent::GestureTapDown
,
1567 blink::WebGestureDeviceTouchscreen
);
1568 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1570 // Although the touch-action is now auto, the double tap still won't be
1571 // dispatched, because the first tap occured when the touch-action was none.
1572 SimulateGestureEvent(WebInputEvent::GestureDoubleTap
,
1573 blink::WebGestureDeviceTouchscreen
);
1574 // This test will become invalid if GestureDoubleTap stops requiring an ack.
1575 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
1576 GetEventWithType(WebInputEvent::GestureDoubleTap
)));
1577 EXPECT_EQ(1, client_
->in_flight_event_count());
1578 SendInputEventACK(WebInputEvent::GestureTap
, INPUT_EVENT_ACK_STATE_CONSUMED
);
1579 EXPECT_EQ(0, client_
->in_flight_event_count());
1582 // Test that the router will call the client's |DidFlush| after all events have
1583 // been dispatched following a call to |Flush|.
1584 TEST_F(InputRouterImplTest
, InputFlush
) {
1585 EXPECT_FALSE(HasPendingEvents());
1587 // Flushing an empty router should immediately trigger DidFlush.
1588 RequestNotificationWhenFlushed();
1589 EXPECT_EQ(1U, GetAndResetDidFlushCount());
1590 EXPECT_FALSE(HasPendingEvents());
1592 // Queue a TouchStart.
1593 OnHasTouchEventHandlers(true);
1594 PressTouchPoint(1, 1);
1595 uint32 touch_press_event_id
= SendTouchEvent();
1596 EXPECT_TRUE(HasPendingEvents());
1598 // DidFlush should be called only after the event is ack'ed.
1599 RequestNotificationWhenFlushed();
1600 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1601 SendTouchEventACK(WebInputEvent::TouchStart
,
1602 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
, touch_press_event_id
);
1603 EXPECT_EQ(1U, GetAndResetDidFlushCount());
1605 // Ensure different types of enqueued events will prevent the DidFlush call
1606 // until all such events have been fully dispatched.
1607 MoveTouchPoint(0, 50, 50);
1608 uint32 touch_move_event_id
= SendTouchEvent();
1609 ASSERT_TRUE(HasPendingEvents());
1610 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1611 blink::WebGestureDeviceTouchscreen
);
1612 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate
,
1613 blink::WebGestureDeviceTouchscreen
);
1614 SimulateGestureEvent(WebInputEvent::GesturePinchBegin
,
1615 blink::WebGestureDeviceTouchscreen
);
1616 SimulateGestureEvent(WebInputEvent::GesturePinchUpdate
,
1617 blink::WebGestureDeviceTouchscreen
);
1618 RequestNotificationWhenFlushed();
1619 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1621 // Repeated flush calls should have no effect.
1622 RequestNotificationWhenFlushed();
1623 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1625 // There are still pending gestures.
1626 SendTouchEventACK(WebInputEvent::TouchMove
,
1627 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
, touch_move_event_id
);
1628 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1629 EXPECT_TRUE(HasPendingEvents());
1631 // One more gesture to go.
1632 SendInputEventACK(WebInputEvent::GestureScrollUpdate
,
1633 INPUT_EVENT_ACK_STATE_CONSUMED
);
1634 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1635 EXPECT_TRUE(HasPendingEvents());
1637 // The final ack'ed gesture should trigger the DidFlush.
1638 SendInputEventACK(WebInputEvent::GesturePinchUpdate
,
1639 INPUT_EVENT_ACK_STATE_CONSUMED
);
1640 EXPECT_EQ(1U, GetAndResetDidFlushCount());
1641 EXPECT_FALSE(HasPendingEvents());
1644 // Test that the router will call the client's |DidFlush| after all fling
1645 // animations have completed.
1646 TEST_F(InputRouterImplTest
, InputFlushAfterFling
) {
1647 EXPECT_FALSE(HasPendingEvents());
1649 // Simulate a fling.
1650 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1651 blink::WebGestureDeviceTouchscreen
);
1652 SimulateGestureEvent(WebInputEvent::GestureFlingStart
,
1653 blink::WebGestureDeviceTouchscreen
);
1654 EXPECT_TRUE(HasPendingEvents());
1656 // If the fling is unconsumed, the flush is complete.
1657 RequestNotificationWhenFlushed();
1658 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1659 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1660 blink::WebGestureDeviceTouchscreen
);
1661 SendInputEventACK(WebInputEvent::GestureFlingStart
,
1662 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
1663 EXPECT_FALSE(HasPendingEvents());
1664 EXPECT_EQ(1U, GetAndResetDidFlushCount());
1666 // Simulate a second fling.
1667 SimulateGestureEvent(WebInputEvent::GestureFlingStart
,
1668 blink::WebGestureDeviceTouchscreen
);
1669 EXPECT_TRUE(HasPendingEvents());
1671 // If the fling is consumed, the flush is complete only when the renderer
1672 // reports that is has ended.
1673 RequestNotificationWhenFlushed();
1674 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1675 SendInputEventACK(WebInputEvent::GestureFlingStart
,
1676 INPUT_EVENT_ACK_STATE_CONSUMED
);
1677 EXPECT_TRUE(HasPendingEvents());
1678 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1680 // The fling end notification should signal that the router is flushed.
1681 input_router()->OnMessageReceived(InputHostMsg_DidStopFlinging(0));
1682 EXPECT_EQ(1U, GetAndResetDidFlushCount());
1684 // Even flings consumed by the client require a fling-end notification.
1685 client_
->set_filter_state(INPUT_EVENT_ACK_STATE_CONSUMED
);
1686 SimulateGestureEvent(WebInputEvent::GestureScrollBegin
,
1687 blink::WebGestureDeviceTouchscreen
);
1688 SimulateGestureEvent(WebInputEvent::GestureFlingStart
,
1689 blink::WebGestureDeviceTouchscreen
);
1690 ASSERT_TRUE(HasPendingEvents());
1691 RequestNotificationWhenFlushed();
1692 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1693 input_router()->OnMessageReceived(InputHostMsg_DidStopFlinging(0));
1694 EXPECT_EQ(1U, GetAndResetDidFlushCount());
1697 // Test that GesturePinchUpdate is handled specially for trackpad
1698 TEST_F(InputRouterImplTest
, TouchpadPinchUpdate
) {
1699 // GesturePinchUpdate for trackpad sends synthetic wheel events.
1700 // Note that the Touchscreen case is verified as NOT doing this as
1701 // part of the ShowPressIsInOrder test.
1703 SimulateGesturePinchUpdateEvent(
1704 1.5f
, 20, 25, 0, blink::WebGestureDeviceTouchpad
);
1706 // Verify we actually sent a special wheel event to the renderer.
1707 const WebInputEvent
* input_event
=
1708 GetInputEventFromMessage(*process_
->sink().GetMessageAt(0));
1709 ASSERT_EQ(WebInputEvent::GesturePinchUpdate
, input_event
->type
);
1710 const WebGestureEvent
* gesture_event
=
1711 static_cast<const WebGestureEvent
*>(input_event
);
1712 EXPECT_EQ(20, gesture_event
->x
);
1713 EXPECT_EQ(25, gesture_event
->y
);
1714 EXPECT_EQ(20, gesture_event
->globalX
);
1715 EXPECT_EQ(25, gesture_event
->globalY
);
1716 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1718 // Indicate that the wheel event was unhandled.
1719 SendInputEventACK(WebInputEvent::GesturePinchUpdate
,
1720 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
1722 // Check that the correct unhandled pinch event was received.
1723 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1724 ASSERT_EQ(WebInputEvent::GesturePinchUpdate
, ack_handler_
->ack_event_type());
1725 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED
, ack_handler_
->ack_state());
1726 EXPECT_EQ(1.5f
, ack_handler_
->acked_gesture_event().data
.pinchUpdate
.scale
);
1727 EXPECT_EQ(0, client_
->in_flight_event_count());
1729 // Second a second pinch event.
1730 SimulateGesturePinchUpdateEvent(
1731 0.3f
, 20, 25, 0, blink::WebGestureDeviceTouchpad
);
1732 input_event
= GetInputEventFromMessage(*process_
->sink().GetMessageAt(0));
1733 ASSERT_EQ(WebInputEvent::GesturePinchUpdate
, input_event
->type
);
1734 gesture_event
= static_cast<const WebGestureEvent
*>(input_event
);
1735 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1737 // Indicate that the wheel event was handled this time.
1738 SendInputEventACK(WebInputEvent::GesturePinchUpdate
,
1739 INPUT_EVENT_ACK_STATE_CONSUMED
);
1741 // Check that the correct HANDLED pinch event was received.
1742 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1743 EXPECT_EQ(WebInputEvent::GesturePinchUpdate
, ack_handler_
->ack_event_type());
1744 EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED
, ack_handler_
->ack_state());
1745 EXPECT_FLOAT_EQ(0.3f
,
1746 ack_handler_
->acked_gesture_event().data
.pinchUpdate
.scale
);
1749 // Test proper handling of touchpad Gesture{Pinch,Scroll}Update sequences.
1750 TEST_F(InputRouterImplTest
, TouchpadPinchAndScrollUpdate
) {
1751 // The first scroll should be sent immediately.
1752 SimulateGestureScrollUpdateEvent(1.5f
, 0.f
, 0,
1753 blink::WebGestureDeviceTouchpad
);
1754 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate
,
1755 blink::WebGestureDeviceTouchpad
);
1756 ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
1757 EXPECT_EQ(1, client_
->in_flight_event_count());
1759 // Subsequent scroll and pinch events should remain queued, coalescing as
1760 // more trackpad events arrive.
1761 SimulateGesturePinchUpdateEvent(1.5f
, 20, 25, 0,
1762 blink::WebGestureDeviceTouchpad
);
1763 ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1764 EXPECT_EQ(1, client_
->in_flight_event_count());
1766 SimulateGestureScrollUpdateEvent(1.5f
, 1.5f
, 0,
1767 blink::WebGestureDeviceTouchpad
);
1768 ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1769 EXPECT_EQ(1, client_
->in_flight_event_count());
1771 SimulateGesturePinchUpdateEvent(1.5f
, 20, 25, 0,
1772 blink::WebGestureDeviceTouchpad
);
1773 ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1774 EXPECT_EQ(1, client_
->in_flight_event_count());
1776 SimulateGestureScrollUpdateEvent(0.f
, 1.5f
, 0,
1777 blink::WebGestureDeviceTouchpad
);
1778 ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1779 EXPECT_EQ(1, client_
->in_flight_event_count());
1781 // Ack'ing the first scroll should trigger both the coalesced scroll and the
1782 // coalesced pinch events (which is sent to the renderer as a wheel event).
1783 SendInputEventACK(WebInputEvent::GestureScrollUpdate
,
1784 INPUT_EVENT_ACK_STATE_CONSUMED
);
1785 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1786 EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1787 EXPECT_EQ(2, client_
->in_flight_event_count());
1789 // Ack the second scroll.
1790 SendInputEventACK(WebInputEvent::GestureScrollUpdate
,
1791 INPUT_EVENT_ACK_STATE_CONSUMED
);
1792 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1793 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1794 EXPECT_EQ(1, client_
->in_flight_event_count());
1796 // Ack the wheel event.
1797 SendInputEventACK(WebInputEvent::MouseWheel
, INPUT_EVENT_ACK_STATE_CONSUMED
);
1798 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1799 EXPECT_EQ(1U, ack_handler_
->GetAndResetAckCount());
1800 EXPECT_EQ(0, client_
->in_flight_event_count());
1803 // Test proper routing of overscroll notifications received either from
1804 // event acks or from |DidOverscroll| IPC messages.
1805 TEST_F(InputRouterImplTest
, OverscrollDispatch
) {
1806 DidOverscrollParams overscroll
;
1807 overscroll
.accumulated_overscroll
= gfx::Vector2dF(-14, 14);
1808 overscroll
.latest_overscroll_delta
= gfx::Vector2dF(-7, 0);
1809 overscroll
.current_fling_velocity
= gfx::Vector2dF(-1, 0);
1811 input_router_
->OnMessageReceived(InputHostMsg_DidOverscroll(0, overscroll
));
1812 DidOverscrollParams client_overscroll
= client_
->GetAndResetOverscroll();
1813 EXPECT_EQ(overscroll
.accumulated_overscroll
,
1814 client_overscroll
.accumulated_overscroll
);
1815 EXPECT_EQ(overscroll
.latest_overscroll_delta
,
1816 client_overscroll
.latest_overscroll_delta
);
1817 EXPECT_EQ(overscroll
.current_fling_velocity
,
1818 client_overscroll
.current_fling_velocity
);
1820 DidOverscrollParams wheel_overscroll
;
1821 wheel_overscroll
.accumulated_overscroll
= gfx::Vector2dF(7, -7);
1822 wheel_overscroll
.latest_overscroll_delta
= gfx::Vector2dF(3, 0);
1823 wheel_overscroll
.current_fling_velocity
= gfx::Vector2dF(1, 0);
1825 SimulateWheelEvent(3, 0, 0, false);
1826 InputEventAck
ack(WebInputEvent::MouseWheel
,
1827 INPUT_EVENT_ACK_STATE_NOT_CONSUMED
);
1828 ack
.overscroll
.reset(new DidOverscrollParams(wheel_overscroll
));
1829 input_router_
->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack
));
1831 client_overscroll
= client_
->GetAndResetOverscroll();
1832 EXPECT_EQ(wheel_overscroll
.accumulated_overscroll
,
1833 client_overscroll
.accumulated_overscroll
);
1834 EXPECT_EQ(wheel_overscroll
.latest_overscroll_delta
,
1835 client_overscroll
.latest_overscroll_delta
);
1836 EXPECT_EQ(wheel_overscroll
.current_fling_velocity
,
1837 client_overscroll
.current_fling_velocity
);
1840 } // namespace content