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_tap_gesture.h"
7 #include "base/logging.h"
8 #include "third_party/WebKit/public/web/WebInputEvent.h"
9 #include "ui/events/latency_info.h"
13 SyntheticTapGesture::SyntheticTapGesture(
14 const SyntheticTapGestureParams
& params
)
16 gesture_source_type_(SyntheticGestureParams::DEFAULT_INPUT
),
18 DCHECK_GE(params_
.duration_ms
, 0);
21 SyntheticTapGesture::~SyntheticTapGesture() {}
23 SyntheticGesture::Result
SyntheticTapGesture::ForwardInputEvents(
24 const base::TimeTicks
& timestamp
, SyntheticGestureTarget
* target
) {
25 if (state_
== SETUP
) {
26 gesture_source_type_
= params_
.gesture_source_type
;
27 if (gesture_source_type_
== SyntheticGestureParams::DEFAULT_INPUT
)
28 gesture_source_type_
= target
->GetDefaultSyntheticGestureSourceType();
33 DCHECK_NE(gesture_source_type_
, SyntheticGestureParams::DEFAULT_INPUT
);
34 if (gesture_source_type_
== SyntheticGestureParams::TOUCH_INPUT
||
35 gesture_source_type_
== SyntheticGestureParams::MOUSE_INPUT
)
36 ForwardTouchOrMouseInputEvents(timestamp
, target
);
38 return SyntheticGesture::GESTURE_SOURCE_TYPE_NOT_IMPLEMENTED
;
40 return (state_
== DONE
) ? SyntheticGesture::GESTURE_FINISHED
41 : SyntheticGesture::GESTURE_RUNNING
;
44 void SyntheticTapGesture::ForwardTouchOrMouseInputEvents(
45 const base::TimeTicks
& timestamp
, SyntheticGestureTarget
* target
) {
48 Press(target
, timestamp
);
49 // Release immediately if duration is 0.
50 if (params_
.duration_ms
== 0) {
51 Release(target
, timestamp
);
54 start_time_
= timestamp
;
55 state_
= WAITING_TO_RELEASE
;
58 case WAITING_TO_RELEASE
:
59 if (timestamp
- start_time_
>= GetDuration()) {
60 Release(target
, start_time_
+ GetDuration());
65 NOTREACHED() << "State SETUP invalid for synthetic tap gesture.";
67 NOTREACHED() << "State DONE invalid for synthetic tap gesture.";
71 void SyntheticTapGesture::Press(SyntheticGestureTarget
* target
,
72 const base::TimeTicks
& timestamp
) {
73 if (gesture_source_type_
== SyntheticGestureParams::TOUCH_INPUT
) {
74 touch_event_
.PressPoint(params_
.position
.x(), params_
.position
.y());
75 touch_event_
.timeStampSeconds
= ConvertTimestampToSeconds(timestamp
);
76 target
->DispatchInputEventToPlatform(touch_event_
);
77 } else if (gesture_source_type_
== SyntheticGestureParams::MOUSE_INPUT
) {
78 blink::WebMouseEvent mouse_event
=
79 SyntheticWebMouseEventBuilder::Build(blink::WebInputEvent::MouseDown
,
83 mouse_event
.clickCount
= 1;
84 mouse_event
.timeStampSeconds
= ConvertTimestampToSeconds(timestamp
);
85 target
->DispatchInputEventToPlatform(mouse_event
);
87 NOTREACHED() << "Invalid gesture source type for synthetic tap gesture.";
91 void SyntheticTapGesture::Release(SyntheticGestureTarget
* target
,
92 const base::TimeTicks
& timestamp
) {
93 if (gesture_source_type_
== SyntheticGestureParams::TOUCH_INPUT
) {
94 touch_event_
.ReleasePoint(0);
95 touch_event_
.timeStampSeconds
= ConvertTimestampToSeconds(timestamp
);
96 target
->DispatchInputEventToPlatform(touch_event_
);
97 } else if (gesture_source_type_
== SyntheticGestureParams::MOUSE_INPUT
) {
98 blink::WebMouseEvent mouse_event
=
99 SyntheticWebMouseEventBuilder::Build(blink::WebInputEvent::MouseUp
,
100 params_
.position
.x(),
101 params_
.position
.y(),
103 mouse_event
.clickCount
= 1;
104 mouse_event
.timeStampSeconds
= ConvertTimestampToSeconds(timestamp
);
105 target
->DispatchInputEventToPlatform(mouse_event
);
107 NOTREACHED() << "Invalid gesture source type for synthetic tap gesture.";
111 base::TimeDelta
SyntheticTapGesture::GetDuration() const {
112 return base::TimeDelta::FromMilliseconds(params_
.duration_ms
);
115 } // namespace content