- add sources.
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / input / synthetic_smooth_scroll_gesture_new.cc
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 #include "content/browser/renderer_host/input/synthetic_smooth_scroll_gesture_new.h"
6
7 #include <cmath>
8
9 #include "content/common/input/input_event.h"
10 #include "ui/events/latency_info.h"
11
12 namespace content {
13 namespace {
14
15 // TODO(dominikg): Calibrate or add as another parameter.
16 const float kDeltaInPixelsPerMs = 0.5f;
17
18 }
19
20 SyntheticSmoothScrollGestureNew::SyntheticSmoothScrollGestureNew(
21     const SyntheticSmoothScrollGestureParams& params)
22     : params_(params),
23       current_y_(params_.anchor_y) {}
24
25 SyntheticSmoothScrollGestureNew::~SyntheticSmoothScrollGestureNew() {}
26
27 SyntheticGestureNew::Result SyntheticSmoothScrollGestureNew::ForwardInputEvents(
28     const base::TimeDelta& interval, SyntheticGestureTarget* target) {
29
30   SyntheticGestureParams::GestureSourceType source =
31       params_.gesture_source_type;
32   if (source == SyntheticGestureParams::DEFAULT_INPUT)
33     source = target->GetDefaultSyntheticGestureSourceType();
34
35   if (!target->SupportsSyntheticGestureSourceType(source)) {
36     return SyntheticGestureNew::GESTURE_SOURCE_TYPE_NOT_SUPPORTED_BY_PLATFORM;
37   }
38
39   if (source == SyntheticGestureParams::TOUCH_INPUT) {
40     return ForwardTouchInputEvents(interval, target);
41   }
42   else if (source == SyntheticGestureParams::MOUSE_INPUT) {
43     return ForwardMouseInputEvents(interval, target);
44   }
45   else {
46     return SyntheticGestureNew::GESTURE_SOURCE_TYPE_NOT_IMPLEMENTED;
47   }
48 }
49
50 SyntheticGestureNew::Result
51 SyntheticSmoothScrollGestureNew::ForwardTouchInputEvents(
52     const base::TimeDelta& interval, SyntheticGestureTarget* target) {
53   if (HasFinished())
54     return SyntheticGestureNew::GESTURE_FINISHED;
55
56   if (current_y_ == params_.anchor_y) {
57     touch_event_.PressPoint(params_.anchor_x, current_y_);
58     ForwardTouchEvent(target);
59   }
60
61   current_y_ += GetPositionDelta(interval);
62   touch_event_.MovePoint(0, params_.anchor_x, current_y_);
63   ForwardTouchEvent(target);
64
65   if (HasFinished()) {
66     touch_event_.ReleasePoint(0);
67     ForwardTouchEvent(target);
68     return SyntheticGestureNew::GESTURE_FINISHED;
69   }
70   else {
71     return SyntheticGestureNew::GESTURE_RUNNING;
72   }
73 }
74
75 SyntheticGestureNew::Result
76 SyntheticSmoothScrollGestureNew::ForwardMouseInputEvents(
77     const base::TimeDelta& interval, SyntheticGestureTarget* target) {
78   if (HasFinished())
79     return SyntheticGestureNew::GESTURE_FINISHED;
80
81   float delta = GetPositionDelta(interval);
82   current_y_ += delta;
83   ForwardMouseWheelEvent(target, delta);
84
85   if (HasFinished())
86     return SyntheticGestureNew::GESTURE_FINISHED;
87   else
88     return SyntheticGestureNew::GESTURE_RUNNING;
89 }
90
91 void SyntheticSmoothScrollGestureNew::ForwardTouchEvent(
92     SyntheticGestureTarget* target) {
93   target->QueueInputEventToPlatform(
94       InputEvent(touch_event_, ui::LatencyInfo(), false));
95 }
96
97 void SyntheticSmoothScrollGestureNew::ForwardMouseWheelEvent(
98     SyntheticGestureTarget* target,
99     float delta) {
100   WebKit::WebMouseWheelEvent mouse_wheel_event =
101       SyntheticWebMouseWheelEventBuilder::Build(0, delta, 0, false);
102
103   target->QueueInputEventToPlatform(
104       InputEvent(mouse_wheel_event, ui::LatencyInfo(), false));
105 }
106
107 float SyntheticSmoothScrollGestureNew::GetPositionDelta(
108     const base::TimeDelta& interval) {
109   float delta = kDeltaInPixelsPerMs * interval.InMillisecondsF();
110   return (params_.distance > 0) ? delta : -delta;
111 }
112
113 bool SyntheticSmoothScrollGestureNew::HasFinished() {
114   return abs(current_y_ - params_.anchor_y) >= abs(params_.distance);
115 }
116
117 }  // namespace content