touch_emulator.h revision 116680a4aac90f2aa7413d9095a592090648e557
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_EMULATOR_H_
6#define CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_EMULATOR_H_
7
8#include "content/browser/renderer_host/input/touch_emulator_client.h"
9#include "content/common/cursors/webcursor.h"
10#include "content/common/input/input_event_ack_state.h"
11#include "third_party/WebKit/public/web/WebInputEvent.h"
12#include "ui/events/gesture_detection/filtered_gesture_provider.h"
13#include "ui/gfx/size_f.h"
14
15namespace content {
16
17// Emulates touch input with mouse and keyboard.
18class CONTENT_EXPORT TouchEmulator : public ui::GestureProviderClient {
19 public:
20  explicit TouchEmulator(TouchEmulatorClient* client);
21  virtual ~TouchEmulator();
22
23  void Enable(bool allow_pinch);
24  void Disable();
25
26  // Returns |true| if the event was consumed.
27  // TODO(dgozman): maybe pass latency info together with events.
28  bool HandleMouseEvent(const blink::WebMouseEvent& event);
29  bool HandleMouseWheelEvent(const blink::WebMouseWheelEvent& event);
30  bool HandleKeyboardEvent(const blink::WebKeyboardEvent& event);
31
32  // Returns |true| if the event ack was consumed. Consumed ack should not
33  // propagate any further.
34  bool HandleTouchEventAck(InputEventAckState ack_result);
35
36  // Cancel any touches, for example, when focus is lost.
37  void CancelTouch();
38
39 private:
40  // ui::GestureProviderClient implementation.
41  virtual void OnGestureEvent(const ui::GestureEventData& gesture) OVERRIDE;
42
43  // Returns cursor size in DIP.
44  gfx::SizeF InitCursorFromResource(
45      WebCursor* cursor, float scale, int resource_id);
46  void ResetState();
47  void UpdateCursor();
48  bool UpdateShiftPressed(bool shift_pressed);
49
50  // Whether we should convert scrolls into pinches.
51  bool InPinchGestureMode() const;
52
53  bool FillTouchEventAndPoint(const blink::WebMouseEvent& mouse_event);
54  void FillPinchEvent(const blink::WebInputEvent& event);
55
56  // The following methods generate and pass gesture events to the renderer.
57  void PinchBegin(const blink::WebGestureEvent& event);
58  void PinchUpdate(const blink::WebGestureEvent& event);
59  void PinchEnd(const blink::WebGestureEvent& event);
60  void ScrollEnd(const blink::WebGestureEvent& event);
61
62  TouchEmulatorClient* const client_;
63  ui::FilteredGestureProvider gesture_provider_;
64
65  // Disabled emulator does only process touch acks left from previous
66  // emulation. It does not intercept any events.
67  bool enabled_;
68  bool allow_pinch_;
69
70  // While emulation is on, default cursor is touch. Pressing shift changes
71  // cursor to the pinch one.
72  WebCursor pointer_cursor_;
73  WebCursor touch_cursor_;
74  WebCursor pinch_cursor_;
75  gfx::SizeF cursor_size_;
76
77  // These are used to drop extra mouse move events coming too quickly, so
78  // we don't handle too much touches in gesture provider.
79  bool last_mouse_event_was_move_;
80  double last_mouse_move_timestamp_;
81
82  bool mouse_pressed_;
83  bool shift_pressed_;
84
85  blink::WebTouchEvent touch_event_;
86  bool touch_active_;
87
88  // Whether we should suppress next fling cancel. This may happen when we
89  // did not send fling start in pinch mode.
90  bool suppress_next_fling_cancel_;
91
92  blink::WebGestureEvent pinch_event_;
93  // Point which does not move while pinch-zooming.
94  gfx::Point pinch_anchor_;
95  // The cumulative scale change from the start of pinch gesture.
96  float pinch_scale_;
97  bool pinch_gesture_active_;
98
99  DISALLOW_COPY_AND_ASSIGN(TouchEmulator);
100};
101
102}  // namespace content
103
104#endif  // CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_EMULATOR_H_
105