Home | History | Annotate | Download | only in input
      1 // Copyright 2013 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_SYNTHETIC_SMOOTH_SCROLL_GESTURE_H_
      6 #define CONTENT_BROWSER_RENDERER_HOST_INPUT_SYNTHETIC_SMOOTH_SCROLL_GESTURE_H_
      7 
      8 #include "base/time/time.h"
      9 #include "content/browser/renderer_host/input/synthetic_gesture.h"
     10 #include "content/browser/renderer_host/input/synthetic_gesture_target.h"
     11 #include "content/common/content_export.h"
     12 #include "content/common/input/synthetic_smooth_scroll_gesture_params.h"
     13 #include "content/common/input/synthetic_web_input_event_builders.h"
     14 #include "third_party/WebKit/public/web/WebInputEvent.h"
     15 #include "ui/gfx/vector2d.h"
     16 #include "ui/gfx/vector2d_f.h"
     17 
     18 namespace content {
     19 
     20 // Simulates scrolling given a sequence of scroll distances as a continuous
     21 // gestures (i.e. when synthesizing touch events, the touch pointer is not
     22 // lifted when changing scroll direction).
     23 // If no distance is provided or the first one is 0, no touch events are
     24 // generated.
     25 // When synthesizing touch events, the first distance is extended to compensate
     26 // for the touch slop.
     27 class CONTENT_EXPORT SyntheticSmoothScrollGesture : public SyntheticGesture {
     28  public:
     29   explicit SyntheticSmoothScrollGesture(
     30       const SyntheticSmoothScrollGestureParams& params);
     31   virtual ~SyntheticSmoothScrollGesture();
     32 
     33   virtual SyntheticGesture::Result ForwardInputEvents(
     34       const base::TimeTicks& timestamp,
     35       SyntheticGestureTarget* target) OVERRIDE;
     36 
     37  private:
     38   enum GestureState {
     39     SETUP,
     40     STARTED,
     41     MOVING,
     42     STOPPING,
     43     DONE
     44   };
     45 
     46   void ForwardTouchInputEvents(
     47       const base::TimeTicks& timestamp, SyntheticGestureTarget* target);
     48   void ForwardMouseInputEvents(
     49       const base::TimeTicks& timestamp, SyntheticGestureTarget* target);
     50 
     51   void ForwardTouchEvent(SyntheticGestureTarget* target,
     52                          const base::TimeTicks& timestamp);
     53   void ForwardMouseWheelEvent(SyntheticGestureTarget* target,
     54                               const gfx::Vector2dF& delta,
     55                               const base::TimeTicks& timestamp) const;
     56 
     57   void PressTouchPoint(SyntheticGestureTarget* target,
     58                        const base::TimeTicks& timestamp);
     59   void MoveTouchPoint(SyntheticGestureTarget* target,
     60                       const gfx::Vector2dF& delta,
     61                       const base::TimeTicks& timestamp);
     62   void ReleaseTouchPoint(SyntheticGestureTarget* target,
     63                          const base::TimeTicks& timestamp);
     64 
     65   void AddTouchSlopToFirstDistance(SyntheticGestureTarget* target);
     66   gfx::Vector2dF GetPositionDeltaAtTime(const base::TimeTicks& timestamp)
     67       const;
     68   void ComputeNextScrollSegment();
     69   base::TimeTicks ClampTimestamp(const base::TimeTicks& timestamp) const;
     70   bool FinishedCurrentScrollSegment(const base::TimeTicks& timestamp) const;
     71   bool IsLastScrollSegment() const;
     72   bool ScrollIsNoOp() const;
     73 
     74   SyntheticSmoothScrollGestureParams params_;
     75   // Used for mouse input.
     76   gfx::Vector2d current_scroll_segment_total_delta_discrete_;
     77   // Used for touch input.
     78   gfx::Point current_scroll_segment_start_position_;
     79   SyntheticWebTouchEvent touch_event_;
     80   SyntheticGestureParams::GestureSourceType gesture_source_type_;
     81   GestureState state_;
     82   int current_scroll_segment_;
     83   base::TimeTicks current_scroll_segment_start_time_;
     84   base::TimeTicks current_scroll_segment_stop_time_;
     85 
     86   DISALLOW_COPY_AND_ASSIGN(SyntheticSmoothScrollGesture);
     87 };
     88 
     89 }  // namespace content
     90 
     91 #endif  // CONTENT_BROWSER_RENDERER_HOST_INPUT_SYNTHETIC_SMOOTH_SCROLL_GESTURE_H_
     92