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.
5 #include "content/browser/renderer_host/input/synthetic_smooth_scroll_gesture_new.h"
9 #include "content/common/input/input_event.h"
10 #include "ui/events/latency_info.h"
15 // TODO(dominikg): Calibrate or add as another parameter.
16 const float kDeltaInPixelsPerMs = 0.5f;
20 SyntheticSmoothScrollGestureNew::SyntheticSmoothScrollGestureNew(
21 const SyntheticSmoothScrollGestureParams& params)
23 current_y_(params_.anchor_y) {}
25 SyntheticSmoothScrollGestureNew::~SyntheticSmoothScrollGestureNew() {}
27 SyntheticGestureNew::Result SyntheticSmoothScrollGestureNew::ForwardInputEvents(
28 const base::TimeDelta& interval, SyntheticGestureTarget* target) {
30 SyntheticGestureParams::GestureSourceType source =
31 params_.gesture_source_type;
32 if (source == SyntheticGestureParams::DEFAULT_INPUT)
33 source = target->GetDefaultSyntheticGestureSourceType();
35 if (!target->SupportsSyntheticGestureSourceType(source)) {
36 return SyntheticGestureNew::GESTURE_SOURCE_TYPE_NOT_SUPPORTED_BY_PLATFORM;
39 if (source == SyntheticGestureParams::TOUCH_INPUT) {
40 return ForwardTouchInputEvents(interval, target);
42 else if (source == SyntheticGestureParams::MOUSE_INPUT) {
43 return ForwardMouseInputEvents(interval, target);
46 return SyntheticGestureNew::GESTURE_SOURCE_TYPE_NOT_IMPLEMENTED;
50 SyntheticGestureNew::Result
51 SyntheticSmoothScrollGestureNew::ForwardTouchInputEvents(
52 const base::TimeDelta& interval, SyntheticGestureTarget* target) {
54 return SyntheticGestureNew::GESTURE_FINISHED;
56 if (current_y_ == params_.anchor_y) {
57 touch_event_.PressPoint(params_.anchor_x, current_y_);
58 ForwardTouchEvent(target);
61 current_y_ += GetPositionDelta(interval);
62 touch_event_.MovePoint(0, params_.anchor_x, current_y_);
63 ForwardTouchEvent(target);
66 touch_event_.ReleasePoint(0);
67 ForwardTouchEvent(target);
68 return SyntheticGestureNew::GESTURE_FINISHED;
71 return SyntheticGestureNew::GESTURE_RUNNING;
75 SyntheticGestureNew::Result
76 SyntheticSmoothScrollGestureNew::ForwardMouseInputEvents(
77 const base::TimeDelta& interval, SyntheticGestureTarget* target) {
79 return SyntheticGestureNew::GESTURE_FINISHED;
81 float delta = GetPositionDelta(interval);
83 ForwardMouseWheelEvent(target, delta);
86 return SyntheticGestureNew::GESTURE_FINISHED;
88 return SyntheticGestureNew::GESTURE_RUNNING;
91 void SyntheticSmoothScrollGestureNew::ForwardTouchEvent(
92 SyntheticGestureTarget* target) {
93 target->QueueInputEventToPlatform(
94 InputEvent(touch_event_, ui::LatencyInfo(), false));
97 void SyntheticSmoothScrollGestureNew::ForwardMouseWheelEvent(
98 SyntheticGestureTarget* target,
100 WebKit::WebMouseWheelEvent mouse_wheel_event =
101 SyntheticWebMouseWheelEventBuilder::Build(0, delta, 0, false);
103 target->QueueInputEventToPlatform(
104 InputEvent(mouse_wheel_event, ui::LatencyInfo(), false));
107 float SyntheticSmoothScrollGestureNew::GetPositionDelta(
108 const base::TimeDelta& interval) {
109 float delta = kDeltaInPixelsPerMs * interval.InMillisecondsF();
110 return (params_.distance > 0) ? delta : -delta;
113 bool SyntheticSmoothScrollGestureNew::HasFinished() {
114 return abs(current_y_ - params_.anchor_y) >= abs(params_.distance);
117 } // namespace content