input_router_impl_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// found in the LICENSE file.
4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/basictypes.h"
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/command_line.h"
7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/memory/scoped_ptr.h"
8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/strings/utf_string_conversions.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/input/gesture_event_queue.h"
10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/input/input_router_client.h"
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/input_router_impl.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/mock_input_ack_handler.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/browser/renderer_host/input/mock_input_router_client.h"
14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/content_constants_internal.h"
15558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/edit_command.h"
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/input/synthetic_web_input_event_builders.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/input/touch_action.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/input/web_input_event_traits.h"
19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/input_messages.h"
20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/view_messages.h"
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/content_switches.h"
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/test/mock_render_process_host.h"
23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/test/test_browser_context.h"
24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
27558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) || defined(USE_AURA)
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/ui_events_helper.h"
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing base::TimeDelta;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebGestureEvent;
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using blink::WebKeyboardEvent;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent;
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent;
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent;
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent;
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchPoint;
40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace content {
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace {
44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochconst WebInputEvent* GetInputEventFromMessage(const IPC::Message& message) {
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PickleIterator iter(message);
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const char* data;
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int data_length;
49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!message.ReadData(&iter, &data, &data_length))
50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return NULL;
51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return reinterpret_cast<const WebInputEvent*>(data);
52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool GetIsShortcutFromHandleInputEventMessage(const IPC::Message* msg) {
55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  InputMsg_HandleInputEvent::Schema::Param param;
56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  InputMsg_HandleInputEvent::Read(msg, &param);
57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return param.c;
58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochtemplate<typename MSG_T, typename ARG_T1>
61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid ExpectIPCMessageWithArg1(const IPC::Message* msg, const ARG_T1& arg1) {
62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(MSG_T::ID, msg->type());
63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  typename MSG_T::Schema::Param param;
64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(MSG_T::Read(msg, &param));
65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(arg1, param.a);
66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochtemplate<typename MSG_T, typename ARG_T1, typename ARG_T2>
69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid ExpectIPCMessageWithArg2(const IPC::Message* msg,
70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              const ARG_T1& arg1,
71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              const ARG_T2& arg2) {
72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(MSG_T::ID, msg->type());
73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  typename MSG_T::Schema::Param param;
74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(MSG_T::Read(msg, &param));
75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(arg1, param.a);
76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(arg2, param.b);
77558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) || defined(USE_AURA)
80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool TouchEventsAreEquivalent(const ui::TouchEvent& first,
81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              const ui::TouchEvent& second) {
82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (first.type() != second.type())
83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (first.location() != second.location())
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (first.touch_id() != second.touch_id())
87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (second.time_stamp().InSeconds() != first.time_stamp().InSeconds())
89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return true;
91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool EventListIsSubset(const ScopedVector<ui::TouchEvent>& subset,
94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                       const ScopedVector<ui::TouchEvent>& set) {
95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (subset.size() > set.size())
96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  for (size_t i = 0; i < subset.size(); ++i) {
98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const ui::TouchEvent* first = subset[i];
99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const ui::TouchEvent* second = set[i];
100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    bool equivalent = TouchEventsAreEquivalent(*first, *second);
101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (!equivalent)
102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      return false;
103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return true;
106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif  // defined(OS_WIN) || defined(USE_AURA)
108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace
110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class InputRouterImplTest : public testing::Test {
112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public:
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InputRouterImplTest() {}
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~InputRouterImplTest() {}
115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch protected:
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // testing::Test
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    browser_context_.reset(new TestBrowserContext());
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    process_.reset(new MockRenderProcessHost(browser_context_.get()));
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    client_.reset(new MockInputRouterClient());
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ack_handler_.reset(new MockInputAckHandler());
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    CommandLine* command_line = CommandLine::ForCurrentProcess();
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    command_line->AppendSwitch(switches::kValidateInputEventStream);
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_.reset(new InputRouterImpl(
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        process_.get(), client_.get(), ack_handler_.get(), MSG_ROUTING_NONE));
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    input_router_->gesture_event_queue_->set_debounce_enabled_for_testing(
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        false);
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    client_->set_input_router(input_router());
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ack_handler_->set_input_router(input_router());
131558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Process all pending tasks to avoid leaks.
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_.reset();
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    client_.reset();
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    process_.reset();
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    browser_context_.reset();
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateKeyboardEvent(WebInputEvent::Type type, bool is_shortcut) {
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type);
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    NativeWebKeyboardEvent native_event;
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    memcpy(&native_event, &event, sizeof(event));
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendKeyboardEvent(
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        native_event,
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ui::LatencyInfo(),
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        is_shortcut);
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateWheelEvent(float dX, float dY, int modifiers, bool precise) {
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo(
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SyntheticWebMouseWheelEventBuilder::Build(dX, dY, modifiers, precise),
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ui::LatencyInfo()));
157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SimulateMouseEvent(WebInputEvent::Type type, int x, int y) {
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendMouseEvent(MouseEventWithLatencyInfo(
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SyntheticWebMouseEventBuilder::Build(type, x, y, 0),
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ui::LatencyInfo()));
163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateWheelEventWithPhase(WebMouseWheelEvent::Phase phase) {
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo(
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SyntheticWebMouseWheelEventBuilder::Build(phase), ui::LatencyInfo()));
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateGestureEvent(const WebGestureEvent& gesture) {
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendGestureEvent(
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        GestureEventWithLatencyInfo(gesture, ui::LatencyInfo()));
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateGestureEvent(WebInputEvent::Type type,
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            WebGestureEvent::SourceDevice sourceDevice) {
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SimulateGestureEvent(
178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SyntheticWebGestureEventBuilder::Build(type, sourceDevice));
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateGestureScrollUpdateEvent(float dX, float dY, int modifiers) {
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SimulateGestureEvent(
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SyntheticWebGestureEventBuilder::BuildScrollUpdate(dX, dY, modifiers));
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateGesturePinchUpdateEvent(float scale,
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       float anchorX,
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       float anchorY,
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       int modifiers) {
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SimulateGestureEvent(
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SyntheticWebGestureEventBuilder::BuildPinchUpdate(scale,
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                          anchorX,
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                          anchorY,
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                          modifiers));
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateGestureFlingStartEvent(
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      float velocityX,
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      float velocityY,
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      WebGestureEvent::SourceDevice sourceDevice) {
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SimulateGestureEvent(
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SyntheticWebGestureEventBuilder::BuildFling(velocityX,
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                    velocityY,
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                    sourceDevice));
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateTouchEvent(WebInputEvent::Type type) {
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    touch_event_.ResetPoints();
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int index = PressTouchPoint(0, 0);
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    switch (type) {
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      case WebInputEvent::TouchStart:
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        // Already handled by |PressTouchPoint()|.
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        break;
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      case WebInputEvent::TouchMove:
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        MoveTouchPoint(index, 5, 5);
216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        break;
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      case WebInputEvent::TouchEnd:
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ReleaseTouchPoint(index);
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        break;
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      case WebInputEvent::TouchCancel:
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        CancelTouchPoint(index);
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        break;
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      default:
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        FAIL() << "Invalid touch event type.";
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        break;
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SendTouchEvent();
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SetTouchTimestamp(base::TimeDelta timestamp) {
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    touch_event_.SetTimestamp(timestamp);
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SendTouchEvent() {
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendTouchEvent(
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        TouchEventWithLatencyInfo(touch_event_, ui::LatencyInfo()));
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    touch_event_.ResetPoints();
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int PressTouchPoint(int x, int y) {
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return touch_event_.PressPoint(x, y);
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void MoveTouchPoint(int index, int x, int y) {
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    touch_event_.MovePoint(index, x, y);
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ReleaseTouchPoint(int index) {
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    touch_event_.ReleasePoint(index);
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void CancelTouchPoint(int index) {
253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    touch_event_.CancelPoint(index);
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SendInputEventACK(blink::WebInputEvent::Type type,
256558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         InputEventAckState ack_result) {
257558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    scoped_ptr<IPC::Message> response(
2583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        new InputHostMsg_HandleInputEvent_ACK(0, type, ack_result,
2593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                              ui::LatencyInfo()));
260558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    input_router_->OnMessageReceived(*response);
261558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
262558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InputRouterImpl* input_router() const {
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return input_router_.get();
265558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
266558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool TouchEventQueueEmpty() const {
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return input_router()->touch_event_queue_->empty();
269558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
270558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool TouchEventTimeoutEnabled() const {
272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return input_router()->touch_event_queue_->ack_timeout_enabled();
273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnHasTouchEventHandlers(bool has_handlers) {
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    input_router_->OnMessageReceived(
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ViewHostMsg_HasTouchEventHandlers(0, has_handlers));
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnSetTouchAction(content::TouchAction touch_action) {
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    input_router_->OnMessageReceived(
282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        InputHostMsg_SetTouchAction(0, touch_action));
283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t GetSentMessageCountAndResetSink() {
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    size_t count = process_->sink().message_count();
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    process_->sink().ClearMessages();
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return count;
289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static void RunTasksAndWait(base::TimeDelta delay) {
292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        FROM_HERE, base::MessageLoop::QuitClosure(), delay);
294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::MessageLoop::current()->Run();
295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<MockRenderProcessHost> process_;
298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<MockInputRouterClient> client_;
299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<MockInputAckHandler> ack_handler_;
300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<InputRouterImpl> input_router_;
301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::MessageLoopForUI message_loop_;
304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SyntheticWebTouchEvent touch_event_;
305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context_;
307558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch};
308558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesRangeSelection) {
31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(scoped_ptr<IPC::Message>(
31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4))));
312558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ExpectIPCMessageWithArg2<InputMsg_SelectRange>(
313558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0),
314558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(1, 2),
315558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(3, 4));
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
317558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
318558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send two more messages without acking.
31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(scoped_ptr<IPC::Message>(
32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new InputMsg_SelectRange(0, gfx::Point(5, 6), gfx::Point(7, 8))));
3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
322558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(scoped_ptr<IPC::Message>(
32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new InputMsg_SelectRange(0, gfx::Point(9, 10), gfx::Point(11, 12))));
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
326558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
327558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Now ack the first message.
328558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
329558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0));
330558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    input_router_->OnMessageReceived(*response);
331558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
332558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
333558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Verify that the two messages are coalesced into one message.
334558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ExpectIPCMessageWithArg2<InputMsg_SelectRange>(
335558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0),
336558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(9, 10),
337558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(11, 12));
3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
339558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
340558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Acking the coalesced msg should not send any more msg.
341558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
342558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0));
343558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    input_router_->OnMessageReceived(*response);
344558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
346558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
347558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesCaretMove) {
34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(
35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(1, 2))));
351558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ExpectIPCMessageWithArg1<InputMsg_MoveCaret>(
352558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0), gfx::Point(1, 2));
3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
354558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
355558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send two more messages without acking.
35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(
35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(5, 6))));
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
359558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(
36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(9, 10))));
3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
363558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
364558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Now ack the first message.
365558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
366558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0));
367558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    input_router_->OnMessageReceived(*response);
368558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
369558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
370558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Verify that the two messages are coalesced into one message.
371558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ExpectIPCMessageWithArg1<InputMsg_MoveCaret>(
372558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0), gfx::Point(9, 10));
3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
374558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
375558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Acking the coalesced msg should not send any more msg.
376558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
377558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0));
378558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    input_router_->OnMessageReceived(*response);
379558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
381558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
382558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, HandledInputEvent) {
384558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  client_->set_filter_state(INPUT_EVENT_ACK_STATE_CONSUMED);
385558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
386558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Simulate a keyboard event.
3874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
388558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
389558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Make sure no input event is sent to the renderer.
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
391558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
392558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // OnKeyboardEventAck should be triggered without actual ack.
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
394558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
395558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // As the event was acked already, keyboard event queue should be
396558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // empty.
397558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(NULL, input_router_->GetLastKeyboardEvent());
398558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
399558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, ClientCanceledKeyboardEvent) {
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  client_->set_filter_state(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
402558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Simulate a keyboard event that has no consumer.
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
405558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
406558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Make sure no input event is sent to the renderer.
4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Simulate a keyboard event that should be dropped.
4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  client_->set_filter_state(INPUT_EVENT_ACK_STATE_UNKNOWN);
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Make sure no input event is sent to the renderer, and no ack is sent.
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
418558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
419558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, ShortcutKeyboardEvent) {
4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, true);
422558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(GetIsShortcutFromHandleInputEventMessage(
423558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0)));
424558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
425558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->sink().ClearMessages();
426558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
428558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(GetIsShortcutFromHandleInputEventMessage(
429558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0)));
430558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
431558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, NoncorrespondingKeyEvents) {
4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
434558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
435558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::KeyUp,
436558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(ack_handler_->unexpected_event_ack_called());
438558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
439558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
440558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests ported from RenderWidgetHostTest --------------------------------------
441558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, HandleKeyEventsWeSent) {
443558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Simulate a keyboard event.
4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
445558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(input_router_->GetLastKeyboardEvent());
446558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(WebInputEvent::RawKeyDown,
447558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch            input_router_->GetLastKeyboardEvent()->type);
448558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
449558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Make sure we sent the input event to the renderer.
450558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
451558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  InputMsg_HandleInputEvent::ID));
452558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->sink().ClearMessages();
453558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
454558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send the simulated response from the renderer back.
455558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::RawKeyDown,
456558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(WebInputEvent::RawKeyDown,
45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            ack_handler_->acked_keyboard_event().type);
460558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
461558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, IgnoreKeyEventsWeDidntSend) {
463558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send a simulated, unrequested key response. We should ignore this.
464558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::RawKeyDown,
465558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
466558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
468558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
469558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesWheelEvents) {
471558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Simulate wheel events.
472558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(0, -5, 0, false);  // sent directly
473558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(0, -10, 0, false);  // enqueued
474558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(8, -6, 0, false);  // coalesced into previous event
475558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(9, -7, 1, false);  // enqueued, different modifiers
476558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
477558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Check that only the first event was sent.
478558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
479558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  InputMsg_HandleInputEvent::ID));
4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
481558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Check that the ACK sends the second message immediately.
483558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::MouseWheel,
484558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
485558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // The coalesced events can queue up a delayed ack
486558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // so that additional input events can be processed before
487558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // we turn off coalescing.
488558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::MessageLoop::current()->RunUntilIdle();
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
490558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
491558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          InputMsg_HandleInputEvent::ID));
4924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
493558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
494558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // One more time.
495558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::MouseWheel,
496558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
497558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::MessageLoop::current()->RunUntilIdle();
4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
499558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
500558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  InputMsg_HandleInputEvent::ID));
5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
502558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
503558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // After the final ack, the queue should be empty.
504558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::MouseWheel,
505558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
506558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::MessageLoop::current()->RunUntilIdle();
5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
509558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
510558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest,
512558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch       CoalescesWheelEventsQueuedPhaseEndIsNotDropped) {
513558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send an initial gesture begin and ACK it.
514558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
515558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                       WebGestureEvent::Touchpad);
5164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
517558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::GestureScrollBegin,
518558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
519558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::MessageLoop::current()->RunUntilIdle();
520558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
521558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send a wheel event, should get sent directly.
522558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(0, -5, 0, false);
5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
524558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
525558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send a wheel phase end event before an ACK is received for the previous
526558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // wheel event, which should get queued.
527558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEventWithPhase(WebMouseWheelEvent::PhaseEnded);
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
529558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
530558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // A gesture event should now result in the queued phase ended event being
531558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // transmitted before it.
532558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
533558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                       WebGestureEvent::Touchpad);
534558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
535558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Verify the events that were sent.
536558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const WebInputEvent* input_event =
5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
538558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
539558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const WebMouseWheelEvent* wheel_event =
540558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      static_cast<const WebMouseWheelEvent*>(input_event);
541558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(WebMouseWheelEvent::PhaseEnded, wheel_event->phase);
542558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(1));
544558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(WebInputEvent::GestureScrollEnd, input_event->type);
545558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(2U, GetSentMessageCountAndResetSink());
547558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
548558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
549558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests that touch-events are queued properly.
550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchEventQueue) {
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnHasTouchEventHandlers(true);
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
553558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PressTouchPoint(1, 1);
554558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(client_->GetAndResetFilterEventCalled());
5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
558558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
559558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // The second touch should not be sent since one is already in queue.
560558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  MoveTouchPoint(0, 5, 5);
561558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(client_->GetAndResetFilterEventCalled());
5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
565558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
566558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Receive an ACK for the first touch-event.
567558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::TouchStart,
568558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
571558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(WebInputEvent::TouchStart,
57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            ack_handler_->acked_touch_event().event.type);
5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
574558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
575558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::TouchMove,
576558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(TouchEventQueueEmpty());
5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
579558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(WebInputEvent::TouchMove,
58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            ack_handler_->acked_touch_event().event.type);
5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
582558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
583558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
584558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests that the touch-queue is emptied if a page stops listening for touch
585558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// events.
586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchEventQueueFlush) {
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnHasTouchEventHandlers(true);
588558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(client_->has_touch_handler());
5894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
5904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(TouchEventQueueEmpty());
591558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
592558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(input_router_->ShouldForwardTouchEvent());
593558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
594558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send a touch-press event.
595558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PressTouchPoint(1, 1);
596558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
599558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
600558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // The page stops listening for touch-events. The touch-event queue should now
601558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // be emptied, but none of the queued touch-events should be sent to the
602558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // renderer.
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnHasTouchEventHandlers(false);
604558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(client_->has_touch_handler());
6054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(TouchEventQueueEmpty());
607558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(input_router_->ShouldForwardTouchEvent());
608558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
609558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
610558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) || defined(USE_AURA)
611558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests that the acked events have correct state. (ui::Events are used only on
612558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// windows and aura)
613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, AckedTouchEventState) {
614558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(TouchEventQueueEmpty());
617558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(input_router_->ShouldForwardTouchEvent());
618558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
619558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send a bunch of events, and make sure the ACKed events are correct.
620558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ScopedVector<ui::TouchEvent> expected_events;
621558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
622558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Use a custom timestamp for all the events to test that the acked events
623558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // have the same timestamp;
624558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::TimeDelta timestamp = base::Time::NowFromSystemTime() - base::Time();
625558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  timestamp -= base::TimeDelta::FromSeconds(600);
626558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
627558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Press the first finger.
628558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PressTouchPoint(1, 1);
629558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SetTouchTimestamp(timestamp);
630558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
6314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
632558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED,
633558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(1, 1), 0, timestamp));
634558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
635558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Move the finger.
636558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  timestamp += base::TimeDelta::FromSeconds(10);
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MoveTouchPoint(0, 500, 500);
638558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SetTouchTimestamp(timestamp);
639558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
6404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
641558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED,
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Point(500, 500), 0, timestamp));
643558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
644558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Now press a second finger.
645558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  timestamp += base::TimeDelta::FromSeconds(10);
646558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PressTouchPoint(2, 2);
647558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SetTouchTimestamp(timestamp);
648558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
6494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
650558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED,
651558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(2, 2), 1, timestamp));
652558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
653558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Move both fingers.
654558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  timestamp += base::TimeDelta::FromSeconds(10);
655558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  MoveTouchPoint(0, 10, 10);
656558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  MoveTouchPoint(1, 20, 20);
657558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SetTouchTimestamp(timestamp);
658558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
6594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
660558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED,
661558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(10, 10), 0, timestamp));
662558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED,
663558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(20, 20), 1, timestamp));
664558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
665558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Receive the ACKs and make sure the generated events from the acked events
666558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // are correct.
667558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  WebInputEvent::Type acks[] = { WebInputEvent::TouchStart,
668558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 WebInputEvent::TouchMove,
669558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 WebInputEvent::TouchStart,
670558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 WebInputEvent::TouchMove };
671558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
672558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  TouchEventCoordinateSystem coordinate_system = LOCAL_COORDINATES;
673558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if !defined(OS_WIN)
674558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  coordinate_system = SCREEN_COORDINATES;
675558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
676558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  for (size_t i = 0; i < arraysize(acks); ++i) {
677558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    SendInputEventACK(acks[i],
678558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
67958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(acks[i], ack_handler_->acked_touch_event().event.type);
680558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    ScopedVector<ui::TouchEvent> acked;
681558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
682558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    MakeUITouchEventsFromWebTouchEvents(
68358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ack_handler_->acked_touch_event(), &acked, coordinate_system);
684558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    bool success = EventListIsSubset(acked, expected_events);
685558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_TRUE(success) << "Failed on step: " << i;
686558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (!success)
687558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      break;
688558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    expected_events.erase(expected_events.begin(),
689558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                          expected_events.begin() + acked.size());
690558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
691558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(TouchEventQueueEmpty());
693558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(0U, expected_events.size());
694558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
695558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif  // defined(OS_WIN) || defined(USE_AURA)
696558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, UnhandledWheelEvent) {
698558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Simulate wheel events.
699558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(0, -5, 0, false);  // sent directly
700558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(0, -10, 0, false);  // enqueued
701558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
702558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Check that only the first event was sent.
703558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
704558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  InputMsg_HandleInputEvent::ID));
7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
706558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
707558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Indicate that the wheel event was unhandled.
708558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::MouseWheel,
709558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
710558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
711558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Check that the correct unhandled wheel event was received.
7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
71358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state());
71458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5);
715558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
716558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Check that the second event was sent.
717558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
718558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  InputMsg_HandleInputEvent::ID));
7194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
720558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
721558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Check that the correct unhandled wheel event was received.
72258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5);
723558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
724558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
725a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchTypesIgnoringAck) {
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnHasTouchEventHandlers(true);
7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int start_type = static_cast<int>(WebInputEvent::TouchStart);
729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int end_type = static_cast<int>(WebInputEvent::TouchCancel);
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_LT(start_type, end_type);
731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (int i = start_type; i <= end_type; ++i) {
732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    WebInputEvent::Type type = static_cast<WebInputEvent::Type>(i);
733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!WebInputEventTraits::IgnoresAckDisposition(type))
734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      continue;
735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // The TouchEventQueue requires an initial TouchStart for it to begin
737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // forwarding other touch event types.
738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (type != WebInputEvent::TouchStart) {
739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SimulateTouchEvent(WebInputEvent::TouchStart);
740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SendInputEventACK(WebInputEvent::TouchStart,
741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        INPUT_EVENT_ACK_STATE_CONSUMED);
742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_EQ(1U, ack_handler_->GetAndResetAckCount());
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(0, client_->in_flight_event_count());
745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
746f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SimulateTouchEvent(type);
748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0, client_->in_flight_event_count());
751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureTypesIgnoringAck) {
758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // We test every gesture type, ensuring that the stream of gestures is valid.
759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int kEventTypesLength = 29;
760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WebInputEvent::Type eventTypes[kEventTypesLength] = {
761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureShowPress,
763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapCancel,
764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureScrollBegin,
765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureFlingStart,
766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureFlingCancel,
767a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
768a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTap,
769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureLongPress,
771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapCancel,
772a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureLongTap,
773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapUnconfirmed,
775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapCancel,
776a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
777a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureDoubleTap,
778a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
779a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapCancel,
780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTwoFingerTap,
781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapCancel,
783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureScrollBegin,
784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureScrollUpdate,
785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureScrollUpdateWithoutPropagation,
786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GesturePinchBegin,
787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GesturePinchUpdate,
788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GesturePinchEnd,
789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureScrollEnd};
790a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (int i = 0; i < kEventTypesLength; ++i) {
791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    WebInputEvent::Type type = eventTypes[i];
792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (!WebInputEventTraits::IgnoresAckDisposition(type)) {
793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      SimulateGestureEvent(type, WebGestureEvent::Touchscreen);
794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(1, client_->in_flight_event_count());
797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(0, client_->in_flight_event_count());
802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      continue;
803a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
804f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
805f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SimulateGestureEvent(type, WebGestureEvent::Touchscreen);
806f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0, client_->in_flight_event_count());
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InputRouterImplTest, MouseTypesIgnoringAck) {
8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int start_type = static_cast<int>(WebInputEvent::MouseDown);
8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int end_type = static_cast<int>(WebInputEvent::ContextMenu);
8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_LT(start_type, end_type);
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (int i = start_type; i <= end_type; ++i) {
8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::Type type = static_cast<WebInputEvent::Type>(i);
8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int expected_in_flight_event_count =
8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        WebInputEventTraits::IgnoresAckDisposition(type) ? 0 : 1;
8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Note: Mouse event acks are never forwarded to the ack handler, so the key
8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // result here is that ignored ack types don't affect the in-flight count.
8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SimulateMouseEvent(type, 0, 0);
8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(expected_in_flight_event_count, client_->in_flight_event_count());
830f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
832f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0, client_->in_flight_event_count());
8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Guard against breaking changes to the list of ignored event ack types in
8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |WebInputEventTraits::IgnoresAckDisposition|.
8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InputRouterImplTest, RequiredEventAckTypes) {
8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const WebInputEvent::Type kRequiredEventAckTypes[] = {
8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::MouseMove,
8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::MouseWheel,
8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::RawKeyDown,
8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::KeyDown,
8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::KeyUp,
8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::Char,
8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::GestureScrollUpdate,
8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::GestureFlingStart,
8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::GestureFlingCancel,
8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::GesturePinchUpdate,
8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::TouchStart,
8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::TouchMove
8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kRequiredEventAckTypes); ++i) {
8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const WebInputEvent::Type required_ack_type = kRequiredEventAckTypes[i];
8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(WebInputEventTraits::IgnoresAckDisposition(required_ack_type));
857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
860f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that GestureShowPress, GestureTapDown and GestureTapCancel events don't
861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// wait for ACKs.
862a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureTypesIgnoringAckInterleaved) {
863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Interleave a few events that do and do not ignore acks, ensuring that
864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // ack-ignoring events aren't dispatched until all prior events which observe
865f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // their ack disposition have been dispatched.
866a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
867a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
868a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
869a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
870a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
871a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, client_->in_flight_event_count());
872a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
873a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
874f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
875f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
878f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTapDown,
880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
884f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
885a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
886f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
887f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
888f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
889f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
890f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureShowPress,
891f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
895a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTapCancel,
901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
902f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
903f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
905f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Now ack each event. Ack-ignoring events should not be dispatched until all
906f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // prior events which observe ack disposition have been fired, at which
9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // point they should be sent immediately.  They should also have no effect
9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // on the in-flight event count.
909a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollBegin,
910a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
911a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
912a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
913f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
914f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
915f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount());
9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
917f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
918f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // For events which ignore ack disposition, non-synthetic acks are ignored.
919f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureTapDown,
920f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
922f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
924f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount());
9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // For events which ignore ack disposition, non-synthetic acks are ignored.
932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureShowPress,
933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
938a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
939f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
941f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount());
9425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, client_->in_flight_event_count());
943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // For events which ignore ack disposition, non-synthetic acks are ignored.
945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureTapCancel,
946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, client_->in_flight_event_count());
950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that GestureShowPress events don't get out of order due to
953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// ignoring their acks.
954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureShowPressIsInOrder) {
955a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
956a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
957a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
958a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
959a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
960a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // GesturePinchBegin ignores its ack.
9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
967a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // GesturePinchUpdate waits for an ack.
9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GesturePinchUpdate,
9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureShowPress,
974f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
975f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The ShowPress, though it ignores ack, is still stuck in the queue
9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // behind the PinchUpdate which requires an ack.
978f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureShowPress,
981f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
982f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
983f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // ShowPress has entered the queue.
984f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
985f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This ack is ignored.
9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GesturePinchBegin,
988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
991f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GesturePinchUpdate,
9935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Now that the Tap has been ACKed, the ShowPress events should receive
9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // synthetic acks, and fire immediately.
996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
997f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3U, ack_handler_->GetAndResetAckCount());
998f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1000a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Test that touch ack timeout behavior is properly configured via the command
1001a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// line, and toggled by view update flags and allowed touch actions.
1002a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchAckTimeoutConfigured) {
1003a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Unless explicitly supported via the command-line, the touch timeout should
1004a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be disabled.
1005a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1006a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1007a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
1008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      switches::kTouchAckTimeoutDelayMs, "1");
1009a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TearDown();
1010a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetUp();
1011a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(TouchEventTimeoutEnabled());
1012a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1013a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify that the touch ack timeout fires upon the delayed ack.
1014a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1016a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1017a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1018a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTasksAndWait(base::TimeDelta::FromMilliseconds(2));
1019a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The timed-out event should have been ack'ed.
1021a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1022a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1023a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1024a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ack'ing the timed-out event should fire a TouchCancel.
1025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1026a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1027a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1028a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1029a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The remainder of the touch sequence should be dropped.
1030a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1031a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1032a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1033a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1034a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(TouchEventTimeoutEnabled());
1035a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1036a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // A fixed page scale or mobile viewport should disable the touch timeout.
1037a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  input_router()->OnViewUpdated(InputRouter::FIXED_PAGE_SCALE);
1038a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1039a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1040a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE);
1041a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1042a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1043a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT);
1044a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1045a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT |
1047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                InputRouter::FIXED_PAGE_SCALE);
1048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1050a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE);
1051a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1052a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1053a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TOUCH_ACTION_NONE (and no other touch-action) should disable the timeout.
1054a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHasTouchEventHandlers(true);
1055a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1056a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1057a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_PAN_Y);
1058a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1059a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1060a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1061a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1062a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1063a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1064a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1065a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1066a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_NONE);
1067a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1068a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1070a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1071a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1073a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // As the touch-action is reset by a new touch sequence, the timeout behavior
1074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // should be restored.
1075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1080a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that a touch sequenced preceded by TOUCH_ACTION_NONE is not affected by
1081a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// the touch timeout.
1082a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest,
1083a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       TouchAckTimeoutDisabledForTouchSequenceAfterTouchActionNone) {
1084a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
1085a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      switches::kTouchAckTimeoutDelayMs, "1");
1086a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TearDown();
1087a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetUp();
1088a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(TouchEventTimeoutEnabled());
1089a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHasTouchEventHandlers(true);
1090a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1091a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Start a touch sequence.
1092a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1093a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1094a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1095a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TOUCH_ACTION_NONE should disable the timeout.
1096a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_NONE);
1097a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1098a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1099a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // End the touch sequence.
1101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ack_handler_->GetAndResetAckCount();
1106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetSentMessageCountAndResetSink();
1107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Start another touch sequence.  While this does restore the touch timeout
1109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // the timeout will not apply until the *next* touch sequence. This affords a
1110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // touch-action response from the renderer without racing against the timeout.
1111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Delay the ack.  The timeout should *not* fire.
1117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTasksAndWait(base::TimeDelta::FromMilliseconds(2));
1118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Finally send the ack.  The touch sequence should not have been cancelled.
1122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart,
1123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // End the sequence.
1129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // A new touch sequence should (finally) be subject to the timeout.
1136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Wait for the touch ack timeout to fire.
1143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTasksAndWait(base::TimeDelta::FromMilliseconds(2));
1144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that TouchActionFilter::ResetTouchAction is called before the
1148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// first touch event for a touch sequence reaches the renderer.
1149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest, ResetTouchActionBeforeEventReachesRenderer) {
1150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHasTouchEventHandlers(true);
1151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 1.
1153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_NONE);
1156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 5, 5);
1157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 2.
1162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 5, 5);
1165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED);
1171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ensure touch action is still none, as the next touch start hasn't been
1173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // acked yet. ScrollBegin and ScrollEnd don't require acks.
1174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
1175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchpad);
1177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchpad);
1180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This allows the next touch sequence to start.
1183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ensure touch action has been set to auto, as a new touch sequence has
1186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // started.
1187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchpad);
1190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchpad);
1193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED);
1197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that TouchActionFilter::OnStartNewTouchSequence is called when a touch
1201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// handler is removed.
1202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest, OnStartNewTouchSequenceWhenTouchHandlerRemoved) {
1203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHasTouchEventHandlers(true);
1204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 1.
1206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_NONE);
1209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 2
1215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ensure we have touch-action:none. ScrollBegin and ScrollEnd don't require
1219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // acks.
1220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchpad);
1223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchpad);
1226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart,
1230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ensure touch action has been set to auto, the touch handler has been
1233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // removed.
1234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
1236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchpad);
1237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchpad);
1240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that the double tap gesture depends on the touch action of the first
1244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// tap.
1245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest, DoubleTapGestureDependsOnFirstTap) {
1246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHasTouchEventHandlers(true);
1247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 1.
1249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_NONE);
1252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 2
1258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // First tap.
1262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTapDown,
1264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
1265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The GestureTapUnconfirmed is converted into a tap, as the touch action is
1268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // auto.
1269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTapUnconfirmed,
1270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
1271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureTap,
1272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
1273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This tap gesture is dropped, since the GestureTapUnconfirmed was turned
1276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // into a tap.
1277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTap, WebGestureEvent::Touchscreen);
1278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart,
1282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Second Tap.
1285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTapDown,
1287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
1288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Although the touch-action is now auto, the double tap still won't be
1291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // dispatched, because the first tap occured when the touch-action was none.
1292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureDoubleTap,
1293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
1294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This test will become invalid if GestureDoubleTap stops requiring an ack.
1295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!WebInputEventTraits::IgnoresAckDisposition(
1296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureDoubleTap));
1297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, client_->in_flight_event_count());
1298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1300558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace content
1301