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 PickleIterator iter(message);
52 if (!message.ReadData(&iter, &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);
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, param.a);
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, param.a);
102 EXPECT_EQ(arg2, param.b);
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)
135 // Expected function used for converting pinch scales to deltaY values.
136 float PinchScaleToWheelDelta(float scale) {
137 return 100.0 * log(scale);
142 class InputRouterImplTest : public testing::Test {
144 InputRouterImplTest() {}
145 ~InputRouterImplTest() override {}
149 void SetUp() override {
150 browser_context_.reset(new TestBrowserContext());
151 process_.reset(new MockRenderProcessHost(browser_context_.get()));
152 client_.reset(new MockInputRouterClient());
153 ack_handler_.reset(new MockInputAckHandler());
154 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
155 command_line->AppendSwitch(switches::kValidateInputEventStream);
156 input_router_.reset(new InputRouterImpl(process_.get(),
161 client_->set_input_router(input_router());
162 ack_handler_->set_input_router(input_router());
165 void TearDown() override {
166 // Process all pending tasks to avoid leaks.
167 base::MessageLoop::current()->RunUntilIdle();
169 input_router_.reset();
172 browser_context_.reset();
175 void SetUpForTouchAckTimeoutTest(int timeout_ms) {
176 config_.touch_config.touch_ack_timeout_delay =
177 base::TimeDelta::FromMilliseconds(timeout_ms);
178 config_.touch_config.touch_ack_timeout_supported = true;
183 void SimulateKeyboardEvent(WebInputEvent::Type type, bool is_shortcut) {
184 WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type);
185 NativeWebKeyboardEvent native_event;
186 memcpy(&native_event, &event, sizeof(event));
187 input_router_->SendKeyboardEvent(
193 void SimulateWheelEvent(float dX, float dY, int modifiers, bool precise) {
194 input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo(
195 SyntheticWebMouseWheelEventBuilder::Build(dX, dY, modifiers, precise),
199 void SimulateMouseEvent(WebInputEvent::Type type, int x, int y) {
200 input_router_->SendMouseEvent(MouseEventWithLatencyInfo(
201 SyntheticWebMouseEventBuilder::Build(type, x, y, 0),
205 void SimulateWheelEventWithPhase(WebMouseWheelEvent::Phase phase) {
206 input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo(
207 SyntheticWebMouseWheelEventBuilder::Build(phase), ui::LatencyInfo()));
210 void SimulateGestureEvent(const WebGestureEvent& gesture) {
211 input_router_->SendGestureEvent(
212 GestureEventWithLatencyInfo(gesture, ui::LatencyInfo()));
215 void SimulateGestureEvent(WebInputEvent::Type type,
216 WebGestureDevice sourceDevice) {
217 SimulateGestureEvent(
218 SyntheticWebGestureEventBuilder::Build(type, sourceDevice));
221 void SimulateGestureScrollUpdateEvent(float dX, float dY, int modifiers) {
222 SimulateGestureEvent(
223 SyntheticWebGestureEventBuilder::BuildScrollUpdate(dX, dY, modifiers));
226 void SimulateGesturePinchUpdateEvent(float scale,
230 WebGestureDevice sourceDevice) {
231 SimulateGestureEvent(SyntheticWebGestureEventBuilder::BuildPinchUpdate(
232 scale, anchorX, anchorY, modifiers, sourceDevice));
235 void SimulateGestureFlingStartEvent(float velocityX,
237 WebGestureDevice sourceDevice) {
238 SimulateGestureEvent(
239 SyntheticWebGestureEventBuilder::BuildFling(velocityX,
244 void SetTouchTimestamp(base::TimeDelta timestamp) {
245 touch_event_.SetTimestamp(timestamp);
248 void SendTouchEvent() {
249 input_router_->SendTouchEvent(
250 TouchEventWithLatencyInfo(touch_event_, ui::LatencyInfo()));
251 touch_event_.ResetPoints();
254 int PressTouchPoint(int x, int y) {
255 return touch_event_.PressPoint(x, y);
258 void MoveTouchPoint(int index, int x, int y) {
259 touch_event_.MovePoint(index, x, y);
262 void ReleaseTouchPoint(int index) {
263 touch_event_.ReleasePoint(index);
266 void CancelTouchPoint(int index) {
267 touch_event_.CancelPoint(index);
270 void SendInputEventACK(blink::WebInputEvent::Type type,
271 InputEventAckState ack_result) {
272 InputHostMsg_HandleInputEvent_ACK_Params ack;
274 ack.state = ack_result;
275 input_router_->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack));
278 InputRouterImpl* input_router() const {
279 return input_router_.get();
282 bool TouchEventQueueEmpty() const {
283 return input_router()->touch_event_queue_.empty();
286 bool TouchEventTimeoutEnabled() const {
287 return input_router()->touch_event_queue_.IsAckTimeoutEnabled();
291 return input_router_->Flush();
294 size_t GetAndResetDidFlushCount() {
295 return client_->GetAndResetDidFlushCount();
298 bool HasPendingEvents() const {
299 return input_router_->HasPendingEvents();
302 void OnHasTouchEventHandlers(bool has_handlers) {
303 input_router_->OnMessageReceived(
304 ViewHostMsg_HasTouchEventHandlers(0, has_handlers));
307 void OnSetTouchAction(content::TouchAction touch_action) {
308 input_router_->OnMessageReceived(
309 InputHostMsg_SetTouchAction(0, touch_action));
312 size_t GetSentMessageCountAndResetSink() {
313 size_t count = process_->sink().message_count();
314 process_->sink().ClearMessages();
318 static void RunTasksAndWait(base::TimeDelta delay) {
319 base::MessageLoop::current()->PostDelayedTask(
320 FROM_HERE, base::MessageLoop::QuitClosure(), delay);
321 base::MessageLoop::current()->Run();
324 InputRouterImpl::Config config_;
325 scoped_ptr<MockRenderProcessHost> process_;
326 scoped_ptr<MockInputRouterClient> client_;
327 scoped_ptr<MockInputAckHandler> ack_handler_;
328 scoped_ptr<InputRouterImpl> input_router_;
331 base::MessageLoopForUI message_loop_;
332 SyntheticWebTouchEvent touch_event_;
334 scoped_ptr<TestBrowserContext> browser_context_;
337 TEST_F(InputRouterImplTest, CoalescesRangeSelection) {
338 input_router_->SendInput(scoped_ptr<IPC::Message>(
339 new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4))));
340 ExpectIPCMessageWithArg2<InputMsg_SelectRange>(
341 process_->sink().GetMessageAt(0),
344 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
346 // Send two more messages without acking.
347 input_router_->SendInput(scoped_ptr<IPC::Message>(
348 new InputMsg_SelectRange(0, gfx::Point(5, 6), gfx::Point(7, 8))));
349 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
351 input_router_->SendInput(scoped_ptr<IPC::Message>(
352 new InputMsg_SelectRange(0, gfx::Point(9, 10), gfx::Point(11, 12))));
353 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
355 // Now ack the first message.
357 scoped_ptr<IPC::Message> response(new InputHostMsg_SelectRange_ACK(0));
358 input_router_->OnMessageReceived(*response);
361 // Verify that the two messages are coalesced into one message.
362 ExpectIPCMessageWithArg2<InputMsg_SelectRange>(
363 process_->sink().GetMessageAt(0),
366 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
368 // Acking the coalesced msg should not send any more msg.
370 scoped_ptr<IPC::Message> response(new InputHostMsg_SelectRange_ACK(0));
371 input_router_->OnMessageReceived(*response);
373 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
376 TEST_F(InputRouterImplTest, CoalescesMoveRangeSelectionExtent) {
377 input_router_->SendInput(scoped_ptr<IPC::Message>(
378 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(1, 2))));
379 ExpectIPCMessageWithArg1<InputMsg_MoveRangeSelectionExtent>(
380 process_->sink().GetMessageAt(0),
382 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
384 // Send two more messages without acking.
385 input_router_->SendInput(scoped_ptr<IPC::Message>(
386 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(3, 4))));
387 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
389 input_router_->SendInput(scoped_ptr<IPC::Message>(
390 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(5, 6))));
391 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
393 // Now ack the first message.
395 scoped_ptr<IPC::Message> response(
396 new InputHostMsg_MoveRangeSelectionExtent_ACK(0));
397 input_router_->OnMessageReceived(*response);
400 // Verify that the two messages are coalesced into one message.
401 ExpectIPCMessageWithArg1<InputMsg_MoveRangeSelectionExtent>(
402 process_->sink().GetMessageAt(0),
404 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
406 // Acking the coalesced msg should not send any more msg.
408 scoped_ptr<IPC::Message> response(
409 new InputHostMsg_MoveRangeSelectionExtent_ACK(0));
410 input_router_->OnMessageReceived(*response);
412 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
415 TEST_F(InputRouterImplTest, InterleaveSelectRangeAndMoveRangeSelectionExtent) {
416 // Send first message: SelectRange.
417 input_router_->SendInput(scoped_ptr<IPC::Message>(
418 new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4))));
419 ExpectIPCMessageWithArg2<InputMsg_SelectRange>(
420 process_->sink().GetMessageAt(0),
423 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
425 // Send second message: MoveRangeSelectionExtent.
426 input_router_->SendInput(scoped_ptr<IPC::Message>(
427 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(5, 6))));
428 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
430 // Send third message: SelectRange.
431 input_router_->SendInput(scoped_ptr<IPC::Message>(
432 new InputMsg_SelectRange(0, gfx::Point(7, 8), gfx::Point(9, 10))));
433 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
435 // Ack the messages and verify that they're not coalesced and that they're in
438 // Ack the first message.
440 scoped_ptr<IPC::Message> response(
441 new InputHostMsg_SelectRange_ACK(0));
442 input_router_->OnMessageReceived(*response);
445 ExpectIPCMessageWithArg1<InputMsg_MoveRangeSelectionExtent>(
446 process_->sink().GetMessageAt(0),
448 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
450 // Ack the second message.
452 scoped_ptr<IPC::Message> response(
453 new InputHostMsg_MoveRangeSelectionExtent_ACK(0));
454 input_router_->OnMessageReceived(*response);
457 ExpectIPCMessageWithArg2<InputMsg_SelectRange>(
458 process_->sink().GetMessageAt(0),
461 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
463 // Ack the third message.
465 scoped_ptr<IPC::Message> response(
466 new InputHostMsg_SelectRange_ACK(0));
467 input_router_->OnMessageReceived(*response);
469 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
472 TEST_F(InputRouterImplTest,
473 CoalescesInterleavedSelectRangeAndMoveRangeSelectionExtent) {
474 // Send interleaved SelectRange and MoveRangeSelectionExtent messages. They
475 // should be coalesced as shown by the arrows.
477 // MoveRangeSelectionExtent
478 // MoveRangeSelectionExtent
479 // > MoveRangeSelectionExtent
482 // > MoveRangeSelectionExtent
484 input_router_->SendInput(scoped_ptr<IPC::Message>(
485 new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4))));
486 ExpectIPCMessageWithArg2<InputMsg_SelectRange>(
487 process_->sink().GetMessageAt(0),
490 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
492 input_router_->SendInput(scoped_ptr<IPC::Message>(
493 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(5, 6))));
494 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
496 input_router_->SendInput(scoped_ptr<IPC::Message>(
497 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(7, 8))));
498 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
500 input_router_->SendInput(scoped_ptr<IPC::Message>(
501 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(9, 10))));
502 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
504 input_router_->SendInput(scoped_ptr<IPC::Message>(
505 new InputMsg_SelectRange(0, gfx::Point(11, 12), gfx::Point(13, 14))));
506 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
508 input_router_->SendInput(scoped_ptr<IPC::Message>(
509 new InputMsg_SelectRange(0, gfx::Point(15, 16), gfx::Point(17, 18))));
510 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
512 input_router_->SendInput(scoped_ptr<IPC::Message>(
513 new InputMsg_MoveRangeSelectionExtent(0, gfx::Point(19, 20))));
514 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
516 // Ack the first message.
518 scoped_ptr<IPC::Message> response(
519 new InputHostMsg_SelectRange_ACK(0));
520 input_router_->OnMessageReceived(*response);
523 // Verify that the three MoveRangeSelectionExtent messages are coalesced into
525 ExpectIPCMessageWithArg1<InputMsg_MoveRangeSelectionExtent>(
526 process_->sink().GetMessageAt(0),
528 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
530 // Ack the second message.
532 scoped_ptr<IPC::Message> response(
533 new InputHostMsg_MoveRangeSelectionExtent_ACK(0));
534 input_router_->OnMessageReceived(*response);
537 // Verify that the two SelectRange messages are coalesced into one message.
538 ExpectIPCMessageWithArg2<InputMsg_SelectRange>(
539 process_->sink().GetMessageAt(0),
542 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
544 // Ack the third message.
546 scoped_ptr<IPC::Message> response(
547 new InputHostMsg_SelectRange_ACK(0));
548 input_router_->OnMessageReceived(*response);
551 // Verify the fourth message.
552 ExpectIPCMessageWithArg1<InputMsg_MoveRangeSelectionExtent>(
553 process_->sink().GetMessageAt(0),
555 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
557 // Ack the fourth message.
559 scoped_ptr<IPC::Message> response(
560 new InputHostMsg_MoveRangeSelectionExtent_ACK(0));
561 input_router_->OnMessageReceived(*response);
563 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
566 TEST_F(InputRouterImplTest, CoalescesCaretMove) {
567 input_router_->SendInput(
568 scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(1, 2))));
569 ExpectIPCMessageWithArg1<InputMsg_MoveCaret>(
570 process_->sink().GetMessageAt(0), gfx::Point(1, 2));
571 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
573 // Send two more messages without acking.
574 input_router_->SendInput(
575 scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(5, 6))));
576 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
578 input_router_->SendInput(
579 scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(9, 10))));
580 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
582 // Now ack the first message.
584 scoped_ptr<IPC::Message> response(new InputHostMsg_MoveCaret_ACK(0));
585 input_router_->OnMessageReceived(*response);
588 // Verify that the two messages are coalesced into one message.
589 ExpectIPCMessageWithArg1<InputMsg_MoveCaret>(
590 process_->sink().GetMessageAt(0), gfx::Point(9, 10));
591 EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
593 // Acking the coalesced msg should not send any more msg.
595 scoped_ptr<IPC::Message> response(new InputHostMsg_MoveCaret_ACK(0));
596 input_router_->OnMessageReceived(*response);
598 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
601 TEST_F(InputRouterImplTest, HandledInputEvent) {
602 client_->set_filter_state(INPUT_EVENT_ACK_STATE_CONSUMED);
604 // Simulate a keyboard event.
605 SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
607 // Make sure no input event is sent to the renderer.
608 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
610 // OnKeyboardEventAck should be triggered without actual ack.
611 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
613 // As the event was acked already, keyboard event queue should be
615 ASSERT_EQ(NULL, input_router_->GetLastKeyboardEvent());
618 TEST_F(InputRouterImplTest, ClientCanceledKeyboardEvent) {
619 client_->set_filter_state(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
621 // Simulate a keyboard event that has no consumer.
622 SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
624 // Make sure no input event is sent to the renderer.
625 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
626 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
629 // Simulate a keyboard event that should be dropped.
630 client_->set_filter_state(INPUT_EVENT_ACK_STATE_UNKNOWN);
631 SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
633 // Make sure no input event is sent to the renderer, and no ack is sent.
634 EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
635 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
638 TEST_F(InputRouterImplTest, ShortcutKeyboardEvent) {
639 SimulateKeyboardEvent(WebInputEvent::RawKeyDown, true);
640 EXPECT_TRUE(GetIsShortcutFromHandleInputEventMessage(
641 process_->sink().GetMessageAt(0)));
643 process_->sink().ClearMessages();
645 SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
646 EXPECT_FALSE(GetIsShortcutFromHandleInputEventMessage(
647 process_->sink().GetMessageAt(0)));
650 TEST_F(InputRouterImplTest, NoncorrespondingKeyEvents) {
651 SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
653 SendInputEventACK(WebInputEvent::KeyUp,
654 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
655 EXPECT_TRUE(ack_handler_->unexpected_event_ack_called());
658 // Tests ported from RenderWidgetHostTest --------------------------------------
660 TEST_F(InputRouterImplTest, HandleKeyEventsWeSent) {
661 // Simulate a keyboard event.
662 SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
663 ASSERT_TRUE(input_router_->GetLastKeyboardEvent());
664 EXPECT_EQ(WebInputEvent::RawKeyDown,
665 input_router_->GetLastKeyboardEvent()->type);
667 // Make sure we sent the input event to the renderer.
668 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
669 InputMsg_HandleInputEvent::ID));
670 process_->sink().ClearMessages();
672 // Send the simulated response from the renderer back.
673 SendInputEventACK(WebInputEvent::RawKeyDown,
674 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
675 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
676 EXPECT_EQ(WebInputEvent::RawKeyDown,
677 ack_handler_->acked_keyboard_event().type);
680 TEST_F(InputRouterImplTest, IgnoreKeyEventsWeDidntSend) {
681 // Send a simulated, unrequested key response. We should ignore this.
682 SendInputEventACK(WebInputEvent::RawKeyDown,
683 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
685 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
688 TEST_F(InputRouterImplTest, CoalescesWheelEvents) {
689 // Simulate wheel events.
690 SimulateWheelEvent(0, -5, 0, false); // sent directly
691 SimulateWheelEvent(0, -10, 0, false); // enqueued
692 SimulateWheelEvent(8, -6, 0, false); // coalesced into previous event
693 SimulateWheelEvent(9, -7, 1, false); // enqueued, different modifiers
694 SimulateWheelEvent(0, -10, 0, false); // enqueued, different modifiers
695 // Explicitly verify that PhaseEnd isn't coalesced to avoid bugs like
696 // https://crbug.com/154740.
697 SimulateWheelEventWithPhase(WebMouseWheelEvent::PhaseEnded); // enqueued
699 // Check that only the first event was sent.
700 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
701 InputMsg_HandleInputEvent::ID));
702 const WebInputEvent* input_event =
703 GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
704 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
705 const WebMouseWheelEvent* wheel_event =
706 static_cast<const WebMouseWheelEvent*>(input_event);
707 EXPECT_EQ(0, wheel_event->deltaX);
708 EXPECT_EQ(-5, wheel_event->deltaY);
709 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
711 // Check that the ACK sends the second message immediately.
712 SendInputEventACK(WebInputEvent::MouseWheel,
713 INPUT_EVENT_ACK_STATE_CONSUMED);
714 // The coalesced events can queue up a delayed ack
715 // so that additional input events can be processed before
716 // we turn off coalescing.
717 base::MessageLoop::current()->RunUntilIdle();
718 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
719 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
720 InputMsg_HandleInputEvent::ID));
721 input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
722 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
723 wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
724 EXPECT_EQ(8, wheel_event->deltaX);
725 EXPECT_EQ(-10 + -6, wheel_event->deltaY); // coalesced
726 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
728 // Ack the second event (which had the third coalesced into it).
729 SendInputEventACK(WebInputEvent::MouseWheel,
730 INPUT_EVENT_ACK_STATE_CONSUMED);
731 base::MessageLoop::current()->RunUntilIdle();
732 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
733 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
734 InputMsg_HandleInputEvent::ID));
735 input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
736 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
737 wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
738 EXPECT_EQ(9, wheel_event->deltaX);
739 EXPECT_EQ(-7, wheel_event->deltaY);
740 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
742 // Ack the fourth event.
743 SendInputEventACK(WebInputEvent::MouseWheel,
744 INPUT_EVENT_ACK_STATE_CONSUMED);
745 base::MessageLoop::current()->RunUntilIdle();
746 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
748 process_->sink().GetUniqueMessageMatching(InputMsg_HandleInputEvent::ID));
749 input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
750 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
751 wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
752 EXPECT_EQ(0, wheel_event->deltaX);
753 EXPECT_EQ(-10, wheel_event->deltaY);
754 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
756 // Ack the fifth event.
757 SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED);
758 base::MessageLoop::current()->RunUntilIdle();
759 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
761 process_->sink().GetUniqueMessageMatching(InputMsg_HandleInputEvent::ID));
762 input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
763 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
764 wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
765 EXPECT_EQ(0, wheel_event->deltaX);
766 EXPECT_EQ(0, wheel_event->deltaY);
767 EXPECT_EQ(WebMouseWheelEvent::PhaseEnded, wheel_event->phase);
768 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
770 // After the final ack, the queue should be empty.
771 SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED);
772 base::MessageLoop::current()->RunUntilIdle();
773 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
774 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
777 // Tests that touch-events are queued properly.
778 TEST_F(InputRouterImplTest, TouchEventQueue) {
779 OnHasTouchEventHandlers(true);
781 PressTouchPoint(1, 1);
783 EXPECT_TRUE(client_->GetAndResetFilterEventCalled());
784 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
785 EXPECT_FALSE(TouchEventQueueEmpty());
787 // The second touch should not be sent since one is already in queue.
788 MoveTouchPoint(0, 5, 5);
790 EXPECT_FALSE(client_->GetAndResetFilterEventCalled());
791 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
792 EXPECT_FALSE(TouchEventQueueEmpty());
794 // Receive an ACK for the first touch-event.
795 SendInputEventACK(WebInputEvent::TouchStart,
796 INPUT_EVENT_ACK_STATE_CONSUMED);
797 EXPECT_FALSE(TouchEventQueueEmpty());
798 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
799 EXPECT_EQ(WebInputEvent::TouchStart,
800 ack_handler_->acked_touch_event().event.type);
801 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
803 SendInputEventACK(WebInputEvent::TouchMove,
804 INPUT_EVENT_ACK_STATE_CONSUMED);
805 EXPECT_TRUE(TouchEventQueueEmpty());
806 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
807 EXPECT_EQ(WebInputEvent::TouchMove,
808 ack_handler_->acked_touch_event().event.type);
809 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
812 // Tests that the touch-queue is emptied after a page stops listening for touch
813 // events and the outstanding ack is received.
814 TEST_F(InputRouterImplTest, TouchEventQueueFlush) {
815 OnHasTouchEventHandlers(true);
816 EXPECT_TRUE(client_->has_touch_handler());
817 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
818 EXPECT_TRUE(TouchEventQueueEmpty());
820 EXPECT_TRUE(input_router_->ShouldForwardTouchEvent());
822 // Send a touch-press event.
823 PressTouchPoint(1, 1);
825 MoveTouchPoint(0, 2, 2);
826 MoveTouchPoint(0, 3, 3);
827 EXPECT_FALSE(TouchEventQueueEmpty());
828 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
830 // The page stops listening for touch-events. Note that flushing is deferred
831 // until the outstanding ack is received.
832 OnHasTouchEventHandlers(false);
833 EXPECT_FALSE(client_->has_touch_handler());
834 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
835 EXPECT_FALSE(TouchEventQueueEmpty());
836 EXPECT_TRUE(input_router_->ShouldForwardTouchEvent());
838 // After the ack, the touch-event queue should be empty, and none of the
839 // flushed touch-events should have been sent to the renderer.
840 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
841 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
842 EXPECT_TRUE(TouchEventQueueEmpty());
843 EXPECT_FALSE(input_router_->ShouldForwardTouchEvent());
846 #if defined(USE_AURA)
847 // Tests that the acked events have correct state. (ui::Events are used only on
849 TEST_F(InputRouterImplTest, AckedTouchEventState) {
850 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
851 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
852 EXPECT_TRUE(TouchEventQueueEmpty());
853 EXPECT_TRUE(input_router_->ShouldForwardTouchEvent());
855 // Send a bunch of events, and make sure the ACKed events are correct.
856 ScopedVector<ui::TouchEvent> expected_events;
858 // Use a custom timestamp for all the events to test that the acked events
859 // have the same timestamp;
860 base::TimeDelta timestamp = base::Time::NowFromSystemTime() - base::Time();
861 timestamp -= base::TimeDelta::FromSeconds(600);
863 // Press the first finger.
864 PressTouchPoint(1, 1);
865 SetTouchTimestamp(timestamp);
867 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
868 expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED,
869 gfx::Point(1, 1), 0, timestamp));
872 timestamp += base::TimeDelta::FromSeconds(10);
873 MoveTouchPoint(0, 500, 500);
874 SetTouchTimestamp(timestamp);
876 EXPECT_FALSE(TouchEventQueueEmpty());
877 expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED,
878 gfx::Point(500, 500), 0, timestamp));
880 // Now press a second finger.
881 timestamp += base::TimeDelta::FromSeconds(10);
882 PressTouchPoint(2, 2);
883 SetTouchTimestamp(timestamp);
885 EXPECT_FALSE(TouchEventQueueEmpty());
886 expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED,
887 gfx::Point(2, 2), 1, timestamp));
889 // Move both fingers.
890 timestamp += base::TimeDelta::FromSeconds(10);
891 MoveTouchPoint(0, 10, 10);
892 MoveTouchPoint(1, 20, 20);
893 SetTouchTimestamp(timestamp);
895 EXPECT_FALSE(TouchEventQueueEmpty());
896 expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED,
897 gfx::Point(10, 10), 0, timestamp));
898 expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED,
899 gfx::Point(20, 20), 1, timestamp));
901 // Receive the ACKs and make sure the generated events from the acked events
903 WebInputEvent::Type acks[] = { WebInputEvent::TouchStart,
904 WebInputEvent::TouchMove,
905 WebInputEvent::TouchStart,
906 WebInputEvent::TouchMove };
908 TouchEventCoordinateSystem coordinate_system = LOCAL_COORDINATES;
910 coordinate_system = SCREEN_COORDINATES;
912 for (size_t i = 0; i < arraysize(acks); ++i) {
913 SendInputEventACK(acks[i],
914 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
915 EXPECT_EQ(acks[i], ack_handler_->acked_touch_event().event.type);
916 ScopedVector<ui::TouchEvent> acked;
918 MakeUITouchEventsFromWebTouchEvents(
919 ack_handler_->acked_touch_event(), &acked, coordinate_system);
920 bool success = EventListIsSubset(acked, expected_events);
921 EXPECT_TRUE(success) << "Failed on step: " << i;
924 expected_events.erase(expected_events.begin(),
925 expected_events.begin() + acked.size());
928 EXPECT_TRUE(TouchEventQueueEmpty());
929 EXPECT_EQ(0U, expected_events.size());
931 #endif // defined(USE_AURA)
933 TEST_F(InputRouterImplTest, UnhandledWheelEvent) {
934 // Simulate wheel events.
935 SimulateWheelEvent(0, -5, 0, false); // sent directly
936 SimulateWheelEvent(0, -10, 0, false); // enqueued
938 // Check that only the first event was sent.
939 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
940 InputMsg_HandleInputEvent::ID));
941 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
943 // Indicate that the wheel event was unhandled.
944 SendInputEventACK(WebInputEvent::MouseWheel,
945 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
947 // Check that the correct unhandled wheel event was received.
948 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
949 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state());
950 EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5);
952 // Check that the second event was sent.
953 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
954 InputMsg_HandleInputEvent::ID));
955 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
957 // Check that the correct unhandled wheel event was received.
958 EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5);
961 TEST_F(InputRouterImplTest, TouchTypesIgnoringAck) {
962 OnHasTouchEventHandlers(true);
963 // Only acks for TouchCancel should always be ignored.
964 ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
965 GetEventWithType(WebInputEvent::TouchStart)));
966 ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
967 GetEventWithType(WebInputEvent::TouchMove)));
968 ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
969 GetEventWithType(WebInputEvent::TouchEnd)));
971 // Precede the TouchCancel with an appropriate TouchStart;
972 PressTouchPoint(1, 1);
974 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
975 ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
976 ASSERT_EQ(1U, ack_handler_->GetAndResetAckCount());
977 ASSERT_EQ(0, client_->in_flight_event_count());
979 // The TouchCancel ack is always ignored.
982 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
983 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
984 EXPECT_EQ(0, client_->in_flight_event_count());
985 EXPECT_FALSE(HasPendingEvents());
986 SendInputEventACK(WebInputEvent::TouchCancel,
987 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
988 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
989 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
990 EXPECT_FALSE(HasPendingEvents());
993 TEST_F(InputRouterImplTest, GestureTypesIgnoringAck) {
994 // We test every gesture type, ensuring that the stream of gestures is valid.
995 const int kEventTypesLength = 29;
996 WebInputEvent::Type eventTypes[kEventTypesLength] = {
997 WebInputEvent::GestureTapDown,
998 WebInputEvent::GestureShowPress,
999 WebInputEvent::GestureTapCancel,
1000 WebInputEvent::GestureScrollBegin,
1001 WebInputEvent::GestureFlingStart,
1002 WebInputEvent::GestureFlingCancel,
1003 WebInputEvent::GestureTapDown,
1004 WebInputEvent::GestureTap,
1005 WebInputEvent::GestureTapDown,
1006 WebInputEvent::GestureLongPress,
1007 WebInputEvent::GestureTapCancel,
1008 WebInputEvent::GestureLongTap,
1009 WebInputEvent::GestureTapDown,
1010 WebInputEvent::GestureTapUnconfirmed,
1011 WebInputEvent::GestureTapCancel,
1012 WebInputEvent::GestureTapDown,
1013 WebInputEvent::GestureDoubleTap,
1014 WebInputEvent::GestureTapDown,
1015 WebInputEvent::GestureTapCancel,
1016 WebInputEvent::GestureTwoFingerTap,
1017 WebInputEvent::GestureTapDown,
1018 WebInputEvent::GestureTapCancel,
1019 WebInputEvent::GestureScrollBegin,
1020 WebInputEvent::GestureScrollUpdate,
1021 WebInputEvent::GestureScrollUpdateWithoutPropagation,
1022 WebInputEvent::GesturePinchBegin,
1023 WebInputEvent::GesturePinchUpdate,
1024 WebInputEvent::GesturePinchEnd,
1025 WebInputEvent::GestureScrollEnd};
1026 for (int i = 0; i < kEventTypesLength; ++i) {
1027 WebInputEvent::Type type = eventTypes[i];
1028 if (!WebInputEventTraits::IgnoresAckDisposition(GetEventWithType(type))) {
1029 SimulateGestureEvent(type, blink::WebGestureDeviceTouchscreen);
1030 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1031 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1032 EXPECT_EQ(1, client_->in_flight_event_count());
1033 EXPECT_TRUE(HasPendingEvents());
1035 SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1036 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1037 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1038 EXPECT_EQ(0, client_->in_flight_event_count());
1039 EXPECT_FALSE(HasPendingEvents());
1043 SimulateGestureEvent(type, blink::WebGestureDeviceTouchscreen);
1044 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1045 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1046 EXPECT_EQ(0, client_->in_flight_event_count());
1047 EXPECT_FALSE(HasPendingEvents());
1051 TEST_F(InputRouterImplTest, MouseTypesIgnoringAck) {
1052 int start_type = static_cast<int>(WebInputEvent::MouseDown);
1053 int end_type = static_cast<int>(WebInputEvent::ContextMenu);
1054 ASSERT_LT(start_type, end_type);
1055 for (int i = start_type; i <= end_type; ++i) {
1056 WebInputEvent::Type type = static_cast<WebInputEvent::Type>(i);
1057 int expected_in_flight_event_count =
1058 WebInputEventTraits::IgnoresAckDisposition(GetEventWithType(type)) ? 0
1061 // Note: Mouse event acks are never forwarded to the ack handler, so the key
1062 // result here is that ignored ack types don't affect the in-flight count.
1063 SimulateMouseEvent(type, 0, 0);
1064 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1065 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1066 EXPECT_EQ(expected_in_flight_event_count, client_->in_flight_event_count());
1067 if (expected_in_flight_event_count) {
1068 SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1069 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1070 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1071 EXPECT_EQ(0, client_->in_flight_event_count());
1076 // Guard against breaking changes to the list of ignored event ack types in
1077 // |WebInputEventTraits::IgnoresAckDisposition|.
1078 TEST_F(InputRouterImplTest, RequiredEventAckTypes) {
1079 const WebInputEvent::Type kRequiredEventAckTypes[] = {
1080 WebInputEvent::MouseMove,
1081 WebInputEvent::MouseWheel,
1082 WebInputEvent::RawKeyDown,
1083 WebInputEvent::KeyDown,
1084 WebInputEvent::KeyUp,
1085 WebInputEvent::Char,
1086 WebInputEvent::GestureScrollUpdate,
1087 WebInputEvent::GestureFlingStart,
1088 WebInputEvent::GestureFlingCancel,
1089 WebInputEvent::GesturePinchUpdate,
1090 WebInputEvent::TouchStart,
1091 WebInputEvent::TouchMove
1093 for (size_t i = 0; i < arraysize(kRequiredEventAckTypes); ++i) {
1094 const WebInputEvent::Type required_ack_type = kRequiredEventAckTypes[i];
1095 EXPECT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
1096 GetEventWithType(required_ack_type)));
1100 // Test that GestureShowPress, GestureTapDown and GestureTapCancel events don't
1102 TEST_F(InputRouterImplTest, GestureTypesIgnoringAckInterleaved) {
1103 // Interleave a few events that do and do not ignore acks, ensuring that
1104 // ack-ignoring events aren't dispatched until all prior events which observe
1105 // their ack disposition have been dispatched.
1107 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1108 blink::WebGestureDeviceTouchscreen);
1109 ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
1110 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1111 EXPECT_EQ(0, client_->in_flight_event_count());
1113 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1114 blink::WebGestureDeviceTouchscreen);
1115 ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
1116 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1117 EXPECT_EQ(1, client_->in_flight_event_count());
1119 SimulateGestureEvent(WebInputEvent::GestureTapDown,
1120 blink::WebGestureDeviceTouchscreen);
1121 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1122 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1123 EXPECT_EQ(1, client_->in_flight_event_count());
1125 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1126 blink::WebGestureDeviceTouchscreen);
1127 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1128 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1130 SimulateGestureEvent(WebInputEvent::GestureShowPress,
1131 blink::WebGestureDeviceTouchscreen);
1132 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1133 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1135 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1136 blink::WebGestureDeviceTouchscreen);
1137 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1138 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1140 SimulateGestureEvent(WebInputEvent::GestureTapCancel,
1141 blink::WebGestureDeviceTouchscreen);
1142 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1143 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1145 // Now ack each ack-respecting event. Ack-ignoring events should not be
1146 // dispatched until all prior events which observe ack disposition have been
1147 // fired, at which point they should be sent immediately. They should also
1148 // have no effect on the in-flight event count.
1149 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
1150 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1151 EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1152 EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount());
1153 EXPECT_EQ(1, client_->in_flight_event_count());
1155 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
1156 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1157 EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1158 EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount());
1159 EXPECT_EQ(1, client_->in_flight_event_count());
1161 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
1162 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1163 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1164 EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount());
1165 EXPECT_EQ(0, client_->in_flight_event_count());
1168 // Test that GestureShowPress events don't get out of order due to
1169 // ignoring their acks.
1170 TEST_F(InputRouterImplTest, GestureShowPressIsInOrder) {
1171 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1172 blink::WebGestureDeviceTouchscreen);
1173 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1174 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1177 // GesturePinchBegin ignores its ack.
1178 SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
1179 blink::WebGestureDeviceTouchscreen);
1180 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1181 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1183 // GesturePinchUpdate waits for an ack.
1184 // This also verifies that GesturePinchUpdates for touchscreen are sent
1185 // to the renderer (in contrast to the TrackpadPinchUpdate test).
1186 SimulateGestureEvent(WebInputEvent::GesturePinchUpdate,
1187 blink::WebGestureDeviceTouchscreen);
1188 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1189 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1191 SimulateGestureEvent(WebInputEvent::GestureShowPress,
1192 blink::WebGestureDeviceTouchscreen);
1193 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1194 // The ShowPress, though it ignores ack, is still stuck in the queue
1195 // behind the PinchUpdate which requires an ack.
1196 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1198 SimulateGestureEvent(WebInputEvent::GestureShowPress,
1199 blink::WebGestureDeviceTouchscreen);
1200 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1201 // ShowPress has entered the queue.
1202 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1204 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
1205 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1206 // Now that the Tap has been ACKed, the ShowPress events should receive
1207 // synthetic acks, and fire immediately.
1208 EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1209 EXPECT_EQ(3U, ack_handler_->GetAndResetAckCount());
1212 // Test that touch ack timeout behavior is properly toggled by view update flags
1213 // and allowed touch actions.
1214 TEST_F(InputRouterImplTest, TouchAckTimeoutConfigured) {
1215 const int timeout_ms = 1;
1216 SetUpForTouchAckTimeoutTest(timeout_ms);
1217 ASSERT_TRUE(TouchEventTimeoutEnabled());
1219 // Verify that the touch ack timeout fires upon the delayed ack.
1220 PressTouchPoint(1, 1);
1222 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1223 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1224 RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1));
1226 // The timed-out event should have been ack'ed.
1227 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1228 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1230 // Ack'ing the timed-out event should fire a TouchCancel.
1231 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1232 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1233 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1235 // The remainder of the touch sequence should be dropped.
1236 ReleaseTouchPoint(0);
1238 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1239 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1240 ASSERT_TRUE(TouchEventTimeoutEnabled());
1242 // A fixed page scale or mobile viewport should disable the touch timeout.
1243 input_router()->OnViewUpdated(InputRouter::FIXED_PAGE_SCALE);
1244 EXPECT_FALSE(TouchEventTimeoutEnabled());
1246 input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE);
1247 EXPECT_TRUE(TouchEventTimeoutEnabled());
1249 input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT);
1250 EXPECT_FALSE(TouchEventTimeoutEnabled());
1252 input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT |
1253 InputRouter::FIXED_PAGE_SCALE);
1254 EXPECT_FALSE(TouchEventTimeoutEnabled());
1256 input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE);
1257 EXPECT_TRUE(TouchEventTimeoutEnabled());
1259 // TOUCH_ACTION_NONE (and no other touch-action) should disable the timeout.
1260 OnHasTouchEventHandlers(true);
1261 PressTouchPoint(1, 1);
1263 OnSetTouchAction(TOUCH_ACTION_PAN_Y);
1264 EXPECT_TRUE(TouchEventTimeoutEnabled());
1265 ReleaseTouchPoint(0);
1267 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1268 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1270 PressTouchPoint(1, 1);
1272 OnSetTouchAction(TOUCH_ACTION_NONE);
1273 EXPECT_FALSE(TouchEventTimeoutEnabled());
1274 ReleaseTouchPoint(0);
1276 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1277 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1279 // As the touch-action is reset by a new touch sequence, the timeout behavior
1280 // should be restored.
1281 PressTouchPoint(1, 1);
1283 EXPECT_TRUE(TouchEventTimeoutEnabled());
1286 // Test that a touch sequenced preceded by TOUCH_ACTION_NONE is not affected by
1287 // the touch timeout.
1288 TEST_F(InputRouterImplTest,
1289 TouchAckTimeoutDisabledForTouchSequenceAfterTouchActionNone) {
1290 const int timeout_ms = 1;
1291 SetUpForTouchAckTimeoutTest(timeout_ms);
1292 ASSERT_TRUE(TouchEventTimeoutEnabled());
1293 OnHasTouchEventHandlers(true);
1295 // Start a touch sequence.
1296 PressTouchPoint(1, 1);
1298 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1300 // TOUCH_ACTION_NONE should disable the timeout.
1301 OnSetTouchAction(TOUCH_ACTION_NONE);
1302 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1303 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1304 EXPECT_FALSE(TouchEventTimeoutEnabled());
1306 MoveTouchPoint(0, 1, 1);
1308 EXPECT_FALSE(TouchEventTimeoutEnabled());
1309 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1311 // Delay the move ack. The timeout should not fire.
1312 RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1));
1313 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1314 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1315 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1316 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1318 // End the touch sequence.
1319 ReleaseTouchPoint(0);
1321 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1322 EXPECT_FALSE(TouchEventTimeoutEnabled());
1323 ack_handler_->GetAndResetAckCount();
1324 GetSentMessageCountAndResetSink();
1326 // Start another touch sequence. This should restore the touch timeout.
1327 PressTouchPoint(1, 1);
1329 EXPECT_TRUE(TouchEventTimeoutEnabled());
1330 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1331 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1333 // Wait for the touch ack timeout to fire.
1334 RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1));
1335 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1338 // Test that TouchActionFilter::ResetTouchAction is called before the
1339 // first touch event for a touch sequence reaches the renderer.
1340 TEST_F(InputRouterImplTest, TouchActionResetBeforeEventReachesRenderer) {
1341 OnHasTouchEventHandlers(true);
1344 PressTouchPoint(1, 1);
1346 OnSetTouchAction(TOUCH_ACTION_NONE);
1347 MoveTouchPoint(0, 50, 50);
1349 ReleaseTouchPoint(0);
1353 PressTouchPoint(1, 1);
1355 MoveTouchPoint(0, 50, 50);
1357 ReleaseTouchPoint(0);
1360 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1361 SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED);
1363 // Ensure touch action is still none, as the next touch start hasn't been
1364 // acked yet. ScrollBegin and ScrollEnd don't require acks.
1365 EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
1366 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1367 blink::WebGestureDeviceTouchscreen);
1368 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1369 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1370 blink::WebGestureDeviceTouchscreen);
1371 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1373 // This allows the next touch sequence to start.
1374 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1376 // Ensure touch action has been set to auto, as a new touch sequence has
1378 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1379 SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED);
1380 EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
1381 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1382 blink::WebGestureDeviceTouchscreen);
1383 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1384 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1385 blink::WebGestureDeviceTouchscreen);
1386 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1387 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1390 // Test that TouchActionFilter::ResetTouchAction is called when a new touch
1391 // sequence has no consumer.
1392 TEST_F(InputRouterImplTest, TouchActionResetWhenTouchHasNoConsumer) {
1393 OnHasTouchEventHandlers(true);
1396 PressTouchPoint(1, 1);
1398 MoveTouchPoint(0, 50, 50);
1400 OnSetTouchAction(TOUCH_ACTION_NONE);
1401 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1402 SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED);
1404 ReleaseTouchPoint(0);
1408 PressTouchPoint(1, 1);
1410 MoveTouchPoint(0, 50, 50);
1412 ReleaseTouchPoint(0);
1415 // Ensure we have touch-action:none. ScrollBegin and ScrollEnd don't require
1417 EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
1418 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1419 blink::WebGestureDeviceTouchscreen);
1420 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1421 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1422 blink::WebGestureDeviceTouchscreen);
1423 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1425 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1426 SendInputEventACK(WebInputEvent::TouchStart,
1427 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1429 // Ensure touch action has been set to auto, as the touch had no consumer.
1430 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1431 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1432 blink::WebGestureDeviceTouchscreen);
1433 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1434 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1435 blink::WebGestureDeviceTouchscreen);
1436 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1439 // Test that TouchActionFilter::ResetTouchAction is called when the touch
1440 // handler is removed.
1441 TEST_F(InputRouterImplTest, TouchActionResetWhenTouchHandlerRemoved) {
1442 // Touch sequence with touch handler.
1443 OnHasTouchEventHandlers(true);
1444 PressTouchPoint(1, 1);
1446 MoveTouchPoint(0, 50, 50);
1448 OnSetTouchAction(TOUCH_ACTION_NONE);
1449 ReleaseTouchPoint(0);
1451 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1453 // Ensure we have touch-action:none, suppressing scroll events.
1454 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1455 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1456 SendInputEventACK(WebInputEvent::TouchMove,
1457 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1458 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1459 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1460 blink::WebGestureDeviceTouchscreen);
1461 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1463 SendInputEventACK(WebInputEvent::TouchEnd,
1464 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1465 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1466 blink::WebGestureDeviceTouchscreen);
1467 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1469 // Sequence without a touch handler. Note that in this case, the view may not
1470 // necessarily forward touches to the router (as no touch handler exists).
1471 OnHasTouchEventHandlers(false);
1473 // Ensure touch action has been set to auto, as the touch handler has been
1475 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1476 blink::WebGestureDeviceTouchscreen);
1477 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1478 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1479 blink::WebGestureDeviceTouchscreen);
1480 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1483 // Test that the double tap gesture depends on the touch action of the first
1485 TEST_F(InputRouterImplTest, DoubleTapGestureDependsOnFirstTap) {
1486 OnHasTouchEventHandlers(true);
1489 PressTouchPoint(1, 1);
1491 OnSetTouchAction(TOUCH_ACTION_NONE);
1492 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1494 ReleaseTouchPoint(0);
1498 PressTouchPoint(1, 1);
1502 EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1503 SimulateGestureEvent(WebInputEvent::GestureTapDown,
1504 blink::WebGestureDeviceTouchscreen);
1505 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1507 // The GestureTapUnconfirmed is converted into a tap, as the touch action is
1509 SimulateGestureEvent(WebInputEvent::GestureTapUnconfirmed,
1510 blink::WebGestureDeviceTouchscreen);
1511 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1512 // This test will become invalid if GestureTap stops requiring an ack.
1513 ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
1514 GetEventWithType(WebInputEvent::GestureTap)));
1515 EXPECT_EQ(2, client_->in_flight_event_count());
1516 SendInputEventACK(WebInputEvent::GestureTap,
1517 INPUT_EVENT_ACK_STATE_CONSUMED);
1518 EXPECT_EQ(1, client_->in_flight_event_count());
1520 // This tap gesture is dropped, since the GestureTapUnconfirmed was turned
1522 SimulateGestureEvent(WebInputEvent::GestureTap,
1523 blink::WebGestureDeviceTouchscreen);
1524 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1526 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1527 SendInputEventACK(WebInputEvent::TouchStart,
1528 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1531 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1532 SimulateGestureEvent(WebInputEvent::GestureTapDown,
1533 blink::WebGestureDeviceTouchscreen);
1534 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1536 // Although the touch-action is now auto, the double tap still won't be
1537 // dispatched, because the first tap occured when the touch-action was none.
1538 SimulateGestureEvent(WebInputEvent::GestureDoubleTap,
1539 blink::WebGestureDeviceTouchscreen);
1540 // This test will become invalid if GestureDoubleTap stops requiring an ack.
1541 ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
1542 GetEventWithType(WebInputEvent::GestureDoubleTap)));
1543 EXPECT_EQ(1, client_->in_flight_event_count());
1544 SendInputEventACK(WebInputEvent::GestureTap, INPUT_EVENT_ACK_STATE_CONSUMED);
1545 EXPECT_EQ(0, client_->in_flight_event_count());
1548 // Test that the router will call the client's |DidFlush| after all events have
1549 // been dispatched following a call to |Flush|.
1550 TEST_F(InputRouterImplTest, InputFlush) {
1551 EXPECT_FALSE(HasPendingEvents());
1553 // Flushing an empty router should immediately trigger DidFlush.
1555 EXPECT_EQ(1U, GetAndResetDidFlushCount());
1556 EXPECT_FALSE(HasPendingEvents());
1558 // Queue a TouchStart.
1559 OnHasTouchEventHandlers(true);
1560 PressTouchPoint(1, 1);
1562 EXPECT_TRUE(HasPendingEvents());
1564 // DidFlush should be called only after the event is ack'ed.
1566 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1567 SendInputEventACK(WebInputEvent::TouchStart,
1568 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1569 EXPECT_EQ(1U, GetAndResetDidFlushCount());
1571 // Ensure different types of enqueued events will prevent the DidFlush call
1572 // until all such events have been fully dispatched.
1573 MoveTouchPoint(0, 50, 50);
1575 ASSERT_TRUE(HasPendingEvents());
1576 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1577 blink::WebGestureDeviceTouchscreen);
1578 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1579 blink::WebGestureDeviceTouchscreen);
1580 SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
1581 blink::WebGestureDeviceTouchscreen);
1582 SimulateGestureEvent(WebInputEvent::GesturePinchUpdate,
1583 blink::WebGestureDeviceTouchscreen);
1585 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1587 // Repeated flush calls should have no effect.
1589 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1591 // There are still pending gestures.
1592 SendInputEventACK(WebInputEvent::TouchMove,
1593 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1594 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1595 EXPECT_TRUE(HasPendingEvents());
1597 // One more gesture to go.
1598 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
1599 INPUT_EVENT_ACK_STATE_CONSUMED);
1600 EXPECT_EQ(0U, GetAndResetDidFlushCount());
1601 EXPECT_TRUE(HasPendingEvents());
1603 // The final ack'ed gesture should trigger the DidFlush.
1604 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
1605 INPUT_EVENT_ACK_STATE_CONSUMED);
1606 EXPECT_EQ(1U, GetAndResetDidFlushCount());
1607 EXPECT_FALSE(HasPendingEvents());
1610 // Test that GesturePinchUpdate is handled specially for trackpad
1611 TEST_F(InputRouterImplTest, TouchpadPinchUpdate) {
1612 // GesturePinchUpdate for trackpad sends synthetic wheel events.
1613 // Note that the Touchscreen case is verified as NOT doing this as
1614 // part of the ShowPressIsInOrder test.
1616 SimulateGesturePinchUpdateEvent(
1617 1.5f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1619 // Verify we actually sent a special wheel event to the renderer.
1620 const WebInputEvent* input_event =
1621 GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1622 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1623 const WebMouseWheelEvent* wheel_event =
1624 static_cast<const WebMouseWheelEvent*>(input_event);
1625 EXPECT_EQ(20, wheel_event->x);
1626 EXPECT_EQ(25, wheel_event->y);
1627 EXPECT_EQ(20, wheel_event->globalX);
1628 EXPECT_EQ(25, wheel_event->globalY);
1629 EXPECT_EQ(20, wheel_event->windowX);
1630 EXPECT_EQ(25, wheel_event->windowY);
1631 EXPECT_EQ(PinchScaleToWheelDelta(1.5), wheel_event->deltaY);
1632 EXPECT_EQ(0, wheel_event->deltaX);
1633 EXPECT_EQ(1, wheel_event->hasPreciseScrollingDeltas);
1634 EXPECT_EQ(1, wheel_event->wheelTicksY);
1635 EXPECT_EQ(0, wheel_event->wheelTicksX);
1636 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1638 // Indicate that the wheel event was unhandled.
1639 SendInputEventACK(WebInputEvent::MouseWheel,
1640 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1642 // Check that the correct unhandled pinch event was received.
1643 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1644 ASSERT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1645 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state());
1646 EXPECT_EQ(1.5f, ack_handler_->acked_gesture_event().data.pinchUpdate.scale);
1647 EXPECT_EQ(0, client_->in_flight_event_count());
1649 // Second a second pinch event.
1650 SimulateGesturePinchUpdateEvent(
1651 0.3f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1652 input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1653 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1654 wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
1655 EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(0.3f), wheel_event->deltaY);
1656 EXPECT_EQ(1, wheel_event->hasPreciseScrollingDeltas);
1657 EXPECT_EQ(-1, wheel_event->wheelTicksY);
1658 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1660 // Indicate that the wheel event was handled this time.
1661 SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED);
1663 // Check that the correct HANDLED pinch event was received.
1664 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1665 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1666 EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, ack_handler_->ack_state());
1667 EXPECT_FLOAT_EQ(0.3f,
1668 ack_handler_->acked_gesture_event().data.pinchUpdate.scale);
1671 // Test that touchpad pinch events are coalesced property, with their synthetic
1672 // wheel events getting the right ACKs.
1673 TEST_F(InputRouterImplTest, TouchpadPinchCoalescing) {
1674 // Send the first pinch.
1675 SimulateGesturePinchUpdateEvent(
1676 1.5f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1678 // Verify we sent the wheel event to the renderer.
1679 const WebInputEvent* input_event =
1680 GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1681 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1682 const WebMouseWheelEvent* wheel_event =
1683 static_cast<const WebMouseWheelEvent*>(input_event);
1684 EXPECT_EQ(PinchScaleToWheelDelta(1.5f), wheel_event->deltaY);
1685 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1686 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1687 EXPECT_EQ(1, client_->in_flight_event_count());
1689 // Send a second pinch, this should be queued in the GestureEventQueue.
1690 SimulateGesturePinchUpdateEvent(
1691 1.6f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1692 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1693 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1695 // Send a third pinch, this should be coalesced into the second in the
1696 // GestureEventQueue.
1697 SimulateGesturePinchUpdateEvent(
1698 1.7f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1699 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1700 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1702 // Indicate that the first wheel event was unhandled and verify the ACK.
1703 SendInputEventACK(WebInputEvent::MouseWheel,
1704 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1705 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1706 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1707 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state());
1708 EXPECT_EQ(1.5f, ack_handler_->acked_gesture_event().data.pinchUpdate.scale);
1710 // Verify a second wheel event was sent representing the 2nd and 3rd pinch
1712 EXPECT_EQ(1, client_->in_flight_event_count());
1713 input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1714 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1715 wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
1716 EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.6f * 1.7f),
1717 PinchScaleToWheelDelta(1.6f) + PinchScaleToWheelDelta(1.7f));
1718 EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.6f * 1.7f), wheel_event->deltaY);
1719 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1720 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1722 // Indicate that the second wheel event was handled and verify the ACK.
1723 SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED);
1724 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1725 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1726 EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, ack_handler_->ack_state());
1727 EXPECT_FLOAT_EQ(1.6f * 1.7f,
1728 ack_handler_->acked_gesture_event().data.pinchUpdate.scale);
1731 // Test interleaving pinch and wheel events.
1732 TEST_F(InputRouterImplTest, TouchpadPinchAndWheel) {
1733 // Simulate queued wheel and pinch events events.
1734 // Note that in practice interleaving pinch and wheel events should be rare
1735 // (eg. requires the use of a mouse and trackpad at the same time).
1737 // Use the control modifier to match the synthetic wheel events so that
1738 // they're elligble for coalescing.
1739 int mod = WebInputEvent::ControlKey;
1741 // Event 1: sent directly.
1742 SimulateWheelEvent(0, -5, mod, true);
1743 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1745 // Event 2: enqueued in InputRouter.
1746 SimulateWheelEvent(0, -10, mod, true);
1747 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1749 // Event 3: enqueued in InputRouter, not coalesced into #2.
1750 SimulateGesturePinchUpdateEvent(
1751 1.5f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1752 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1754 // Event 4: enqueued in GestureEventQueue.
1755 SimulateGesturePinchUpdateEvent(
1756 1.2f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1757 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1759 // Event 5: coalesced into wheel event for #3.
1760 SimulateWheelEvent(2, 0, mod, true);
1761 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1764 SendInputEventACK(WebInputEvent::MouseWheel,
1765 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1766 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1767 EXPECT_EQ(WebInputEvent::MouseWheel, ack_handler_->ack_event_type());
1769 // Verify we sent #2.
1770 ASSERT_EQ(1U, process_->sink().message_count());
1771 const WebInputEvent* input_event =
1772 GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1773 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1774 const WebMouseWheelEvent* wheel_event =
1775 static_cast<const WebMouseWheelEvent*>(input_event);
1776 EXPECT_EQ(0, wheel_event->deltaX);
1777 EXPECT_EQ(-10, wheel_event->deltaY);
1778 EXPECT_EQ(mod, wheel_event->modifiers);
1779 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1782 SendInputEventACK(WebInputEvent::MouseWheel,
1783 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1784 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1785 EXPECT_EQ(WebInputEvent::MouseWheel, ack_handler_->ack_event_type());
1787 // Verify we sent #3 (with #5 coalesced in).
1788 ASSERT_EQ(1U, process_->sink().message_count());
1789 input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1790 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1791 wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
1792 EXPECT_EQ(2, wheel_event->deltaX);
1793 EXPECT_EQ(PinchScaleToWheelDelta(1.5f), wheel_event->deltaY);
1794 EXPECT_EQ(mod, wheel_event->modifiers);
1795 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1798 SendInputEventACK(WebInputEvent::MouseWheel,
1799 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1800 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1801 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1803 // Verify we sent #4.
1804 ASSERT_EQ(1U, process_->sink().message_count());
1805 input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1806 ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1807 wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
1808 EXPECT_EQ(0, wheel_event->deltaX);
1809 EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.2f), wheel_event->deltaY);
1810 EXPECT_EQ(mod, wheel_event->modifiers);
1811 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1814 SendInputEventACK(WebInputEvent::MouseWheel,
1815 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1816 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1817 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1820 // Test proper handling of touchpad Gesture{Pinch,Scroll}Update sequences.
1821 TEST_F(InputRouterImplTest, TouchpadPinchAndScrollUpdate) {
1822 // The first scroll should be sent immediately.
1823 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1824 blink::WebGestureDeviceTouchpad);
1825 ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
1826 EXPECT_EQ(1, client_->in_flight_event_count());
1828 // Subsequent scroll and pinch events should remain queued, coalescing as
1829 // more trackpad events arrive.
1830 SimulateGestureEvent(WebInputEvent::GesturePinchUpdate,
1831 blink::WebGestureDeviceTouchpad);
1832 ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1833 EXPECT_EQ(1, client_->in_flight_event_count());
1835 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1836 blink::WebGestureDeviceTouchpad);
1837 ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1838 EXPECT_EQ(1, client_->in_flight_event_count());
1840 SimulateGestureEvent(WebInputEvent::GesturePinchUpdate,
1841 blink::WebGestureDeviceTouchpad);
1842 ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1843 EXPECT_EQ(1, client_->in_flight_event_count());
1845 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1846 blink::WebGestureDeviceTouchpad);
1847 ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1848 EXPECT_EQ(1, client_->in_flight_event_count());
1850 // Ack'ing the first scroll should trigger both the coalesced scroll and the
1851 // coalesced pinch events (which is sent to the renderer as a wheel event).
1852 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
1853 INPUT_EVENT_ACK_STATE_CONSUMED);
1854 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1855 EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1856 EXPECT_EQ(2, client_->in_flight_event_count());
1858 // Ack the second scroll.
1859 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
1860 INPUT_EVENT_ACK_STATE_CONSUMED);
1861 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1862 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1863 EXPECT_EQ(1, client_->in_flight_event_count());
1865 // Ack the wheel event.
1866 SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED);
1867 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1868 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1869 EXPECT_EQ(0, client_->in_flight_event_count());
1872 // Test proper routing of overscroll notifications received either from
1873 // event acks or from |DidOverscroll| IPC messages.
1874 TEST_F(InputRouterImplTest, OverscrollDispatch) {
1875 DidOverscrollParams overscroll;
1876 overscroll.accumulated_overscroll = gfx::Vector2dF(-14, 14);
1877 overscroll.latest_overscroll_delta = gfx::Vector2dF(-7, 0);
1878 overscroll.current_fling_velocity = gfx::Vector2dF(-1, 0);
1880 input_router_->OnMessageReceived(InputHostMsg_DidOverscroll(0, overscroll));
1881 DidOverscrollParams client_overscroll = client_->GetAndResetOverscroll();
1882 EXPECT_EQ(overscroll.accumulated_overscroll,
1883 client_overscroll.accumulated_overscroll);
1884 EXPECT_EQ(overscroll.latest_overscroll_delta,
1885 client_overscroll.latest_overscroll_delta);
1886 EXPECT_EQ(overscroll.current_fling_velocity,
1887 client_overscroll.current_fling_velocity);
1889 DidOverscrollParams wheel_overscroll;
1890 wheel_overscroll.accumulated_overscroll = gfx::Vector2dF(7, -7);
1891 wheel_overscroll.latest_overscroll_delta = gfx::Vector2dF(3, 0);
1892 wheel_overscroll.current_fling_velocity = gfx::Vector2dF(1, 0);
1894 SimulateWheelEvent(3, 0, 0, false);
1895 InputHostMsg_HandleInputEvent_ACK_Params ack;
1896 ack.type = WebInputEvent::MouseWheel;
1897 ack.state = INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
1898 ack.overscroll.reset(new DidOverscrollParams(wheel_overscroll));
1899 input_router_->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack));
1901 client_overscroll = client_->GetAndResetOverscroll();
1902 EXPECT_EQ(wheel_overscroll.accumulated_overscroll,
1903 client_overscroll.accumulated_overscroll);
1904 EXPECT_EQ(wheel_overscroll.latest_overscroll_delta,
1905 client_overscroll.latest_overscroll_delta);
1906 EXPECT_EQ(wheel_overscroll.current_fling_velocity,
1907 client_overscroll.current_fling_velocity);
1910 } // namespace content