Home | History | Annotate | Download | only in input
      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 
     15 namespace content {
     16 
     17 // Emulates touch input with mouse and keyboard.
     18 class CONTENT_EXPORT TouchEmulator : public ui::GestureProviderClient {
     19  public:
     20   explicit TouchEmulator(TouchEmulatorClient* client);
     21   virtual ~TouchEmulator();
     22 
     23   void Enable();
     24   void Disable();
     25 
     26   // Note that TouchEmulator should always listen to touch events and their acks
     27   // (even in disabled state) to track native stream presence.
     28   bool enabled() const { return enabled_; }
     29 
     30   // Returns |true| if the event was consumed. Consumed event should not
     31   // propagate any further.
     32   // TODO(dgozman): maybe pass latency info together with events.
     33   bool HandleMouseEvent(const blink::WebMouseEvent& event);
     34   bool HandleMouseWheelEvent(const blink::WebMouseWheelEvent& event);
     35   bool HandleKeyboardEvent(const blink::WebKeyboardEvent& event);
     36   bool HandleTouchEvent(const blink::WebTouchEvent& event);
     37 
     38   // Returns |true| if the event ack was consumed. Consumed ack should not
     39   // propagate any further.
     40   bool HandleTouchEventAck(const blink::WebTouchEvent& event,
     41                            InputEventAckState ack_result);
     42 
     43   // Cancel any touches, for example, when focus is lost.
     44   void CancelTouch();
     45 
     46  private:
     47   // ui::GestureProviderClient implementation.
     48   virtual void OnGestureEvent(const ui::GestureEventData& gesture) OVERRIDE;
     49 
     50   // Returns cursor size in DIP.
     51   gfx::SizeF InitCursorFromResource(
     52       WebCursor* cursor, float scale, int resource_id);
     53   void ResetState();
     54   void UpdateCursor();
     55   bool UpdateShiftPressed(bool shift_pressed);
     56 
     57   // Whether we should convert scrolls into pinches.
     58   bool InPinchGestureMode() const;
     59 
     60   bool FillTouchEventAndPoint(const blink::WebMouseEvent& mouse_event);
     61   void FillPinchEvent(const blink::WebInputEvent& event);
     62 
     63   // The following methods generate and pass gesture events to the renderer.
     64   void PinchBegin(const blink::WebGestureEvent& event);
     65   void PinchUpdate(const blink::WebGestureEvent& event);
     66   void PinchEnd(const blink::WebGestureEvent& event);
     67   void ScrollEnd(const blink::WebGestureEvent& event);
     68 
     69   void ForwardTouchEventToClient();
     70 
     71   TouchEmulatorClient* const client_;
     72   ui::FilteredGestureProvider gesture_provider_;
     73 
     74   // Disabled emulator does only process touch acks left from previous
     75   // emulation. It does not intercept any events.
     76   bool enabled_;
     77 
     78   // While emulation is on, default cursor is touch. Pressing shift changes
     79   // cursor to the pinch one.
     80   WebCursor pointer_cursor_;
     81   WebCursor touch_cursor_;
     82   WebCursor pinch_cursor_;
     83   gfx::SizeF cursor_size_;
     84 
     85   // These are used to drop extra mouse move events coming too quickly, so
     86   // we don't handle too much touches in gesture provider.
     87   bool last_mouse_event_was_move_;
     88   double last_mouse_move_timestamp_;
     89 
     90   bool mouse_pressed_;
     91   bool shift_pressed_;
     92 
     93   blink::WebTouchEvent touch_event_;
     94   int emulated_stream_active_sequence_count_;
     95   int native_stream_active_sequence_count_;
     96 
     97   // Whether we should suppress next fling cancel. This may happen when we
     98   // did not send fling start in pinch mode.
     99   bool suppress_next_fling_cancel_;
    100 
    101   blink::WebGestureEvent pinch_event_;
    102   // Point which does not move while pinch-zooming.
    103   gfx::Point pinch_anchor_;
    104   // The cumulative scale change from the start of pinch gesture.
    105   float pinch_scale_;
    106   bool pinch_gesture_active_;
    107 
    108   DISALLOW_COPY_AND_ASSIGN(TouchEmulator);
    109 };
    110 
    111 }  // namespace content
    112 
    113 #endif  // CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_EMULATOR_H_
    114