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
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <math.h>
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/basictypes.h"
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/command_line.h"
9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/memory/scoped_ptr.h"
10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/strings/utf_string_conversions.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/input/gesture_event_queue.h"
12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/input/input_router_client.h"
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/input_router_impl.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/mock_input_ack_handler.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/browser/renderer_host/input/mock_input_router_client.h"
16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/content_constants_internal.h"
17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/edit_command.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/input/synthetic_web_input_event_builders.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/input/touch_action.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/input/web_input_event_traits.h"
21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/input_messages.h"
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/view_messages.h"
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/content_switches.h"
24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/test/mock_render_process_host.h"
25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/test/test_browser_context.h"
26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/ui_events_helper.h"
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing base::TimeDelta;
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebGestureDevice;
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebGestureEvent;
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using blink::WebKeyboardEvent;
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent;
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent;
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent;
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent;
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchPoint;
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace content {
45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace {
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochconst WebInputEvent* GetInputEventFromMessage(const IPC::Message& message) {
49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PickleIterator iter(message);
50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const char* data;
51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int data_length;
52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!message.ReadData(&iter, &data, &data_length))
53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return NULL;
54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return reinterpret_cast<const WebInputEvent*>(data);
55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuWebInputEvent& GetEventWithType(WebInputEvent::Type type) {
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebInputEvent* event = NULL;
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (WebInputEvent::isMouseEventType(type)) {
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    static WebMouseEvent mouse;
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    event = &mouse;
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  } else if (WebInputEvent::isTouchEventType(type)) {
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    static WebTouchEvent touch;
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    event = &touch;
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  } else if (WebInputEvent::isKeyboardEventType(type)) {
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    static WebKeyboardEvent key;
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    event = &key;
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  } else if (WebInputEvent::isGestureEventType(type)) {
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    static WebGestureEvent gesture;
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    event = &gesture;
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  } else if (type == WebInputEvent::MouseWheel) {
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    static WebMouseWheelEvent wheel;
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    event = &wheel;
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CHECK(event);
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  event->type = type;
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return *event;
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool GetIsShortcutFromHandleInputEventMessage(const IPC::Message* msg) {
81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  InputMsg_HandleInputEvent::Schema::Param param;
82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  InputMsg_HandleInputEvent::Read(msg, &param);
83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return param.c;
84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochtemplate<typename MSG_T, typename ARG_T1>
87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid ExpectIPCMessageWithArg1(const IPC::Message* msg, const ARG_T1& arg1) {
88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(MSG_T::ID, msg->type());
89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  typename MSG_T::Schema::Param param;
90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(MSG_T::Read(msg, &param));
91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(arg1, param.a);
92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochtemplate<typename MSG_T, typename ARG_T1, typename ARG_T2>
95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid ExpectIPCMessageWithArg2(const IPC::Message* msg,
96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              const ARG_T1& arg1,
97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              const ARG_T2& arg2) {
98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(MSG_T::ID, msg->type());
99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  typename MSG_T::Schema::Param param;
100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(MSG_T::Read(msg, &param));
101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(arg1, param.a);
102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(arg2, param.b);
103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool TouchEventsAreEquivalent(const ui::TouchEvent& first,
107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              const ui::TouchEvent& second) {
108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (first.type() != second.type())
109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (first.location() != second.location())
111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (first.touch_id() != second.touch_id())
113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (second.time_stamp().InSeconds() != first.time_stamp().InSeconds())
115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return true;
117558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
118558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
119558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool EventListIsSubset(const ScopedVector<ui::TouchEvent>& subset,
120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                       const ScopedVector<ui::TouchEvent>& set) {
121558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (subset.size() > set.size())
122558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  for (size_t i = 0; i < subset.size(); ++i) {
124558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const ui::TouchEvent* first = subset[i];
125558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const ui::TouchEvent* second = set[i];
126558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    bool equivalent = TouchEventsAreEquivalent(*first, *second);
127558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (!equivalent)
128558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      return false;
129558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
130558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
131558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return true;
132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif  // defined(USE_AURA)
134558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Expected function used for converting pinch scales to deltaY values.
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)float PinchScaleToWheelDelta(float scale) {
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return 100.0 * log(scale);
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
140558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace
141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class InputRouterImplTest : public testing::Test {
143558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public:
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InputRouterImplTest() {}
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~InputRouterImplTest() {}
146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
147558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch protected:
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // testing::Test
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    browser_context_.reset(new TestBrowserContext());
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    process_.reset(new MockRenderProcessHost(browser_context_.get()));
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    client_.reset(new MockInputRouterClient());
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ack_handler_.reset(new MockInputAckHandler());
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    command_line->AppendSwitch(switches::kValidateInputEventStream);
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    input_router_.reset(new InputRouterImpl(process_.get(),
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                            client_.get(),
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                            ack_handler_.get(),
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                            MSG_ROUTING_NONE,
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                            config_));
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    client_->set_input_router(input_router());
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ack_handler_->set_input_router(input_router());
163558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
164558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Process all pending tasks to avoid leaks.
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_.reset();
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    client_.reset();
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    process_.reset();
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    browser_context_.reset();
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void SetUpForTouchAckTimeoutTest(int timeout_ms) {
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    config_.touch_config.touch_ack_timeout_delay =
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        base::TimeDelta::FromMilliseconds(timeout_ms);
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    config_.touch_config.touch_ack_timeout_supported = true;
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    TearDown();
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SetUp();
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateKeyboardEvent(WebInputEvent::Type type, bool is_shortcut) {
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type);
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    NativeWebKeyboardEvent native_event;
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    memcpy(&native_event, &event, sizeof(event));
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendKeyboardEvent(
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        native_event,
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ui::LatencyInfo(),
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        is_shortcut);
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateWheelEvent(float dX, float dY, int modifiers, bool precise) {
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo(
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SyntheticWebMouseWheelEventBuilder::Build(dX, dY, modifiers, precise),
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ui::LatencyInfo()));
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SimulateMouseEvent(WebInputEvent::Type type, int x, int y) {
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendMouseEvent(MouseEventWithLatencyInfo(
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SyntheticWebMouseEventBuilder::Build(type, x, y, 0),
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ui::LatencyInfo()));
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateWheelEventWithPhase(WebMouseWheelEvent::Phase phase) {
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo(
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SyntheticWebMouseWheelEventBuilder::Build(phase), ui::LatencyInfo()));
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateGestureEvent(const WebGestureEvent& gesture) {
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendGestureEvent(
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        GestureEventWithLatencyInfo(gesture, ui::LatencyInfo()));
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateGestureEvent(WebInputEvent::Type type,
21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                            WebGestureDevice sourceDevice) {
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SimulateGestureEvent(
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SyntheticWebGestureEventBuilder::Build(type, sourceDevice));
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateGestureScrollUpdateEvent(float dX, float dY, int modifiers) {
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SimulateGestureEvent(
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SyntheticWebGestureEventBuilder::BuildScrollUpdate(dX, dY, modifiers));
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SimulateGesturePinchUpdateEvent(float scale,
22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                       float anchorX,
22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                       float anchorY,
22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                       int modifiers,
23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                       WebGestureDevice sourceDevice) {
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SimulateGestureEvent(SyntheticWebGestureEventBuilder::BuildPinchUpdate(
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        scale, anchorX, anchorY, modifiers, sourceDevice));
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SimulateGestureFlingStartEvent(float velocityX,
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                      float velocityY,
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                      WebGestureDevice sourceDevice) {
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SimulateGestureEvent(
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SyntheticWebGestureEventBuilder::BuildFling(velocityX,
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                    velocityY,
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                    sourceDevice));
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SetTouchTimestamp(base::TimeDelta timestamp) {
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    touch_event_.SetTimestamp(timestamp);
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SendTouchEvent() {
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_->SendTouchEvent(
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        TouchEventWithLatencyInfo(touch_event_, ui::LatencyInfo()));
251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    touch_event_.ResetPoints();
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int PressTouchPoint(int x, int y) {
255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return touch_event_.PressPoint(x, y);
256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void MoveTouchPoint(int index, int x, int y) {
259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    touch_event_.MovePoint(index, x, y);
260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ReleaseTouchPoint(int index) {
263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    touch_event_.ReleasePoint(index);
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void CancelTouchPoint(int index) {
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    touch_event_.CancelPoint(index);
268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
2695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SendInputEventACK(blink::WebInputEvent::Type type,
271558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         InputEventAckState ack_result) {
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    InputHostMsg_HandleInputEvent_ACK_Params ack;
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ack.type = type;
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ack.state = ack_result;
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    input_router_->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack));
276558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
277558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InputRouterImpl* input_router() const {
279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return input_router_.get();
280558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
281558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool TouchEventQueueEmpty() const {
283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return input_router()->touch_event_queue_.empty();
284558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
285558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool TouchEventTimeoutEnabled() const {
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return input_router()->touch_event_queue_.IsAckTimeoutEnabled();
288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void Flush() const {
291c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return input_router_->Flush();
292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  size_t GetAndResetDidFlushCount() {
295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return client_->GetAndResetDidFlushCount();
296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
297c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool HasPendingEvents() const {
299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return input_router_->HasPendingEvents();
300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnHasTouchEventHandlers(bool has_handlers) {
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    input_router_->OnMessageReceived(
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ViewHostMsg_HasTouchEventHandlers(0, has_handlers));
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnSetTouchAction(content::TouchAction touch_action) {
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    input_router_->OnMessageReceived(
309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        InputHostMsg_SetTouchAction(0, touch_action));
310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t GetSentMessageCountAndResetSink() {
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    size_t count = process_->sink().message_count();
3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    process_->sink().ClearMessages();
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return count;
316558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static void RunTasksAndWait(base::TimeDelta delay) {
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        FROM_HERE, base::MessageLoop::QuitClosure(), delay);
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::MessageLoop::current()->Run();
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InputRouterImpl::Config config_;
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<MockRenderProcessHost> process_;
326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<MockInputRouterClient> client_;
327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<MockInputAckHandler> ack_handler_;
328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<InputRouterImpl> input_router_;
329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::MessageLoopForUI message_loop_;
332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SyntheticWebTouchEvent touch_event_;
333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context_;
335558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch};
336558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesRangeSelection) {
33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(scoped_ptr<IPC::Message>(
33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4))));
340558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ExpectIPCMessageWithArg2<InputMsg_SelectRange>(
341558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0),
342558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(1, 2),
343558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(3, 4));
3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
345558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
346558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send two more messages without acking.
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(scoped_ptr<IPC::Message>(
34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new InputMsg_SelectRange(0, gfx::Point(5, 6), gfx::Point(7, 8))));
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
350558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(scoped_ptr<IPC::Message>(
35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new InputMsg_SelectRange(0, gfx::Point(9, 10), gfx::Point(11, 12))));
3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
354558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
355558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Now ack the first message.
356558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
357558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0));
358558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    input_router_->OnMessageReceived(*response);
359558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
360558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
361558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Verify that the two messages are coalesced into one message.
362558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ExpectIPCMessageWithArg2<InputMsg_SelectRange>(
363558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0),
364558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(9, 10),
365558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(11, 12));
3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
367558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
368558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Acking the coalesced msg should not send any more msg.
369558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
370558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0));
371558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    input_router_->OnMessageReceived(*response);
372558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
374558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
375558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesCaretMove) {
37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(
37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(1, 2))));
379558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ExpectIPCMessageWithArg1<InputMsg_MoveCaret>(
380558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0), gfx::Point(1, 2));
3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
382558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
383558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send two more messages without acking.
38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(
38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(5, 6))));
3864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
387558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  input_router_->SendInput(
38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(9, 10))));
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
391558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
392558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Now ack the first message.
393558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
394558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0));
395558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    input_router_->OnMessageReceived(*response);
396558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
397558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
398558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Verify that the two messages are coalesced into one message.
399558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ExpectIPCMessageWithArg1<InputMsg_MoveCaret>(
400558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0), gfx::Point(9, 10));
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1u, GetSentMessageCountAndResetSink());
402558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
403558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Acking the coalesced msg should not send any more msg.
404558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
405558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0));
406558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    input_router_->OnMessageReceived(*response);
407558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
409558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
410558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, HandledInputEvent) {
412558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  client_->set_filter_state(INPUT_EVENT_ACK_STATE_CONSUMED);
413558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
414558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Simulate a keyboard event.
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
416558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
417558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Make sure no input event is sent to the renderer.
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
419558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
420558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // OnKeyboardEventAck should be triggered without actual ack.
4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
422558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
423558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // As the event was acked already, keyboard event queue should be
424558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // empty.
425558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(NULL, input_router_->GetLastKeyboardEvent());
426558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
427558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, ClientCanceledKeyboardEvent) {
4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  client_->set_filter_state(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
430558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Simulate a keyboard event that has no consumer.
4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
433558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
434558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Make sure no input event is sent to the renderer.
4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
4374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Simulate a keyboard event that should be dropped.
4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  client_->set_filter_state(INPUT_EVENT_ACK_STATE_UNKNOWN);
4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Make sure no input event is sent to the renderer, and no ack is sent.
4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, GetSentMessageCountAndResetSink());
4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
446558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
447558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, ShortcutKeyboardEvent) {
4494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, true);
450558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(GetIsShortcutFromHandleInputEventMessage(
451558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0)));
452558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
453558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->sink().ClearMessages();
454558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
456558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(GetIsShortcutFromHandleInputEventMessage(
457558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetMessageAt(0)));
458558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
459558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, NoncorrespondingKeyEvents) {
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
462558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
463558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::KeyUp,
464558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(ack_handler_->unexpected_event_ack_called());
466558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
467558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
468558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests ported from RenderWidgetHostTest --------------------------------------
469558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, HandleKeyEventsWeSent) {
471558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Simulate a keyboard event.
4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false);
473558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(input_router_->GetLastKeyboardEvent());
474558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(WebInputEvent::RawKeyDown,
475558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch            input_router_->GetLastKeyboardEvent()->type);
476558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
477558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Make sure we sent the input event to the renderer.
478558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
479558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  InputMsg_HandleInputEvent::ID));
480558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->sink().ClearMessages();
481558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
482558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send the simulated response from the renderer back.
483558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::RawKeyDown,
484558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(WebInputEvent::RawKeyDown,
48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            ack_handler_->acked_keyboard_event().type);
488558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
489558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, IgnoreKeyEventsWeDidntSend) {
491558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send a simulated, unrequested key response. We should ignore this.
492558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::RawKeyDown,
493558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
494558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
496558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
497558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesWheelEvents) {
499558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Simulate wheel events.
500558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(0, -5, 0, false);  // sent directly
501558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(0, -10, 0, false);  // enqueued
502558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(8, -6, 0, false);  // coalesced into previous event
503558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(9, -7, 1, false);  // enqueued, different modifiers
504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SimulateWheelEvent(0, -10, 0, false);  // enqueued, different modifiers
505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Explicitly verify that PhaseEnd isn't coalesced to avoid bugs like
506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // https://crbug.com/154740.
507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SimulateWheelEventWithPhase(WebMouseWheelEvent::PhaseEnded);  // enqueued
508558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
509558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Check that only the first event was sent.
510558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
511558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  InputMsg_HandleInputEvent::ID));
512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const WebInputEvent* input_event =
513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const WebMouseWheelEvent* wheel_event =
516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<const WebMouseWheelEvent*>(input_event);
517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, wheel_event->deltaX);
518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(-5, wheel_event->deltaY);
5194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
520558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Check that the ACK sends the second message immediately.
522558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::MouseWheel,
523558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
524558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // The coalesced events can queue up a delayed ack
525558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // so that additional input events can be processed before
526558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // we turn off coalescing.
527558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::MessageLoop::current()->RunUntilIdle();
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
529558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
530558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          InputMsg_HandleInputEvent::ID));
531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(8, wheel_event->deltaX);
535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(-10 + -6, wheel_event->deltaY);  // coalesced
5364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
537558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Ack the second event (which had the third coalesced into it).
539558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::MouseWheel,
540558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
541558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::MessageLoop::current()->RunUntilIdle();
5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
543558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
544558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  InputMsg_HandleInputEvent::ID));
545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(9, wheel_event->deltaX);
549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(-7, wheel_event->deltaY);
5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
551558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Ack the fourth event.
553558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::MouseWheel,
554558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
555558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::MessageLoop::current()->RunUntilIdle();
5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(
558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      process_->sink().GetUniqueMessageMatching(InputMsg_HandleInputEvent::ID));
559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, wheel_event->deltaX);
563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(-10, wheel_event->deltaY);
5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
565558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Ack the fifth event.
567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED);
568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(
571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      process_->sink().GetUniqueMessageMatching(InputMsg_HandleInputEvent::ID));
572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, wheel_event->deltaX);
576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, wheel_event->deltaY);
577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(WebMouseWheelEvent::PhaseEnded, wheel_event->phase);
5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
579558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // After the final ack, the queue should be empty.
581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED);
582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
585558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
586558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
587558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests that touch-events are queued properly.
588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchEventQueue) {
5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnHasTouchEventHandlers(true);
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
591558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PressTouchPoint(1, 1);
592558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
5934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(client_->GetAndResetFilterEventCalled());
5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
5954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
596558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
597558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // The second touch should not be sent since one is already in queue.
598558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  MoveTouchPoint(0, 5, 5);
599558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(client_->GetAndResetFilterEventCalled());
6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
603558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
604558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Receive an ACK for the first touch-event.
605558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::TouchStart,
606558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
6074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
609558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(WebInputEvent::TouchStart,
61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            ack_handler_->acked_touch_event().event.type);
6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
612558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
613558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::TouchMove,
614558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(TouchEventQueueEmpty());
6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
617558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(WebInputEvent::TouchMove,
61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            ack_handler_->acked_touch_event().event.type);
6194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
620558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
621558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that the touch-queue is emptied after a page stops listening for touch
6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// events and the outstanding ack is received.
624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchEventQueueFlush) {
6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnHasTouchEventHandlers(true);
626558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(client_->has_touch_handler());
6274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
6284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(TouchEventQueueEmpty());
629558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
630558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(input_router_->ShouldForwardTouchEvent());
631558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
632558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send a touch-press event.
633558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PressTouchPoint(1, 1);
634558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MoveTouchPoint(0, 2, 2);
6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MoveTouchPoint(0, 3, 3);
6374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
6384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
639558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The page stops listening for touch-events. Note that flushing is deferred
6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // until the outstanding ack is received.
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnHasTouchEventHandlers(false);
643558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(client_->has_touch_handler());
6444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(TouchEventQueueEmpty());
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(input_router_->ShouldForwardTouchEvent());
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // After the ack, the touch-event queue should be empty, and none of the
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // flushed touch-events should have been sent to the renderer.
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
6524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(TouchEventQueueEmpty());
653558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(input_router_->ShouldForwardTouchEvent());
654558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
655558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
656a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
657558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests that the acked events have correct state. (ui::Events are used only on
658558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// windows and aura)
659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, AckedTouchEventState) {
660558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
6614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
6624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(TouchEventQueueEmpty());
663558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(input_router_->ShouldForwardTouchEvent());
664558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
665558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send a bunch of events, and make sure the ACKed events are correct.
666558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ScopedVector<ui::TouchEvent> expected_events;
667558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
668558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Use a custom timestamp for all the events to test that the acked events
669558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // have the same timestamp;
670558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::TimeDelta timestamp = base::Time::NowFromSystemTime() - base::Time();
671558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  timestamp -= base::TimeDelta::FromSeconds(600);
672558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
673558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Press the first finger.
674558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PressTouchPoint(1, 1);
675558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SetTouchTimestamp(timestamp);
676558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
678558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED,
679558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(1, 1), 0, timestamp));
680558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
681558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Move the finger.
682558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  timestamp += base::TimeDelta::FromSeconds(10);
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MoveTouchPoint(0, 500, 500);
684558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SetTouchTimestamp(timestamp);
685558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
687558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED,
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Point(500, 500), 0, timestamp));
689558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
690558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Now press a second finger.
691558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  timestamp += base::TimeDelta::FromSeconds(10);
692558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PressTouchPoint(2, 2);
693558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SetTouchTimestamp(timestamp);
694558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
6954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
696558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED,
697558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(2, 2), 1, timestamp));
698558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
699558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Move both fingers.
700558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  timestamp += base::TimeDelta::FromSeconds(10);
701558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  MoveTouchPoint(0, 10, 10);
702558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  MoveTouchPoint(1, 20, 20);
703558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SetTouchTimestamp(timestamp);
704558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendTouchEvent();
7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(TouchEventQueueEmpty());
706558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED,
707558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(10, 10), 0, timestamp));
708558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED,
709558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      gfx::Point(20, 20), 1, timestamp));
710558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
711558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Receive the ACKs and make sure the generated events from the acked events
712558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // are correct.
713558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  WebInputEvent::Type acks[] = { WebInputEvent::TouchStart,
714558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 WebInputEvent::TouchMove,
715558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 WebInputEvent::TouchStart,
716558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 WebInputEvent::TouchMove };
717558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
718558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  TouchEventCoordinateSystem coordinate_system = LOCAL_COORDINATES;
719558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if !defined(OS_WIN)
720558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  coordinate_system = SCREEN_COORDINATES;
721558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
722558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  for (size_t i = 0; i < arraysize(acks); ++i) {
723558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    SendInputEventACK(acks[i],
724558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
72558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(acks[i], ack_handler_->acked_touch_event().event.type);
726558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    ScopedVector<ui::TouchEvent> acked;
727558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
728558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    MakeUITouchEventsFromWebTouchEvents(
72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ack_handler_->acked_touch_event(), &acked, coordinate_system);
730558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    bool success = EventListIsSubset(acked, expected_events);
731558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_TRUE(success) << "Failed on step: " << i;
732558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (!success)
733558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      break;
734558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    expected_events.erase(expected_events.begin(),
735558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                          expected_events.begin() + acked.size());
736558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
737558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(TouchEventQueueEmpty());
739558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(0U, expected_events.size());
740558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
741a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif  // defined(USE_AURA)
742558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
743a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, UnhandledWheelEvent) {
744558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Simulate wheel events.
745558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(0, -5, 0, false);  // sent directly
746558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateWheelEvent(0, -10, 0, false);  // enqueued
747558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
748558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Check that only the first event was sent.
749558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
750558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  InputMsg_HandleInputEvent::ID));
7514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
752558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
753558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Indicate that the wheel event was unhandled.
754558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::MouseWheel,
755558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
756558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
757558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Check that the correct unhandled wheel event was received.
7584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
75958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state());
76058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5);
761558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
762558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Check that the second event was sent.
763558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
764558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  InputMsg_HandleInputEvent::ID));
7654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
766558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
767558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Check that the correct unhandled wheel event was received.
76858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5);
769558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
770558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchTypesIgnoringAck) {
7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnHasTouchEventHandlers(true);
77346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Only acks for TouchCancel should always be ignored.
77446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
77546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetEventWithType(WebInputEvent::TouchStart)));
77646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
77746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetEventWithType(WebInputEvent::TouchMove)));
77846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
77946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetEventWithType(WebInputEvent::TouchEnd)));
7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
78146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Precede the TouchCancel with an appropriate TouchStart;
78246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  PressTouchPoint(1, 1);
78346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendTouchEvent();
78446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
78546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
78646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(1U, ack_handler_->GetAndResetAckCount());
78746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(0, client_->in_flight_event_count());
788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
78946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The TouchCancel ack is always ignored.
79046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CancelTouchPoint(0);
79146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendTouchEvent();
79246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
79346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
79446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, client_->in_flight_event_count());
79546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(HasPendingEvents());
79646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchCancel,
79746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
79846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
79946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
80046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(HasPendingEvents());
801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
803a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureTypesIgnoringAck) {
804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // We test every gesture type, ensuring that the stream of gestures is valid.
805a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int kEventTypesLength = 29;
806a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WebInputEvent::Type eventTypes[kEventTypesLength] = {
807a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureShowPress,
809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapCancel,
810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureScrollBegin,
811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureFlingStart,
812a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureFlingCancel,
813a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
814a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTap,
815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureLongPress,
817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapCancel,
818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureLongTap,
819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
820a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapUnconfirmed,
821a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapCancel,
822a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureDoubleTap,
824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapCancel,
826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTwoFingerTap,
827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapDown,
828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureTapCancel,
829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureScrollBegin,
830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureScrollUpdate,
831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureScrollUpdateWithoutPropagation,
832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GesturePinchBegin,
833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GesturePinchUpdate,
834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GesturePinchEnd,
835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebInputEvent::GestureScrollEnd};
836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (int i = 0; i < kEventTypesLength; ++i) {
837a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    WebInputEvent::Type type = eventTypes[i];
8385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (!WebInputEventTraits::IgnoresAckDisposition(GetEventWithType(type))) {
83946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      SimulateGestureEvent(type, blink::WebGestureDeviceTouchscreen);
840a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
841a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
842a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(1, client_->in_flight_event_count());
843c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      EXPECT_TRUE(HasPendingEvents());
844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
845a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
846a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
847a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
848a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      EXPECT_EQ(0, client_->in_flight_event_count());
849c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      EXPECT_FALSE(HasPendingEvents());
850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      continue;
851a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
85346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SimulateGestureEvent(type, blink::WebGestureDeviceTouchscreen);
854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0, client_->in_flight_event_count());
857c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(HasPendingEvents());
8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InputRouterImplTest, MouseTypesIgnoringAck) {
8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int start_type = static_cast<int>(WebInputEvent::MouseDown);
8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int end_type = static_cast<int>(WebInputEvent::ContextMenu);
8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_LT(start_type, end_type);
8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (int i = start_type; i <= end_type; ++i) {
8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::Type type = static_cast<WebInputEvent::Type>(i);
8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int expected_in_flight_event_count =
8685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        WebInputEventTraits::IgnoresAckDisposition(GetEventWithType(type)) ? 0
8695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                                                           : 1;
8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Note: Mouse event acks are never forwarded to the ack handler, so the key
8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // result here is that ignored ack types don't affect the in-flight count.
8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SimulateMouseEvent(type, 0, 0);
8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(expected_in_flight_event_count, client_->in_flight_event_count());
8775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (expected_in_flight_event_count) {
8785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
8795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
8805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
8815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      EXPECT_EQ(0, client_->in_flight_event_count());
8825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Guard against breaking changes to the list of ignored event ack types in
8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |WebInputEventTraits::IgnoresAckDisposition|.
8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InputRouterImplTest, RequiredEventAckTypes) {
8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const WebInputEvent::Type kRequiredEventAckTypes[] = {
8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::MouseMove,
8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::MouseWheel,
8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::RawKeyDown,
8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::KeyDown,
8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::KeyUp,
8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::Char,
8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::GestureScrollUpdate,
8975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::GestureFlingStart,
8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::GestureFlingCancel,
8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::GesturePinchUpdate,
9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::TouchStart,
9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebInputEvent::TouchMove
9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kRequiredEventAckTypes); ++i) {
9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const WebInputEvent::Type required_ack_type = kRequiredEventAckTypes[i];
9055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
9065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        GetEventWithType(required_ack_type)));
907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
910f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that GestureShowPress, GestureTapDown and GestureTapCancel events don't
911f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// wait for ACKs.
912a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureTypesIgnoringAckInterleaved) {
913f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Interleave a few events that do and do not ignore acks, ensuring that
914f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // ack-ignoring events aren't dispatched until all prior events which observe
915f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // their ack disposition have been dispatched.
916a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
91846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
919a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
920a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
921a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, client_->in_flight_event_count());
922a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
923a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
92446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
925f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTapDown,
93046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
935a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
93646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
938f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
939f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureShowPress,
94146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
942f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
945a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
94646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTapCancel,
95146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Now ack each ack-respecting event. Ack-ignoring events should not be
9565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // dispatched until all prior events which observe ack disposition have been
9575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // fired, at which point they should be sent immediately.  They should also
9585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // have no effect on the in-flight event count.
959a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount());
9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
964f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
965a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount());
9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
971a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
974f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount());
9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, client_->in_flight_event_count());
976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
977f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
978f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that GestureShowPress events don't get out of order due to
979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// ignoring their acks.
980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureShowPressIsInOrder) {
981a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
98246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
983a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
984a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
985a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
986a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // GesturePinchBegin ignores its ack.
9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
98946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
992f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
993a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // GesturePinchUpdate waits for an ack.
994effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // This also verifies that GesturePinchUpdates for touchscreen are sent
995effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // to the renderer (in contrast to the TrackpadPinchUpdate test).
9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GesturePinchUpdate,
99746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
998f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1000f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureShowPress,
100246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1003f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1004f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The ShowPress, though it ignores ack, is still stuck in the queue
10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // behind the PinchUpdate which requires an ack.
1006f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1007f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1008f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureShowPress,
100946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1010f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1011f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // ShowPress has entered the queue.
1012f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1013f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
10145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GesturePinchUpdate,
10155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1016f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Now that the Tap has been ACKed, the ShowPress events should receive
10175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // synthetic acks, and fire immediately.
1018f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3U, ack_handler_->GetAndResetAckCount());
1020f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1021f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1022010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test that touch ack timeout behavior is properly toggled by view update flags
1023010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// and allowed touch actions.
1024a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchAckTimeoutConfigured) {
1025010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int timeout_ms = 1;
1026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetUpForTouchAckTimeoutTest(timeout_ms);
1027a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(TouchEventTimeoutEnabled());
1028a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1029a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify that the touch ack timeout fires upon the delayed ack.
1030a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1031a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1032a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1033a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1034010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1));
1035a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1036a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The timed-out event should have been ack'ed.
1037a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1038a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1039a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1040a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ack'ing the timed-out event should fire a TouchCancel.
1041a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1042a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1043a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1044a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1045a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The remainder of the touch sequence should be dropped.
1046a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1047a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1048a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1049a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1050a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(TouchEventTimeoutEnabled());
1051a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1052a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // A fixed page scale or mobile viewport should disable the touch timeout.
1053a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  input_router()->OnViewUpdated(InputRouter::FIXED_PAGE_SCALE);
1054a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1055a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1056a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE);
1057a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1058a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1059a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT);
1060a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1061a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1062a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT |
1063a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                InputRouter::FIXED_PAGE_SCALE);
1064a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1065a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1066a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE);
1067a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1068a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TOUCH_ACTION_NONE (and no other touch-action) should disable the timeout.
1070a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHasTouchEventHandlers(true);
1071a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1073a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_PAN_Y);
1074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1080a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1081a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1082a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_NONE);
1083a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1084a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1085a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1086a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1087a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1088a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1089a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // As the touch-action is reset by a new touch sequence, the timeout behavior
1090a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // should be restored.
1091a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1092a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1093a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1094a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1095a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1096a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that a touch sequenced preceded by TOUCH_ACTION_NONE is not affected by
1097a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// the touch timeout.
1098a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest,
1099a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       TouchAckTimeoutDisabledForTouchSequenceAfterTouchActionNone) {
1100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int timeout_ms = 1;
1101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetUpForTouchAckTimeoutTest(timeout_ms);
1102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(TouchEventTimeoutEnabled());
1103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHasTouchEventHandlers(true);
1104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Start a touch sequence.
1106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
11081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TOUCH_ACTION_NONE should disable the timeout.
1111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_NONE);
1112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
11131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MoveTouchPoint(0, 1, 1);
1117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(TouchEventTimeoutEnabled());
1119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Delay the move ack. The timeout should not fire.
1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1));
1123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
11251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // End the touch sequence.
1129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
11321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(TouchEventTimeoutEnabled());
11331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ack_handler_->GetAndResetAckCount();
11341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetSentMessageCountAndResetSink();
1135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Start another touch sequence.  This should restore the touch timeout.
1137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(TouchEventTimeoutEnabled());
1140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
11411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Wait for the touch ack timeout to fire.
1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1));
1145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that TouchActionFilter::ResetTouchAction is called before the
1149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// first touch event for a touch sequence reaches the renderer.
1150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchActionResetBeforeEventReachesRenderer) {
1151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHasTouchEventHandlers(true);
1152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 1.
1154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_NONE);
1157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MoveTouchPoint(0, 50, 50);
1158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 2.
1163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MoveTouchPoint(0, 50, 50);
1166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED);
1172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ensure touch action is still none, as the next touch start hasn't been
1174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // acked yet. ScrollBegin and ScrollEnd don't require acks.
1175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
1176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
117746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
118046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This allows the next touch sequence to start.
1184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ensure touch action has been set to auto, as a new touch sequence has
1187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // started.
1188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED);
1190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
1191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
119246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
119546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that TouchActionFilter::ResetTouchAction is called when a new touch
1201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// sequence has no consumer.
1202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchActionResetWhenTouchHasNoConsumer) {
1203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHasTouchEventHandlers(true);
1204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 1.
1206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MoveTouchPoint(0, 50, 50);
1209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendTouchEvent();
1210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_NONE);
1211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED);
1213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 2
1218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MoveTouchPoint(0, 50, 50);
1221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendTouchEvent();
1222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ReleaseTouchPoint(0);
1223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendTouchEvent();
1224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ensure we have touch-action:none. ScrollBegin and ScrollEnd don't require
1226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // acks.
1227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
1228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
122946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
123246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart,
1237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Ensure touch action has been set to auto, as the touch had no consumer.
1240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
124246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
124546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that TouchActionFilter::ResetTouchAction is called when the touch
1250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// handler is removed.
1251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchActionResetWhenTouchHandlerRemoved) {
1252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Touch sequence with touch handler.
1253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OnHasTouchEventHandlers(true);
1254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PressTouchPoint(1, 1);
1255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendTouchEvent();
1256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MoveTouchPoint(0, 50, 50);
1257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendTouchEvent();
1258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_NONE);
1259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ReleaseTouchPoint(0);
1260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendTouchEvent();
1261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Ensure we have touch-action:none, suppressing scroll events.
1264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchMove,
1267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
127046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd,
1274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
127646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Sequence without a touch handler. Note that in this case, the view may not
1280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // necessarily forward touches to the router (as no touch handler exists).
1281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OnHasTouchEventHandlers(false);
1282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Ensure touch action has been set to auto, as the touch handler has been
1284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // removed.
1285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
128646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
128946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that the double tap gesture depends on the touch action of the first
1294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// tap.
1295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest, DoubleTapGestureDependsOnFirstTap) {
1296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHasTouchEventHandlers(true);
1297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 1.
1299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnSetTouchAction(TOUCH_ACTION_NONE);
1302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
1303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint(0);
1305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequence 2
1308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
1309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchEvent();
1310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // First tap.
1312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTapDown,
131446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The GestureTapUnconfirmed is converted into a tap, as the touch action is
13185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // none.
1319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTapUnconfirmed,
132046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
13215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
13225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // This test will become invalid if GestureTap stops requiring an ack.
13235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
13245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GetEventWithType(WebInputEvent::GestureTap)));
13255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(2, client_->in_flight_event_count());
1326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureTap,
1327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
13285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1, client_->in_flight_event_count());
1329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This tap gesture is dropped, since the GestureTapUnconfirmed was turned
1331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // into a tap.
133246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTap,
133346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart,
1338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Second Tap.
1341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureTapDown,
134346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Although the touch-action is now auto, the double tap still won't be
1347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // dispatched, because the first tap occured when the touch-action was none.
1348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureDoubleTap,
134946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This test will become invalid if GestureDoubleTap stops requiring an ack.
13515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition(
13525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GetEventWithType(WebInputEvent::GestureDoubleTap)));
13535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1, client_->in_flight_event_count());
13545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendInputEventACK(WebInputEvent::GestureTap, INPUT_EVENT_ACK_STATE_CONSUMED);
1355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, client_->in_flight_event_count());
1356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1358c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Test that the router will call the client's |DidFlush| after all events have
1359c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// been dispatched following a call to |Flush|.
1360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(InputRouterImplTest, InputFlush) {
1361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(HasPendingEvents());
1362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Flushing an empty router should immediately trigger DidFlush.
1364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Flush();
1365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1U, GetAndResetDidFlushCount());
1366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(HasPendingEvents());
1367c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1368c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Queue a TouchStart.
1369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  OnHasTouchEventHandlers(true);
1370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PressTouchPoint(1, 1);
1371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchEvent();
1372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(HasPendingEvents());
1373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // DidFlush should be called only after the event is ack'ed.
1375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Flush();
1376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0U, GetAndResetDidFlushCount());
1377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendInputEventACK(WebInputEvent::TouchStart,
1378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1U, GetAndResetDidFlushCount());
1380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Ensure different types of enqueued events will prevent the DidFlush call
1382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // until all such events have been fully dispatched.
1383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  MoveTouchPoint(0, 50, 50);
1384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchEvent();
1385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(HasPendingEvents());
1386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
138746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
138946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
13905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
139146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
13925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SimulateGestureEvent(WebInputEvent::GesturePinchUpdate,
139346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchscreen);
1394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Flush();
1395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0U, GetAndResetDidFlushCount());
1396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Repeated flush calls should have no effect.
1398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Flush();
1399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0U, GetAndResetDidFlushCount());
1400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // There are still pending gestures.
1402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendInputEventACK(WebInputEvent::TouchMove,
1403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0U, GetAndResetDidFlushCount());
1405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(HasPendingEvents());
1406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // One more gesture to go.
14085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
1409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
1410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0U, GetAndResetDidFlushCount());
1411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(HasPendingEvents());
1412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The final ack'ed gesture should trigger the DidFlush.
14145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendInputEventACK(WebInputEvent::GesturePinchUpdate,
1415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
1416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1U, GetAndResetDidFlushCount());
1417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(HasPendingEvents());
1418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Test that GesturePinchUpdate is handled specially for trackpad
1421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(InputRouterImplTest, TouchpadPinchUpdate) {
1422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // GesturePinchUpdate for trackpad sends synthetic wheel events.
1423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Note that the Touchscreen case is verified as NOT doing this as
1424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // part of the ShowPressIsInOrder test.
1425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
142646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SimulateGesturePinchUpdateEvent(
142746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      1.5f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Verify we actually sent a special wheel event to the renderer.
1430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const WebInputEvent* input_event =
1431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const WebMouseWheelEvent* wheel_event =
1434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<const WebMouseWheelEvent*>(input_event);
1435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(20, wheel_event->x);
1436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(25, wheel_event->y);
1437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(20, wheel_event->globalX);
1438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(25, wheel_event->globalY);
1439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(20, wheel_event->windowX);
1440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(25, wheel_event->windowY);
1441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(PinchScaleToWheelDelta(1.5), wheel_event->deltaY);
1442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, wheel_event->deltaX);
1443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, wheel_event->hasPreciseScrollingDeltas);
1444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, wheel_event->wheelTicksY);
1445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, wheel_event->wheelTicksX);
1446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Indicate that the wheel event was unhandled.
1449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
1450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check that the correct unhandled pinch event was received.
1453effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1455effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state());
1456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1.5f, ack_handler_->acked_gesture_event().data.pinchUpdate.scale);
1457effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0, client_->in_flight_event_count());
1458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Second a second pinch event.
146046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SimulateGesturePinchUpdateEvent(
146146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      0.3f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
1465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(0.3f), wheel_event->deltaY);
1466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, wheel_event->hasPreciseScrollingDeltas);
1467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(-1, wheel_event->wheelTicksY);
1468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Indicate that the wheel event was handled this time.
1471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED);
1472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check that the correct HANDLED pinch event was received.
1474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, ack_handler_->ack_state());
1477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FLOAT_EQ(0.3f,
1478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  ack_handler_->acked_gesture_event().data.pinchUpdate.scale);
1479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test that touchpad pinch events are coalesced property, with their synthetic
1482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// wheel events getting the right ACKs.
1483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(InputRouterImplTest, TouchpadPinchCoalescing) {
1484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Send the first pinch.
148546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SimulateGesturePinchUpdateEvent(
148646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      1.5f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Verify we sent the wheel event to the renderer.
1489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const WebInputEvent* input_event =
1490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const WebMouseWheelEvent* wheel_event =
1493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<const WebMouseWheelEvent*>(input_event);
1494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(PinchScaleToWheelDelta(1.5f), wheel_event->deltaY);
1495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
1498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Send a second pinch, this should be queued in the GestureEventQueue.
150046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SimulateGesturePinchUpdateEvent(
150146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      1.6f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Send a third pinch, this should be coalesced into the second in the
1506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // GestureEventQueue.
150746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SimulateGesturePinchUpdateEvent(
150846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      1.7f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Indicate that the first wheel event was unhandled and verify the ACK.
1513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
1514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state());
1518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1.5f, ack_handler_->acked_gesture_event().data.pinchUpdate.scale);
1519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Verify a second wheel event was sent representing the 2nd and 3rd pinch
1521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // events.
1522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
1523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
1526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.6f * 1.7f),
1527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  PinchScaleToWheelDelta(1.6f) + PinchScaleToWheelDelta(1.7f));
1528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.6f * 1.7f), wheel_event->deltaY);
1529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Indicate that the second wheel event was handled and verify the ACK.
1533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED);
1534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, ack_handler_->ack_state());
1537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FLOAT_EQ(1.6f * 1.7f,
1538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  ack_handler_->acked_gesture_event().data.pinchUpdate.scale);
1539effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1540effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test interleaving pinch and wheel events.
1542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(InputRouterImplTest, TouchpadPinchAndWheel) {
1543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Simulate queued wheel and pinch events events.
1544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Note that in practice interleaving pinch and wheel events should be rare
1545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // (eg. requires the use of a mouse and trackpad at the same time).
1546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Use the control modifier to match the synthetic wheel events so that
1548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // they're elligble for coalescing.
1549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int mod = WebInputEvent::ControlKey;
1550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Event 1: sent directly.
1552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SimulateWheelEvent(0, -5, mod, true);
1553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Event 2: enqueued in InputRouter.
1556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SimulateWheelEvent(0, -10, mod, true);
1557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Event 3: enqueued in InputRouter, not coalesced into #2.
156046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SimulateGesturePinchUpdateEvent(
156146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      1.5f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Event 4: enqueued in GestureEventQueue.
156546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SimulateGesturePinchUpdateEvent(
156646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      1.2f, 20, 25, 0, blink::WebGestureDeviceTouchpad);
1567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Event 5: coalesced into wheel event for #3.
1570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SimulateWheelEvent(2, 0, mod, true);
1571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Send ack for #1.
1574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
1575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(WebInputEvent::MouseWheel, ack_handler_->ack_event_type());
1578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Verify we sent #2.
1580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(1U, process_->sink().message_count());
1581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const WebInputEvent* input_event =
1582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const WebMouseWheelEvent* wheel_event =
1585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<const WebMouseWheelEvent*>(input_event);
1586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, wheel_event->deltaX);
1587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(-10, wheel_event->deltaY);
1588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(mod, wheel_event->modifiers);
1589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Send ack for #2.
1592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
1593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(WebInputEvent::MouseWheel, ack_handler_->ack_event_type());
1596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Verify we sent #3 (with #5 coalesced in).
1598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(1U, process_->sink().message_count());
1599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
1602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(2, wheel_event->deltaX);
1603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(PinchScaleToWheelDelta(1.5f), wheel_event->deltaY);
1604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(mod, wheel_event->modifiers);
1605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Send ack for #3.
1608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
1609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Verify we sent #4.
1614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(1U, process_->sink().message_count());
1615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type);
1617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  wheel_event = static_cast<const WebMouseWheelEvent*>(input_event);
1618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, wheel_event->deltaX);
1619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.2f), wheel_event->deltaY);
1620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(mod, wheel_event->modifiers);
1621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Send ack for #4.
1624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
1625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type());
1628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test proper handling of touchpad Gesture{Pinch,Scroll}Update sequences.
1631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(InputRouterImplTest, TouchpadPinchAndScrollUpdate) {
1632e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // The first scroll should be sent immediately.
1633e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
163446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchpad);
1635e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
1636e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(1, client_->in_flight_event_count());
1637e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1638e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Subsequent scroll and pinch events should remain queued, coalescing as
1639e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // more trackpad events arrive.
1640e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SimulateGestureEvent(WebInputEvent::GesturePinchUpdate,
164146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchpad);
1642e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1643e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(1, client_->in_flight_event_count());
1644e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1645e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
164646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchpad);
1647e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1648e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(1, client_->in_flight_event_count());
1649e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1650e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SimulateGestureEvent(WebInputEvent::GesturePinchUpdate,
165146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchpad);
1652e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1653e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(1, client_->in_flight_event_count());
1654e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1655e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
165646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       blink::WebGestureDeviceTouchpad);
1657e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
1658e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(1, client_->in_flight_event_count());
1659e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1660e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Ack'ing the first scroll should trigger both the coalesced scroll and the
1661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // coalesced pinch events (which is sent to the renderer as a wheel event).
1662e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
1663e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
1664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
1666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(2, client_->in_flight_event_count());
1667e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1668e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Ack the second scroll.
1669e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
1670e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
1671e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1672e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1673010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, client_->in_flight_event_count());
1674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Ack the wheel event.
1676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED);
1677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1679e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(0, client_->in_flight_event_count());
1680e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
1681e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test proper routing of overscroll notifications received either from
1683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// event acks or from |DidOverscroll| IPC messages.
1684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(InputRouterImplTest, OverscrollDispatch) {
1685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DidOverscrollParams overscroll;
1686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  overscroll.accumulated_overscroll = gfx::Vector2dF(-14, 14);
1687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  overscroll.latest_overscroll_delta = gfx::Vector2dF(-7, 0);
1688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  overscroll.current_fling_velocity = gfx::Vector2dF(-1, 0);
1689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  input_router_->OnMessageReceived(InputHostMsg_DidOverscroll(0, overscroll));
1691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DidOverscrollParams client_overscroll = client_->GetAndResetOverscroll();
1692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(overscroll.accumulated_overscroll,
1693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            client_overscroll.accumulated_overscroll);
1694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(overscroll.latest_overscroll_delta,
1695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            client_overscroll.latest_overscroll_delta);
1696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(overscroll.current_fling_velocity,
1697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            client_overscroll.current_fling_velocity);
1698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1699cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DidOverscrollParams wheel_overscroll;
1700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  wheel_overscroll.accumulated_overscroll = gfx::Vector2dF(7, -7);
1701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  wheel_overscroll.latest_overscroll_delta = gfx::Vector2dF(3, 0);
1702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  wheel_overscroll.current_fling_velocity = gfx::Vector2dF(1, 0);
1703cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateWheelEvent(3, 0, 0, false);
1705cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InputHostMsg_HandleInputEvent_ACK_Params ack;
1706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ack.type = WebInputEvent::MouseWheel;
1707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ack.state = INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
1708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ack.overscroll.reset(new DidOverscrollParams(wheel_overscroll));
1709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  input_router_->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack));
1710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  client_overscroll = client_->GetAndResetOverscroll();
1712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(wheel_overscroll.accumulated_overscroll,
1713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            client_overscroll.accumulated_overscroll);
1714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(wheel_overscroll.latest_overscroll_delta,
1715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            client_overscroll.latest_overscroll_delta);
1716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(wheel_overscroll.current_fling_velocity,
1717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            client_overscroll.current_fling_velocity);
1718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1720558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace content
1721