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