OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/ui_events_helper.h" | 5 #include "content/browser/renderer_host/ui_events_helper.h" |
6 | 6 |
7 #include "content/browser/renderer_host/input/web_input_event_util.h" | 7 #include "content/browser/renderer_host/input/web_input_event_util.h" |
8 #include "content/common/input/web_touch_event_traits.h" | 8 #include "content/common/input/web_touch_event_traits.h" |
9 #include "third_party/WebKit/public/web/WebInputEvent.h" | 9 #include "third_party/WebKit/public/web/WebInputEvent.h" |
10 #include "ui/events/event.h" | 10 #include "ui/events/event.h" |
11 #include "ui/events/event_constants.h" | 11 #include "ui/events/event_constants.h" |
12 | 12 |
13 namespace { | 13 namespace { |
14 | 14 |
15 int WebModifiersToUIFlags(int modifiers) { | |
16 int flags = ui::EF_NONE; | |
17 | |
18 if (modifiers & blink::WebInputEvent::ShiftKey) | |
19 flags |= ui::EF_SHIFT_DOWN; | |
20 if (modifiers & blink::WebInputEvent::ControlKey) | |
21 flags |= ui::EF_CONTROL_DOWN; | |
22 if (modifiers & blink::WebInputEvent::AltKey) | |
23 flags |= ui::EF_ALT_DOWN; | |
24 if (modifiers & blink::WebInputEvent::MetaKey) | |
25 flags |= ui::EF_COMMAND_DOWN; | |
26 | |
27 if (modifiers & blink::WebInputEvent::LeftButtonDown) | |
28 flags |= ui::EF_LEFT_MOUSE_BUTTON; | |
29 if (modifiers & blink::WebInputEvent::RightButtonDown) | |
30 flags |= ui::EF_RIGHT_MOUSE_BUTTON; | |
31 if (modifiers & blink::WebInputEvent::MiddleButtonDown) | |
32 flags |= ui::EF_MIDDLE_MOUSE_BUTTON; | |
33 | |
34 if (modifiers & blink::WebInputEvent::CapsLockOn) | |
35 flags |= ui::EF_CAPS_LOCK_DOWN; | |
36 | |
37 return flags; | |
38 } | |
39 | |
40 ui::EventType WebTouchPointStateToEventType( | 15 ui::EventType WebTouchPointStateToEventType( |
41 blink::WebTouchPoint::State state) { | 16 blink::WebTouchPoint::State state) { |
42 switch (state) { | 17 switch (state) { |
43 case blink::WebTouchPoint::StateReleased: | 18 case blink::WebTouchPoint::StateReleased: |
44 return ui::ET_TOUCH_RELEASED; | 19 return ui::ET_TOUCH_RELEASED; |
45 | 20 |
46 case blink::WebTouchPoint::StatePressed: | 21 case blink::WebTouchPoint::StatePressed: |
47 return ui::ET_TOUCH_PRESSED; | 22 return ui::ET_TOUCH_PRESSED; |
48 | 23 |
49 case blink::WebTouchPoint::StateMoved: | 24 case blink::WebTouchPoint::StateMoved: |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 type = ui::ET_TOUCH_MOVED; | 85 type = ui::ET_TOUCH_MOVED; |
111 break; | 86 break; |
112 case blink::WebInputEvent::TouchCancel: | 87 case blink::WebInputEvent::TouchCancel: |
113 type = ui::ET_TOUCH_CANCELLED; | 88 type = ui::ET_TOUCH_CANCELLED; |
114 break; | 89 break; |
115 default: | 90 default: |
116 NOTREACHED(); | 91 NOTREACHED(); |
117 return false; | 92 return false; |
118 } | 93 } |
119 | 94 |
120 int flags = WebModifiersToUIFlags(touch.modifiers); | 95 int flags = WebEventModifiersToEventFlags(touch.modifiers); |
121 base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds( | 96 base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds( |
122 static_cast<int64>(touch.timeStampSeconds * 1000000)); | 97 static_cast<int64>(touch.timeStampSeconds * 1000000)); |
123 for (unsigned i = 0; i < touch.touchesLength; ++i) { | 98 for (unsigned i = 0; i < touch.touchesLength; ++i) { |
124 const blink::WebTouchPoint& point = touch.touches[i]; | 99 const blink::WebTouchPoint& point = touch.touches[i]; |
125 if (WebTouchPointStateToEventType(point.state) != type) | 100 if (WebTouchPointStateToEventType(point.state) != type) |
126 continue; | 101 continue; |
127 // ui events start in the co-ordinate space of the EventDispatcher. | 102 // ui events start in the co-ordinate space of the EventDispatcher. |
128 gfx::PointF location; | 103 gfx::PointF location; |
129 if (coordinate_system == LOCAL_COORDINATES) | 104 if (coordinate_system == LOCAL_COORDINATES) |
130 location = point.position; | 105 location = point.position; |
131 else | 106 else |
132 location = point.screenPosition; | 107 location = point.screenPosition; |
133 ui::TouchEvent* uievent = new ui::TouchEvent(type, | 108 ui::TouchEvent* uievent = new ui::TouchEvent(type, |
134 location, | 109 location, |
135 flags, | 110 flags, |
136 point.id, | 111 point.id, |
137 timestamp, | 112 timestamp, |
138 point.radiusX, | 113 point.radiusX, |
139 point.radiusY, | 114 point.radiusY, |
140 point.rotationAngle, | 115 point.rotationAngle, |
141 point.force); | 116 point.force); |
142 uievent->set_latency(touch_with_latency.latency); | 117 uievent->set_latency(touch_with_latency.latency); |
143 list->push_back(uievent); | 118 list->push_back(uievent); |
144 } | 119 } |
145 return true; | 120 return true; |
146 } | 121 } |
147 | 122 |
148 blink::WebGestureEvent MakeWebGestureEventFromUIEvent( | 123 blink::WebGestureEvent MakeWebGestureEventFromUIEvent( |
149 const ui::GestureEvent& event) { | 124 const ui::GestureEvent& event) { |
150 blink::WebGestureEvent gesture_event; | 125 return CreateWebGestureEvent(event.details(), |
151 | 126 event.time_stamp(), |
152 switch (event.type()) { | 127 event.location_f(), |
153 case ui::ET_GESTURE_TAP: | 128 event.root_location_f(), |
154 gesture_event.type = blink::WebInputEvent::GestureTap; | 129 event.flags()); |
155 gesture_event.data.tap.tapCount = event.details().tap_count(); | |
156 gesture_event.data.tap.width = event.details().bounding_box().width(); | |
157 gesture_event.data.tap.height = event.details().bounding_box().height(); | |
158 break; | |
159 case ui::ET_GESTURE_TAP_DOWN: | |
160 gesture_event.type = blink::WebInputEvent::GestureTapDown; | |
161 gesture_event.data.tapDown.width = | |
162 event.details().bounding_box().width(); | |
163 gesture_event.data.tapDown.height = | |
164 event.details().bounding_box().height(); | |
165 break; | |
166 case ui::ET_GESTURE_SHOW_PRESS: | |
167 gesture_event.type = blink::WebInputEvent::GestureShowPress; | |
168 gesture_event.data.showPress.width = | |
169 event.details().bounding_box().width(); | |
170 gesture_event.data.showPress.height = | |
171 event.details().bounding_box().height(); | |
172 break; | |
173 case ui::ET_GESTURE_TAP_CANCEL: | |
174 gesture_event.type = blink::WebInputEvent::GestureTapCancel; | |
175 break; | |
176 case ui::ET_GESTURE_SCROLL_BEGIN: | |
177 gesture_event.type = blink::WebInputEvent::GestureScrollBegin; | |
178 gesture_event.data.scrollBegin.deltaXHint = | |
179 event.details().scroll_x_hint(); | |
180 gesture_event.data.scrollBegin.deltaYHint = | |
181 event.details().scroll_y_hint(); | |
182 break; | |
183 case ui::ET_GESTURE_SCROLL_UPDATE: | |
184 gesture_event.type = blink::WebInputEvent::GestureScrollUpdate; | |
185 gesture_event.data.scrollUpdate.deltaX = event.details().scroll_x(); | |
186 gesture_event.data.scrollUpdate.deltaY = event.details().scroll_y(); | |
187 break; | |
188 case ui::ET_GESTURE_SCROLL_END: | |
189 gesture_event.type = blink::WebInputEvent::GestureScrollEnd; | |
190 break; | |
191 case ui::ET_GESTURE_PINCH_BEGIN: | |
192 gesture_event.type = blink::WebInputEvent::GesturePinchBegin; | |
193 break; | |
194 case ui::ET_GESTURE_PINCH_UPDATE: | |
195 gesture_event.type = blink::WebInputEvent::GesturePinchUpdate; | |
196 gesture_event.data.pinchUpdate.scale = event.details().scale(); | |
197 break; | |
198 case ui::ET_GESTURE_PINCH_END: | |
199 gesture_event.type = blink::WebInputEvent::GesturePinchEnd; | |
200 break; | |
201 case ui::ET_SCROLL_FLING_START: | |
202 gesture_event.type = blink::WebInputEvent::GestureFlingStart; | |
203 gesture_event.data.flingStart.velocityX = event.details().velocity_x(); | |
204 gesture_event.data.flingStart.velocityY = event.details().velocity_y(); | |
205 break; | |
206 case ui::ET_SCROLL_FLING_CANCEL: | |
207 gesture_event.type = blink::WebInputEvent::GestureFlingCancel; | |
208 break; | |
209 case ui::ET_GESTURE_LONG_PRESS: | |
210 gesture_event.type = blink::WebInputEvent::GestureLongPress; | |
211 gesture_event.data.longPress.width = | |
212 event.details().bounding_box().width(); | |
213 gesture_event.data.longPress.height = | |
214 event.details().bounding_box().height(); | |
215 break; | |
216 case ui::ET_GESTURE_LONG_TAP: | |
217 gesture_event.type = blink::WebInputEvent::GestureLongTap; | |
218 gesture_event.data.longPress.width = | |
219 event.details().bounding_box().width(); | |
220 gesture_event.data.longPress.height = | |
221 event.details().bounding_box().height(); | |
222 break; | |
223 case ui::ET_GESTURE_TWO_FINGER_TAP: | |
224 gesture_event.type = blink::WebInputEvent::GestureTwoFingerTap; | |
225 gesture_event.data.twoFingerTap.firstFingerWidth = | |
226 event.details().first_finger_width(); | |
227 gesture_event.data.twoFingerTap.firstFingerHeight = | |
228 event.details().first_finger_height(); | |
229 break; | |
230 case ui::ET_GESTURE_BEGIN: | |
231 case ui::ET_GESTURE_END: | |
232 case ui::ET_GESTURE_SWIPE: | |
233 gesture_event.type = blink::WebInputEvent::Undefined; | |
234 break; | |
235 default: | |
236 NOTREACHED() << "Unknown gesture type: " << event.type(); | |
237 } | |
238 | |
239 gesture_event.sourceDevice = blink::WebGestureDeviceTouchscreen; | |
240 gesture_event.modifiers = EventFlagsToWebEventModifiers(event.flags()); | |
241 gesture_event.timeStampSeconds = event.time_stamp().InSecondsF(); | |
242 | |
243 return gesture_event; | |
244 } | 130 } |
245 | 131 |
246 blink::WebTouchPoint* UpdateWebTouchEventFromUIEvent( | 132 blink::WebTouchPoint* UpdateWebTouchEventFromUIEvent( |
247 const ui::TouchEvent& event, | 133 const ui::TouchEvent& event, |
248 blink::WebTouchEvent* web_event) { | 134 blink::WebTouchEvent* web_event) { |
249 blink::WebTouchPoint* point = NULL; | 135 blink::WebTouchPoint* point = NULL; |
250 switch (event.type()) { | 136 switch (event.type()) { |
251 case ui::ET_TOUCH_PRESSED: | 137 case ui::ET_TOUCH_PRESSED: |
252 // Add a new touch point. | 138 // Add a new touch point. |
253 if (web_event->touchesLength < blink::WebTouchEvent::touchesLengthCap) { | 139 if (web_event->touchesLength < blink::WebTouchEvent::touchesLengthCap) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 // Update the type of the touch event. | 189 // Update the type of the touch event. |
304 WebTouchEventTraits::ResetType(TouchEventTypeFromEvent(event), | 190 WebTouchEventTraits::ResetType(TouchEventTypeFromEvent(event), |
305 event.time_stamp().InSecondsF(), | 191 event.time_stamp().InSecondsF(), |
306 web_event); | 192 web_event); |
307 web_event->modifiers = EventFlagsToWebEventModifiers(event.flags()); | 193 web_event->modifiers = EventFlagsToWebEventModifiers(event.flags()); |
308 | 194 |
309 return point; | 195 return point; |
310 } | 196 } |
311 | 197 |
312 } // namespace content | 198 } // namespace content |
OLD | NEW |