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 "content/browser/renderer_host/input/touch_emulator.h"
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/renderer_host/input/motion_event_web.h"
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/renderer_host/input/web_input_event_util.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/common/input/web_touch_event_traits.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/grit/content_resources.h"
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/public/common/content_client.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/public/common/content_switches.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "third_party/WebKit/public/platform/WebCursorInfo.h"
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/events/gesture_detection/gesture_config_helper.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/gfx/image/image.h"
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/gfx/screen.h"
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebGestureEvent;
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebInputEvent;
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebKeyboardEvent;
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebMouseEvent;
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebMouseWheelEvent;
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebTouchEvent;
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebTouchPoint;
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace content {
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace {
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochui::GestureProvider::Config GetGestureProviderConfig() {
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // TODO(dgozman): Use different configs to emulate mobile/desktop as
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // requested by renderer.
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ui::GestureProvider::Config config = ui::DefaultGestureProviderConfig();
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config.gesture_begin_end_types_enabled = false;
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  config.gesture_detector_config.swipe_enabled = false;
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  config.gesture_detector_config.two_finger_tap_enabled = false;
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return config;
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Time between two consecutive mouse moves, during which second mouse move
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// is not converted to touch.
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst double kMouseMoveDropIntervalSeconds = 5.f / 1000;
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} // namespace
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
46a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTouchEmulator::TouchEmulator(TouchEmulatorClient* client)
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : client_(client),
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture_provider_(GetGestureProviderConfig(), this),
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      enabled_(false),
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      emulated_stream_active_sequence_count_(0),
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      native_stream_active_sequence_count_(0) {
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK(client_);
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ResetState();
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool use_2x = gfx::Screen::GetNativeScreen()->
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      GetPrimaryDisplay().device_scale_factor() > 1.5f;
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  float cursor_scale_factor = use_2x ? 2.f : 1.f;
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  cursor_size_ = InitCursorFromResource(&touch_cursor_,
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      cursor_scale_factor,
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      use_2x ? IDR_DEVTOOLS_TOUCH_CURSOR_ICON_2X :
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          IDR_DEVTOOLS_TOUCH_CURSOR_ICON);
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  InitCursorFromResource(&pinch_cursor_,
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      cursor_scale_factor,
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      use_2x ? IDR_DEVTOOLS_PINCH_CURSOR_ICON_2X :
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          IDR_DEVTOOLS_PINCH_CURSOR_ICON);
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  WebCursor::CursorInfo cursor_info;
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cursor_info.type = blink::WebCursorInfo::TypePointer;
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pointer_cursor_.InitFromCursorInfo(cursor_info);
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // TODO(dgozman): Use synthetic secondary touch to support multi-touch.
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gesture_provider_.SetMultiTouchZoomSupportEnabled(false);
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // TODO(dgozman): Enable double tap if requested by the renderer.
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // TODO(dgozman): Don't break double-tap-based pinch with shift handling.
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  gesture_provider_.SetDoubleTapSupportForPlatformEnabled(false);
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
78a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTouchEmulator::~TouchEmulator() {
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // We cannot cleanup properly in destructor, as we need roundtrip to the
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // renderer for ack. Instead, the owner should call Disable, and only
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // destroy this object when renderer is dead.
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TouchEmulator::ResetState() {
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  last_mouse_event_was_move_ = false;
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  last_mouse_move_timestamp_ = 0;
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  mouse_pressed_ = false;
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  shift_pressed_ = false;
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  suppress_next_fling_cancel_ = false;
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_scale_ = 1.f;
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_gesture_active_ = false;
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void TouchEmulator::Enable() {
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!enabled_) {
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    enabled_ = true;
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ResetState();
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  UpdateCursor();
100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TouchEmulator::Disable() {
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!enabled_)
104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  enabled_ = false;
107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  UpdateCursor();
108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  CancelTouch();
109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::SizeF TouchEmulator::InitCursorFromResource(
1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    WebCursor* cursor, float scale, int resource_id) {
113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  gfx::Image& cursor_image =
114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      content::GetContentClient()->GetNativeImageNamed(resource_id);
115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  WebCursor::CursorInfo cursor_info;
116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cursor_info.type = blink::WebCursorInfo::TypeCustom;
1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  cursor_info.image_scale_factor = scale;
118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cursor_info.custom_image = cursor_image.AsBitmap();
119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cursor_info.hotspot =
120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gfx::Point(cursor_image.Width() / 2, cursor_image.Height() / 2);
121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN)
122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cursor_info.external_handle = 0;
123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cursor->InitFromCursorInfo(cursor_info);
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return gfx::ScaleSize(cursor_image.Size(), 1.f / scale);
127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool TouchEmulator::HandleMouseEvent(const WebMouseEvent& mouse_event) {
130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!enabled_)
131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return false;
132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (mouse_event.button == WebMouseEvent::ButtonRight &&
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      mouse_event.type == WebInputEvent::MouseDown) {
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    client_->ShowContextMenuAtPoint(gfx::Point(mouse_event.x, mouse_event.y));
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (mouse_event.button != WebMouseEvent::ButtonLeft)
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return true;
140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (mouse_event.type == WebInputEvent::MouseMove) {
142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (last_mouse_event_was_move_ &&
143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        mouse_event.timeStampSeconds < last_mouse_move_timestamp_ +
144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            kMouseMoveDropIntervalSeconds)
145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return true;
146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    last_mouse_event_was_move_ = true;
148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    last_mouse_move_timestamp_ = mouse_event.timeStampSeconds;
149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  } else {
150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    last_mouse_event_was_move_ = false;
151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (mouse_event.type == WebInputEvent::MouseDown)
154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    mouse_pressed_ = true;
155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  else if (mouse_event.type == WebInputEvent::MouseUp)
156a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    mouse_pressed_ = false;
157a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
158a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  UpdateShiftPressed((mouse_event.modifiers & WebInputEvent::ShiftKey) != 0);
159a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
160a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (FillTouchEventAndPoint(mouse_event) &&
161a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture_provider_.OnTouchEvent(MotionEventWeb(touch_event_))) {
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ForwardTouchEventToClient();
163a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Do not pass mouse events to the renderer.
166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return true;
167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
169a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool TouchEmulator::HandleMouseWheelEvent(const WebMouseWheelEvent& event) {
170a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!enabled_)
171a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return false;
172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Send mouse wheel for easy scrolling when there is no active touch.
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return emulated_stream_active_sequence_count_ > 0;
175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool TouchEmulator::HandleKeyboardEvent(const WebKeyboardEvent& event) {
178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!enabled_)
179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return false;
180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!UpdateShiftPressed((event.modifiers & WebInputEvent::ShiftKey) != 0))
182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return false;
183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!mouse_pressed_)
185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return false;
186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
187a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Note: The necessary pinch events will be lazily inserted by
188a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // |OnGestureEvent| depending on the state of |shift_pressed_|, using the
189a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // scroll stream as the event driver.
190a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (shift_pressed_) {
191a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // TODO(dgozman): Add secondary touch point and set anchor.
192a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  } else {
193a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // TODO(dgozman): Remove secondary touch point and anchor.
194a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
195a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
196a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Never block keyboard events.
197a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return false;
198a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
199a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool TouchEmulator::HandleTouchEvent(const blink::WebTouchEvent& event) {
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Block native event when emulated touch stream is active.
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (emulated_stream_active_sequence_count_)
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return true;
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool is_sequence_start = WebTouchEventTraits::IsTouchSequenceStart(event);
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Do not allow middle-sequence event to pass through, if start was blocked.
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!native_stream_active_sequence_count_ && !is_sequence_start)
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return true;
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (is_sequence_start)
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    native_stream_active_sequence_count_++;
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return false;
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void TouchEmulator::ForwardTouchEventToClient() {
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const bool event_consumed = true;
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Block emulated event when emulated native stream is active.
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (native_stream_active_sequence_count_) {
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gesture_provider_.OnTouchEventAck(event_consumed);
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool is_sequence_start =
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      WebTouchEventTraits::IsTouchSequenceStart(touch_event_);
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Do not allow middle-sequence event to pass through, if start was blocked.
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!emulated_stream_active_sequence_count_ && !is_sequence_start) {
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gesture_provider_.OnTouchEventAck(event_consumed);
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (is_sequence_start)
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    emulated_stream_active_sequence_count_++;
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  client_->ForwardEmulatedTouchEvent(touch_event_);
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool TouchEmulator::HandleTouchEventAck(
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const blink::WebTouchEvent& event, InputEventAckState ack_result) {
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool is_sequence_end = WebTouchEventTraits::IsTouchSequenceEnd(event);
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (emulated_stream_active_sequence_count_) {
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (is_sequence_end)
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      emulated_stream_active_sequence_count_--;
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const bool event_consumed = ack_result == INPUT_EVENT_ACK_STATE_CONSUMED;
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gesture_provider_.OnTouchEventAck(event_consumed);
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return true;
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // We may have not seen native touch sequence start (when created in the
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // middle of a sequence), so don't decrement sequence count below zero.
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (is_sequence_end && native_stream_active_sequence_count_)
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    native_stream_active_sequence_count_--;
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return false;
253a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
254a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
255a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TouchEmulator::OnGestureEvent(const ui::GestureEventData& gesture) {
256a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  WebGestureEvent gesture_event =
257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      CreateWebGestureEventFromGestureEventData(gesture);
258a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
259a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  switch (gesture_event.type) {
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case WebInputEvent::Undefined:
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NOTREACHED() << "Undefined WebInputEvent type";
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // Bail without sending the junk event to the client.
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
265a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case WebInputEvent::GestureScrollBegin:
266a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      client_->ForwardGestureEvent(gesture_event);
267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      // PinchBegin must always follow ScrollBegin.
268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (InPinchGestureMode())
269a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        PinchBegin(gesture_event);
270a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      break;
271a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case WebInputEvent::GestureScrollUpdate:
273a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (InPinchGestureMode()) {
274a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        // Convert scrolls to pinches while shift is pressed.
275a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        if (!pinch_gesture_active_)
276a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          PinchBegin(gesture_event);
277a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        else
278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          PinchUpdate(gesture_event);
279a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      } else {
280a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        // Pass scroll update further. If shift was released, end the pinch.
281a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        if (pinch_gesture_active_)
282a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          PinchEnd(gesture_event);
283a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        client_->ForwardGestureEvent(gesture_event);
284a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      }
285a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      break;
286a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
287a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case WebInputEvent::GestureScrollEnd:
288a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      // PinchEnd must precede ScrollEnd.
289a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (pinch_gesture_active_)
290a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        PinchEnd(gesture_event);
291a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      client_->ForwardGestureEvent(gesture_event);
292a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      break;
293a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
294a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case WebInputEvent::GestureFlingStart:
295a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      // PinchEnd must precede FlingStart.
296a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (pinch_gesture_active_)
297a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        PinchEnd(gesture_event);
298a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (InPinchGestureMode()) {
299a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        // No fling in pinch mode. Forward scroll end instead of fling start.
300a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        suppress_next_fling_cancel_ = true;
301a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        ScrollEnd(gesture_event);
302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      } else {
303a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        suppress_next_fling_cancel_ = false;
304a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        client_->ForwardGestureEvent(gesture_event);
305a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      }
306a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      break;
307a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
308a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case WebInputEvent::GestureFlingCancel:
309a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      // If fling start was suppressed, we should not send fling cancel either.
310a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (!suppress_next_fling_cancel_)
311a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        client_->ForwardGestureEvent(gesture_event);
312a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      suppress_next_fling_cancel_ = false;
313a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      break;
314a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
315a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    default:
316a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      // Everything else goes through.
317a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      client_->ForwardGestureEvent(gesture_event);
318a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
319a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
320a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
321a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TouchEmulator::CancelTouch() {
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!emulated_stream_active_sequence_count_)
323a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
324a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
3255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebTouchEventTraits::ResetTypeAndTouchStates(
3265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      WebInputEvent::TouchCancel,
3275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(),
3285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      &touch_event_);
32903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (gesture_provider_.GetCurrentDownEvent() &&
33003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      gesture_provider_.OnTouchEvent(MotionEventWeb(touch_event_)))
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ForwardTouchEventToClient();
332a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
333a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
334a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TouchEmulator::UpdateCursor() {
335a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!enabled_)
336a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    client_->SetCursor(pointer_cursor_);
337a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  else
338a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    client_->SetCursor(InPinchGestureMode() ? pinch_cursor_ : touch_cursor_);
339a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
340a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
341a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool TouchEmulator::UpdateShiftPressed(bool shift_pressed) {
342a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (shift_pressed_ == shift_pressed)
343a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return false;
344a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  shift_pressed_ = shift_pressed;
345a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  UpdateCursor();
346a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return true;
347a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
348a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
349a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TouchEmulator::PinchBegin(const WebGestureEvent& event) {
350a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK(InPinchGestureMode());
351a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK(!pinch_gesture_active_);
352a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_gesture_active_ = true;
353a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_anchor_ = gfx::Point(event.x, event.y);
354a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_scale_ = 1.f;
355a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  FillPinchEvent(event);
356a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_event_.type = WebInputEvent::GesturePinchBegin;
357a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  client_->ForwardGestureEvent(pinch_event_);
358a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
359a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
360a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TouchEmulator::PinchUpdate(const WebGestureEvent& event) {
361a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK(pinch_gesture_active_);
362a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int dy = pinch_anchor_.y() - event.y;
363a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  float scale = exp(dy * 0.002f);
364a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  FillPinchEvent(event);
365a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_event_.type = WebInputEvent::GesturePinchUpdate;
366a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_event_.data.pinchUpdate.scale = scale / pinch_scale_;
367a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  client_->ForwardGestureEvent(pinch_event_);
368a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_scale_ = scale;
369a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
370a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
371a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TouchEmulator::PinchEnd(const WebGestureEvent& event) {
372a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK(pinch_gesture_active_);
373a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_gesture_active_ = false;
374a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  FillPinchEvent(event);
375a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_event_.type = WebInputEvent::GesturePinchEnd;
376a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  client_->ForwardGestureEvent(pinch_event_);
377a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
378a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
379a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TouchEmulator::FillPinchEvent(const WebInputEvent& event) {
380a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_event_.timeStampSeconds = event.timeStampSeconds;
381a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_event_.modifiers = event.modifiers;
38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pinch_event_.sourceDevice = blink::WebGestureDeviceTouchscreen;
383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_event_.x = pinch_anchor_.x();
384a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  pinch_event_.y = pinch_anchor_.y();
385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
387a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TouchEmulator::ScrollEnd(const WebGestureEvent& event) {
388a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  WebGestureEvent scroll_event;
389a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scroll_event.timeStampSeconds = event.timeStampSeconds;
390a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scroll_event.modifiers = event.modifiers;
39146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scroll_event.sourceDevice = blink::WebGestureDeviceTouchscreen;
392a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scroll_event.type = WebInputEvent::GestureScrollEnd;
393a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  client_->ForwardGestureEvent(scroll_event);
394a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
395a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
396a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool TouchEmulator::FillTouchEventAndPoint(const WebMouseEvent& mouse_event) {
397a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (mouse_event.type != WebInputEvent::MouseDown &&
398a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      mouse_event.type != WebInputEvent::MouseMove &&
399a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      mouse_event.type != WebInputEvent::MouseUp) {
400a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return false;
401a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
402a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebInputEvent::Type eventType;
4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (mouse_event.type) {
4055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case WebInputEvent::MouseDown:
4065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      eventType = WebInputEvent::TouchStart;
4075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      break;
4085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case WebInputEvent::MouseMove:
4095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      eventType = WebInputEvent::TouchMove;
4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      break;
4115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case WebInputEvent::MouseUp:
4125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      eventType = WebInputEvent::TouchEnd;
4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      break;
4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    default:
4155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      eventType = WebInputEvent::Undefined;
4165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      NOTREACHED();
4175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
418a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  touch_event_.touchesLength = 1;
419a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  touch_event_.modifiers = mouse_event.modifiers;
4205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebTouchEventTraits::ResetTypeAndTouchStates(
4215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      eventType, mouse_event.timeStampSeconds, &touch_event_);
422a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
423a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  WebTouchPoint& point = touch_event_.touches[0];
424a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  point.id = 0;
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  point.radiusX = 0.5f * cursor_size_.width();
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  point.radiusY = 0.5f * cursor_size_.height();
427a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  point.force = 1.f;
428a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  point.rotationAngle = 0.f;
429a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  point.position.x = mouse_event.x;
430a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  point.screenPosition.x = mouse_event.globalX;
431a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  point.position.y = mouse_event.y;
432a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  point.screenPosition.y = mouse_event.globalY;
433a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
434a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return true;
435a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
436a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
437a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool TouchEmulator::InPinchGestureMode() const {
43803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return shift_pressed_;
439a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
440a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
441a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace content
442