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