1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file.
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <vector>
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/basictypes.h"
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/memory/scoped_ptr.h"
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/message_loop/message_loop.h"
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/time/time.h"
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/renderer_host/input/touch_emulator.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/renderer_host/input/touch_emulator_client.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/common/input/web_input_event_traits.h"
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/events/gesture_detection/gesture_config_helper.h"
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/aura/env.h"
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/aura/test/test_screen.h"
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebGestureEvent;
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebInputEvent;
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebKeyboardEvent;
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebMouseEvent;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using blink::WebMouseWheelEvent;
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebTouchEvent;
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebTouchPoint;
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace content {
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass TouchEmulatorTest : public testing::Test,
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          public TouchEmulatorClient {
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public:
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  TouchEmulatorTest()
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      : shift_pressed_(false),
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        mouse_pressed_(false),
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        ack_touches_synchronously_(true),
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        last_mouse_x_(-1),
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        last_mouse_y_(-1) {
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    last_event_time_seconds_ =
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    event_time_delta_seconds_ = 0.1;
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual ~TouchEmulatorTest() {}
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // testing::Test
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetUp() OVERRIDE {
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    aura::Env::CreateInstance(true);
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    screen_.reset(aura::TestScreen::Create(gfx::Size()));
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_.get());
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    emulator_.reset(new TouchEmulator(this));
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    emulator_->Enable();
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void TearDown() OVERRIDE {
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    emulator_->Disable();
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ("", ExpectedEvents());
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    aura::Env::DeleteInstance();
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    screen_.reset();
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void ForwardGestureEvent(
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const blink::WebGestureEvent& event) OVERRIDE {
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    forwarded_events_.push_back(event.type);
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void ForwardEmulatedTouchEvent(
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const blink::WebTouchEvent& event) OVERRIDE {
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    forwarded_events_.push_back(event.type);
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(1U, event.touchesLength);
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(last_mouse_x_, event.touches[0].position.x);
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(last_mouse_y_, event.touches[0].position.y);
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int expectedCancelable = event.type != WebInputEvent::TouchCancel;
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(expectedCancelable, event.cancelable);
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (ack_touches_synchronously_) {
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      emulator()->HandleTouchEventAck(
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          event, INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetCursor(const WebCursor& cursor) OVERRIDE {}
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void ShowContextMenuAtPoint(const gfx::Point& point) OVERRIDE {}
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch protected:
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  TouchEmulator* emulator() const {
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return emulator_.get();
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int modifiers() const {
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return shift_pressed_ ? WebInputEvent::ShiftKey : 0;
100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string ExpectedEvents() {
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string result;
104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t i = 0; i < forwarded_events_.size(); ++i) {
105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (i != 0)
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        result += " ";
107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      result += WebInputEventTraits::GetName(forwarded_events_[i]);
108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    forwarded_events_.clear();
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return result;
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double GetNextEventTimeSeconds() {
114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    last_event_time_seconds_ += event_time_delta_seconds_;
115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return last_event_time_seconds_;
116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void set_event_time_delta_seconds_(double delta) {
119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    event_time_delta_seconds_ = delta;
120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void SendKeyboardEvent(WebInputEvent::Type type) {
123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    WebKeyboardEvent event;
124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    event.timeStampSeconds = GetNextEventTimeSeconds();
125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    event.type = type;
126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    event.modifiers = modifiers();
127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    emulator()->HandleKeyboardEvent(event);
128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void PressShift() {
131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    DCHECK(!shift_pressed_);
132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    shift_pressed_ = true;
133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SendKeyboardEvent(WebInputEvent::KeyDown);
134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void ReleaseShift() {
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    DCHECK(shift_pressed_);
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    shift_pressed_ = false;
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SendKeyboardEvent(WebInputEvent::KeyUp);
140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void SendMouseEvent(WebInputEvent::Type type, int  x, int y) {
143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    WebMouseEvent event;
144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    event.timeStampSeconds = GetNextEventTimeSeconds();
145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    event.type = type;
146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    event.button = mouse_pressed_ ? WebMouseEvent::ButtonLeft :
147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        WebMouseEvent::ButtonNone;
148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    event.modifiers = modifiers();
149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    last_mouse_x_ = x;
150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    last_mouse_y_ = y;
151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    event.x = event.windowX = event.globalX = x;
152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    event.y = event.windowY = event.globalY = y;
153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    emulator()->HandleMouseEvent(event);
154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool SendMouseWheelEvent() {
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WebMouseWheelEvent event;
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    event.type = WebInputEvent::MouseWheel;
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    event.timeStampSeconds = GetNextEventTimeSeconds();
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Return whether mouse wheel is forwarded.
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return !emulator()->HandleMouseWheelEvent(event);
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void MouseDown(int x, int y) {
165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    DCHECK(!mouse_pressed_);
166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (x != last_mouse_x_ || y != last_mouse_y_)
167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      SendMouseEvent(WebInputEvent::MouseMove, x, y);
168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    mouse_pressed_ = true;
169a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SendMouseEvent(WebInputEvent::MouseDown, x, y);
170a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
171a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void MouseDrag(int x, int y) {
173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    DCHECK(mouse_pressed_);
174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SendMouseEvent(WebInputEvent::MouseMove, x, y);
175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void MouseMove(int x, int y) {
178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    DCHECK(!mouse_pressed_);
179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SendMouseEvent(WebInputEvent::MouseMove, x, y);
180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void MouseUp(int x, int y) {
183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    DCHECK(mouse_pressed_);
184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (x != last_mouse_x_ || y != last_mouse_y_)
185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      SendMouseEvent(WebInputEvent::MouseMove, x, y);
186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SendMouseEvent(WebInputEvent::MouseUp, x, y);
187a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    mouse_pressed_ = false;
188a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
189a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool TouchStart(int x, int  y, bool ack) {
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return SendTouchEvent(
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        WebInputEvent::TouchStart, WebTouchPoint::StatePressed, x, y, ack);
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool TouchMove(int x, int  y, bool ack) {
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return SendTouchEvent(
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        WebInputEvent::TouchMove, WebTouchPoint::StateMoved, x, y, ack);
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool TouchEnd(int x, int  y, bool ack) {
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return SendTouchEvent(
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        WebInputEvent::TouchEnd, WebTouchPoint::StateReleased, x, y, ack);
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  WebTouchEvent MakeTouchEvent(WebInputEvent::Type type,
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      WebTouchPoint::State state, int x, int y) {
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    WebTouchEvent event;
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    event.type = type;
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    event.timeStampSeconds = GetNextEventTimeSeconds();
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    event.touchesLength = 1;
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    event.touches[0].id = 0;
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    event.touches[0].state = state;
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    event.touches[0].position.x = x;
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    event.touches[0].position.y = y;
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    event.touches[0].screenPosition.x = x;
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    event.touches[0].screenPosition.y = y;
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return event;
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool SendTouchEvent(WebInputEvent::Type type, WebTouchPoint::State state,
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      int x, int y, bool ack) {
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    WebTouchEvent event = MakeTouchEvent(type, state, x, y);
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (emulator()->HandleTouchEvent(event)) {
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // Touch event is not forwarded.
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return false;
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (ack) {
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // Can't send ack if there are some pending acks.
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      DCHECK(!touch_events_to_ack_.size());
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // Touch event is forwarded, ack should not be handled by emulator.
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_FALSE(emulator()->HandleTouchEventAck(
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          event, INPUT_EVENT_ACK_STATE_CONSUMED));
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else {
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      touch_events_to_ack_.push_back(event);
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return true;
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void AckOldestTouchEvent() {
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DCHECK(touch_events_to_ack_.size());
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    WebTouchEvent event = touch_events_to_ack_[0];
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    touch_events_to_ack_.erase(touch_events_to_ack_.begin());
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Emulator should not handle ack from native stream.
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_FALSE(emulator()->HandleTouchEventAck(
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 event, INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS));
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void DisableSynchronousTouchAck() { ack_touches_synchronously_ = false; }
25103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private:
253a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<TouchEmulator> emulator_;
254a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::vector<WebInputEvent::Type> forwarded_events_;
255a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
256a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<gfx::Screen> screen_;
257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
258a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double last_event_time_seconds_;
259a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double event_time_delta_seconds_;
260a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool shift_pressed_;
261a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool mouse_pressed_;
26203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool ack_touches_synchronously_;
263a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int last_mouse_x_;
264a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int last_mouse_y_;
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<WebTouchEvent> touch_events_to_ack_;
266a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::MessageLoopForUI message_loop_;
267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
269a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
270a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, NoTouches) {
271a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseMove(100, 200);
272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseMove(300, 300);
273a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("", ExpectedEvents());
274a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
275a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
276a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, Touch) {
277a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseMove(100, 200);
278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("", ExpectedEvents());
279a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDown(100, 200);
280a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
281a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseUp(200, 200);
282a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(
283a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate"
284a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      " TouchEnd GestureScrollEnd",
285a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ExpectedEvents());
286a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
287a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
288a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, MultipleTouches) {
289a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseMove(100, 200);
290a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("", ExpectedEvents());
291a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDown(100, 200);
292a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
293a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseUp(200, 200);
294a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(
295a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate"
296a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      " TouchEnd GestureScrollEnd",
297a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ExpectedEvents());
298a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseMove(300, 200);
299a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseMove(200, 200);
300a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("", ExpectedEvents());
301a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDown(300, 200);
302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
303a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(300, 300);
304a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(
305a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate",
306a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ExpectedEvents());
307a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(300, 400);
308a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchMove GestureScrollUpdate", ExpectedEvents());
309a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseUp(300, 500);
310a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(
311a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "TouchMove GestureScrollUpdate TouchEnd GestureScrollEnd",
312a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ExpectedEvents());
313a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
314a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
315a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, Pinch) {
316a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDown(100, 200);
317a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
318a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(200, 200);
319a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(
320a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate",
321a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ExpectedEvents());
322a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  PressShift();
323a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("", ExpectedEvents());
324a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(300, 200);
325a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchMove GesturePinchBegin", ExpectedEvents());
326a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ReleaseShift();
327a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("", ExpectedEvents());
328a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(400, 200);
329a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(
330a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "TouchMove GesturePinchEnd GestureScrollUpdate",
331a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ExpectedEvents());
332a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseUp(400, 200);
333a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchEnd GestureScrollEnd", ExpectedEvents());
334a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
335a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
33603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(TouchEmulatorTest, CancelWithDelayedAck) {
33703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DisableSynchronousTouchAck();
33803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
33903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Simulate a sequence that is interrupted by |CancelTouch()|.
34003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  MouseDown(100, 200);
34103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("TouchStart", ExpectedEvents());
34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  MouseDrag(200, 200);
34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("TouchMove", ExpectedEvents());
34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  emulator()->CancelTouch();
34503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("TouchCancel", ExpectedEvents());
34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // The mouse up should have no effect as the sequence was already cancelled.
34703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  MouseUp(400, 200);
34803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
34903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
35003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Simulate a sequence that fully completes before |CancelTouch()|.
35103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  MouseDown(100, 200);
35203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("TouchStart", ExpectedEvents());
35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  MouseUp(100, 200);
35403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("TouchEnd", ExpectedEvents());
35503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // |CancelTouch| should have no effect as the sequence was already terminated.
35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  emulator()->CancelTouch();
35703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
35803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
35903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
360a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, DisableAndReenable) {
361a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDown(100, 200);
362a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
363a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(200, 200);
364a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(
365a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate",
366a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ExpectedEvents());
367a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  PressShift();
368a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(300, 200);
369a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchMove GesturePinchBegin", ExpectedEvents());
370a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
371a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Disable while pinch is in progress.
372a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  emulator()->Disable();
373a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchCancel GesturePinchEnd GestureScrollEnd", ExpectedEvents());
374a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseUp(300, 200);
375a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ReleaseShift();
376a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseMove(300, 300);
377a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("", ExpectedEvents());
378a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
37903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  emulator()->Enable();
380a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDown(300, 300);
381a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
382a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(300, 400);
383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(
384a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate",
385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ExpectedEvents());
386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
387a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Disable while scroll is in progress.
388a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  emulator()->Disable();
389a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchCancel GestureScrollEnd", ExpectedEvents());
390a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
391a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
392a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, MouseMovesDropped) {
393a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseMove(100, 200);
394a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("", ExpectedEvents());
395a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDown(100, 200);
396a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
397a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
398a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Mouse move after mouse down is never dropped.
399a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  set_event_time_delta_seconds_(0.001);
400a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(200, 200);
401a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(
402a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate",
403a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ExpectedEvents());
404a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
405a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // The following mouse moves are dropped.
406a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(300, 200);
407a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("", ExpectedEvents());
408a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(350, 200);
409a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("", ExpectedEvents());
410a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
411a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Dispatching again.
412a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  set_event_time_delta_seconds_(0.1);
413a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseDrag(400, 200);
414a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(
415a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "TouchMove GestureScrollUpdate",
416a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ExpectedEvents());
417a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MouseUp(400, 200);
418a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(
419a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "TouchEnd GestureScrollEnd",
420a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ExpectedEvents());
421a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
422a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(TouchEmulatorTest, MouseWheel) {
424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MouseMove(100, 200);
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(SendMouseWheelEvent());
427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MouseDown(100, 200);
428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(SendMouseWheelEvent());
430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MouseUp(100, 200);
431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("TouchEnd GestureShowPress GestureTap", ExpectedEvents());
432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(SendMouseWheelEvent());
433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MouseDown(300, 200);
434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(SendMouseWheelEvent());
436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  emulator()->Disable();
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("TouchCancel GestureTapCancel", ExpectedEvents());
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(SendMouseWheelEvent());
43903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  emulator()->Enable();
440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(SendMouseWheelEvent());
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(TouchEmulatorTest, MultipleTouchStreams) {
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Native stream should be blocked while emulated is active.
4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseMove(100, 200);
4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseDown(100, 200);
4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(TouchStart(10, 10, true));
4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(TouchMove(20, 20, true));
4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseUp(200, 200);
4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(
4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate"
4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      " TouchEnd GestureScrollEnd",
4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ExpectedEvents());
4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(TouchEnd(20, 20, true));
4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Emulated stream should be blocked while native is active.
4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(TouchStart(10, 10, true));
4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(TouchMove(20, 20, true));
4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseDown(300, 200);
4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Re-enabling in the middle of a touch sequence should not affect this.
4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  emulator()->Disable();
46503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  emulator()->Enable();
4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseDrag(300, 300);
4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseUp(300, 300);
4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(TouchEnd(20, 20, true));
4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Late ack for TouchEnd should not mess things up.
4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(TouchStart(10, 10, false));
4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(TouchMove(20, 20, false));
4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  emulator()->Disable();
4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(TouchEnd(20, 20, false));
4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(TouchStart(30, 30, false));
4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AckOldestTouchEvent(); // TouchStart.
48003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  emulator()->Enable();
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AckOldestTouchEvent(); // TouchMove.
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AckOldestTouchEvent(); // TouchEnd.
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseDown(300, 200);
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseDrag(300, 300);
4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseUp(300, 300);
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AckOldestTouchEvent(); // TouchStart.
4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseDown(300, 200);
4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(TouchMove(30, 40, true));
4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(TouchEnd(30, 40, true));
4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseUp(300, 200);
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("", ExpectedEvents());
4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Emulation should be back to normal.
4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseDown(100, 200);
4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseUp(200, 200);
5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(
5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate"
5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      " TouchEnd GestureScrollEnd",
5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ExpectedEvents());
5055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(TouchEmulatorTest, MultipleTouchStreamsLateEnable) {
5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Enabling in the middle of native touch sequence should be handled.
5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Send artificial late TouchEnd ack, like it is the first thing emulator
5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // does see.
5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  WebTouchEvent event = MakeTouchEvent(
5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      WebInputEvent::TouchEnd, WebTouchPoint::StateReleased, 10, 10);
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(emulator()->HandleTouchEventAck(
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      event, INPUT_EVENT_ACK_STATE_CONSUMED));
5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseDown(100, 200);
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MouseUp(200, 200);
5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(
5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate"
5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      " TouchEnd GestureScrollEnd",
5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ExpectedEvents());
5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
525a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace content
526