| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2015 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 "blimp/common/input/input_event_conversions.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "blimp/common/proto/input.pb.h" |
| 9 #include "third_party/WebKit/public/platform/WebGestureDevice.h" |
| 10 #include "third_party/WebKit/public/web/WebInputEvent.h" |
| 11 |
| 12 namespace blimp { |
| 13 |
| 14 namespace { |
| 15 |
| 16 blink::WebInputEvent::Type ProtoToWebInputEventType(InputMessage::Type type) { |
| 17 switch (type) { |
| 18 case InputMessage::Type_GestureScrollBegin: |
| 19 return blink::WebInputEvent::Type::GestureScrollBegin; |
| 20 case InputMessage::Type_GestureScrollEnd: |
| 21 return blink::WebInputEvent::Type::GestureScrollEnd; |
| 22 case InputMessage::Type_GestureScrollUpdate: |
| 23 return blink::WebInputEvent::Type::GestureScrollUpdate; |
| 24 case InputMessage::Type_GestureFlingStart: |
| 25 return blink::WebInputEvent::Type::GestureFlingStart; |
| 26 case InputMessage::Type_GestureFlingCancel: |
| 27 return blink::WebInputEvent::Type::GestureFlingCancel; |
| 28 case InputMessage::Type_GestureShowPress: |
| 29 return blink::WebInputEvent::Type::GestureShowPress; |
| 30 case InputMessage::Type_GestureTap: |
| 31 return blink::WebInputEvent::Type::GestureTap; |
| 32 case InputMessage::Type_GestureTapUnconfirmed: |
| 33 return blink::WebInputEvent::Type::GestureTapUnconfirmed; |
| 34 case InputMessage::Type_GestureTapDown: |
| 35 return blink::WebInputEvent::Type::GestureTapDown; |
| 36 case InputMessage::Type_GestureTapCancel: |
| 37 return blink::WebInputEvent::Type::GestureTapCancel; |
| 38 case InputMessage::Type_GestureDoubleTap: |
| 39 return blink::WebInputEvent::Type::GestureDoubleTap; |
| 40 case InputMessage::Type_GestureTwoFingerTap: |
| 41 return blink::WebInputEvent::Type::GestureTwoFingerTap; |
| 42 case InputMessage::Type_GestureLongPress: |
| 43 return blink::WebInputEvent::Type::GestureLongPress; |
| 44 case InputMessage::Type_GestureLongTap: |
| 45 return blink::WebInputEvent::Type::GestureLongTap; |
| 46 case InputMessage::Type_GesturePinchBegin: |
| 47 return blink::WebInputEvent::Type::GesturePinchBegin; |
| 48 case InputMessage::Type_GesturePinchEnd: |
| 49 return blink::WebInputEvent::Type::GesturePinchEnd; |
| 50 case InputMessage::Type_GesturePinchUpdate: |
| 51 return blink::WebInputEvent::Type::GesturePinchUpdate; |
| 52 case InputMessage::Type_Undefined: |
| 53 default: |
| 54 return blink::WebInputEvent::Type::Undefined; |
| 55 } |
| 56 } |
| 57 |
| 58 InputMessage::Type WebInputEventTypeToProto(blink::WebInputEvent::Type type) { |
| 59 switch (type) { |
| 60 case blink::WebInputEvent::Type::GestureScrollBegin: |
| 61 return InputMessage::Type_GestureScrollBegin; |
| 62 case blink::WebInputEvent::Type::GestureScrollEnd: |
| 63 return InputMessage::Type_GestureScrollEnd; |
| 64 case blink::WebInputEvent::Type::GestureScrollUpdate: |
| 65 return InputMessage::Type_GestureScrollUpdate; |
| 66 case blink::WebInputEvent::Type::GestureFlingStart: |
| 67 return InputMessage::Type_GestureFlingStart; |
| 68 case blink::WebInputEvent::Type::GestureFlingCancel: |
| 69 return InputMessage::Type_GestureFlingCancel; |
| 70 case blink::WebInputEvent::Type::GestureShowPress: |
| 71 return InputMessage::Type_GestureShowPress; |
| 72 case blink::WebInputEvent::Type::GestureTap: |
| 73 return InputMessage::Type_GestureTap; |
| 74 case blink::WebInputEvent::Type::GestureTapUnconfirmed: |
| 75 return InputMessage::Type_GestureTapUnconfirmed; |
| 76 case blink::WebInputEvent::Type::GestureTapDown: |
| 77 return InputMessage::Type_GestureTapDown; |
| 78 case blink::WebInputEvent::Type::GestureTapCancel: |
| 79 return InputMessage::Type_GestureTapCancel; |
| 80 case blink::WebInputEvent::Type::GestureDoubleTap: |
| 81 return InputMessage::Type_GestureDoubleTap; |
| 82 case blink::WebInputEvent::Type::GestureTwoFingerTap: |
| 83 return InputMessage::Type_GestureTwoFingerTap; |
| 84 case blink::WebInputEvent::Type::GestureLongPress: |
| 85 return InputMessage::Type_GestureLongPress; |
| 86 case blink::WebInputEvent::Type::GestureLongTap: |
| 87 return InputMessage::Type_GestureLongTap; |
| 88 case blink::WebInputEvent::Type::GesturePinchBegin: |
| 89 return InputMessage::Type_GesturePinchBegin; |
| 90 case blink::WebInputEvent::Type::GesturePinchEnd: |
| 91 return InputMessage::Type_GesturePinchEnd; |
| 92 case blink::WebInputEvent::Type::GesturePinchUpdate: |
| 93 return InputMessage::Type_GesturePinchUpdate; |
| 94 case blink::WebInputEvent::Type::Undefined: |
| 95 default: |
| 96 return InputMessage::Type_Undefined; |
| 97 } |
| 98 } |
| 99 |
| 100 blink::WebGestureDevice ProtoToWebGestureDevice( |
| 101 const blimp::WebGestureDevice& type) { |
| 102 switch (type) { |
| 103 case WebGestureDevice::WebGestureDevice_Uninitialized: |
| 104 return blink::WebGestureDevice::WebGestureDeviceUninitialized; |
| 105 case WebGestureDevice::WebGestureDevice_Touchpad: |
| 106 return blink::WebGestureDevice::WebGestureDeviceTouchpad; |
| 107 case WebGestureDevice::WebGestureDevice_Touchscreen: |
| 108 return blink::WebGestureDevice::WebGestureDeviceTouchscreen; |
| 109 } |
| 110 return blink::WebGestureDevice::WebGestureDeviceUninitialized; |
| 111 } |
| 112 |
| 113 blimp::WebGestureDevice WebGestureDeviceToProto( |
| 114 const blink::WebGestureDevice& type) { |
| 115 switch (type) { |
| 116 case blink::WebGestureDevice::WebGestureDeviceUninitialized: |
| 117 return WebGestureDevice::WebGestureDevice_Uninitialized; |
| 118 case blink::WebGestureDevice::WebGestureDeviceTouchpad: |
| 119 return WebGestureDevice::WebGestureDevice_Touchpad; |
| 120 case blink::WebGestureDevice::WebGestureDeviceTouchscreen: |
| 121 return WebGestureDevice::WebGestureDevice_Touchscreen; |
| 122 } |
| 123 return WebGestureDevice::WebGestureDevice_Uninitialized; |
| 124 } |
| 125 |
| 126 void WebGestureEventToProto(const blink::WebGestureEvent& event, |
| 127 GestureArgs* proto) { |
| 128 proto->set_x(event.x); |
| 129 proto->set_y(event.y); |
| 130 proto->set_global_x(event.globalX); |
| 131 proto->set_global_y(event.globalY); |
| 132 proto->set_source_device(WebGestureDeviceToProto(event.sourceDevice)); |
| 133 |
| 134 if (event.type == blink::WebInputEvent::GestureTap || |
| 135 event.type == blink::WebInputEvent::GestureTapUnconfirmed || |
| 136 event.type == blink::WebInputEvent::GestureDoubleTap) { |
| 137 GestureArgs::Tap* args = proto->mutable_tap(); |
| 138 args->set_tap_count(event.data.tap.tapCount); |
| 139 args->set_width(event.data.tap.width); |
| 140 args->set_height(event.data.tap.height); |
| 141 } else if (event.type == blink::WebInputEvent::GestureTapDown) { |
| 142 GestureArgs::TapDown* args = proto->mutable_tap_down(); |
| 143 args->set_width(event.data.tapDown.width); |
| 144 args->set_height(event.data.tapDown.height); |
| 145 } else if (event.type == blink::WebInputEvent::GestureShowPress) { |
| 146 GestureArgs::ShowPress* args = proto->mutable_show_press(); |
| 147 args->set_width(event.data.showPress.width); |
| 148 args->set_height(event.data.showPress.height); |
| 149 } else if (event.type == blink::WebInputEvent::GestureLongPress) { |
| 150 GestureArgs::LongPress* args = proto->mutable_long_press(); |
| 151 args->set_width(event.data.longPress.width); |
| 152 args->set_height(event.data.longPress.height); |
| 153 } else if (event.type == blink::WebInputEvent::GestureTwoFingerTap) { |
| 154 GestureArgs::TwoFingerTap* args = proto->mutable_two_finger_tap(); |
| 155 args->set_first_finger_width(event.data.twoFingerTap.firstFingerWidth); |
| 156 args->set_first_finger_height( |
| 157 event.data.twoFingerTap.firstFingerHeight); |
| 158 } else if (event.type == blink::WebInputEvent::GestureScrollBegin) { |
| 159 GestureArgs::ScrollBegin* args = proto->mutable_scroll_begin(); |
| 160 args->set_delta_x_hint(event.data.scrollBegin.deltaXHint); |
| 161 args->set_delta_y_hint(event.data.scrollBegin.deltaYHint); |
| 162 args->set_target_viewport(event.data.scrollBegin.targetViewport); |
| 163 } else if (event.type == blink::WebInputEvent::GestureScrollUpdate) { |
| 164 GestureArgs::ScrollUpdate* args = proto->mutable_scroll_update(); |
| 165 args->set_delta_x(event.data.scrollUpdate.deltaX); |
| 166 args->set_delta_y(event.data.scrollUpdate.deltaY); |
| 167 args->set_velocity_x(event.data.scrollUpdate.velocityX); |
| 168 args->set_velocity_y(event.data.scrollUpdate.velocityY); |
| 169 args->set_previous_update_in_sequence_prevented( |
| 170 event.data.scrollUpdate.previousUpdateInSequencePrevented); |
| 171 args->set_prevent_propagation( |
| 172 event.data.scrollUpdate.preventPropagation); |
| 173 args->set_inertial(event.data.scrollUpdate.inertial); |
| 174 } else if (event.type == blink::WebInputEvent::GestureFlingStart) { |
| 175 GestureArgs::FlingStart* args = proto->mutable_fling_start(); |
| 176 args->set_velocity_x(event.data.flingStart.velocityX); |
| 177 args->set_velocity_y(event.data.flingStart.velocityY); |
| 178 args->set_target_viewport(event.data.flingStart.targetViewport); |
| 179 } else if (event.type == blink::WebInputEvent::GestureFlingCancel) { |
| 180 GestureArgs::FlingCancel* args = proto->mutable_fling_cancel(); |
| 181 args->set_prevent_boosting(event.data.flingCancel.preventBoosting); |
| 182 } else if (event.type == blink::WebInputEvent::GesturePinchUpdate) { |
| 183 GestureArgs::PinchUpdate* args = proto->mutable_pinch_update(); |
| 184 args->set_zoom_disabled(event.data.pinchUpdate.zoomDisabled); |
| 185 args->set_scale(event.data.pinchUpdate.scale); |
| 186 } |
| 187 } |
| 188 |
| 189 scoped_ptr<blink::WebInputEvent> ProtoToWebGestureEvent( |
| 190 const GestureArgs& proto) { |
| 191 scoped_ptr<blink::WebGestureEvent> event(new blink::WebGestureEvent); |
| 192 event->x = proto.x(); |
| 193 event->y = proto.y(); |
| 194 event->globalX = proto.global_x(); |
| 195 event->globalY = proto.global_y(); |
| 196 event->sourceDevice = ProtoToWebGestureDevice(proto.source_device()); |
| 197 |
| 198 if (proto.has_tap()) { |
| 199 event->data.tap.tapCount = proto.tap().tap_count(); |
| 200 event->data.tap.width = proto.tap().width(); |
| 201 event->data.tap.height = proto.tap().height(); |
| 202 } else if (proto.has_tap_down()) { |
| 203 event->data.tapDown.width = proto.tap_down().width(); |
| 204 event->data.tapDown.height = proto.tap_down().height(); |
| 205 } else if (proto.has_show_press()) { |
| 206 event->data.showPress.width = proto.show_press().width(); |
| 207 event->data.showPress.height = proto.show_press().height(); |
| 208 } else if (proto.has_long_press()) { |
| 209 event->data.longPress.width = proto.long_press().width(); |
| 210 event->data.longPress.height = proto.long_press().height(); |
| 211 } else if (proto.has_two_finger_tap()) { |
| 212 event->data.twoFingerTap.firstFingerWidth = |
| 213 proto.two_finger_tap().first_finger_width(); |
| 214 event->data.twoFingerTap.firstFingerHeight = |
| 215 proto.two_finger_tap().first_finger_height(); |
| 216 } else if (proto.has_scroll_begin()) { |
| 217 event->data.scrollBegin.deltaXHint = proto.scroll_begin().delta_x_hint(); |
| 218 event->data.scrollBegin.deltaYHint = proto.scroll_begin().delta_y_hint(); |
| 219 event->data.scrollBegin.targetViewport = |
| 220 proto.scroll_begin().target_viewport(); |
| 221 } else if (proto.has_scroll_update()) { |
| 222 event->data.scrollUpdate.deltaX = proto.scroll_update().delta_x(); |
| 223 event->data.scrollUpdate.deltaY = proto.scroll_update().delta_y(); |
| 224 event->data.scrollUpdate.velocityX = proto.scroll_update().velocity_x(); |
| 225 event->data.scrollUpdate.velocityY = proto.scroll_update().velocity_y(); |
| 226 event->data.scrollUpdate.previousUpdateInSequencePrevented = |
| 227 proto.scroll_update().previous_update_in_sequence_prevented(); |
| 228 event->data.scrollUpdate.preventPropagation = |
| 229 proto.scroll_update().prevent_propagation(); |
| 230 event->data.scrollUpdate.inertial = proto.scroll_update().inertial(); |
| 231 } else if (proto.has_fling_start()) { |
| 232 event->data.flingStart.velocityX = proto.fling_start().velocity_x(); |
| 233 event->data.flingStart.velocityY = proto.fling_start().velocity_y(); |
| 234 event->data.flingStart.targetViewport = |
| 235 proto.fling_start().target_viewport(); |
| 236 } else if (proto.has_fling_cancel()) { |
| 237 event->data.flingCancel.preventBoosting = |
| 238 proto.fling_cancel().prevent_boosting(); |
| 239 } else if (proto.has_pinch_update()) { |
| 240 event->data.pinchUpdate.zoomDisabled = proto.pinch_update().zoom_disabled(); |
| 241 event->data.pinchUpdate.scale = proto.pinch_update().scale(); |
| 242 } |
| 243 |
| 244 return event.Pass(); |
| 245 } |
| 246 |
| 247 } // namespace |
| 248 |
| 249 void WebInputEventToProto(const blink::WebInputEvent& event, |
| 250 InputMessage* proto) { |
| 251 // Serialize the common WebInputEvent fields. |
| 252 proto->set_type(WebInputEventTypeToProto(event.type)); |
| 253 proto->set_timestamp_seconds(event.timeStampSeconds); |
| 254 |
| 255 // Serialize the specific WebInputEvent fields. |
| 256 if (event.type >= blink::WebInputEvent::Type::GestureTypeFirst && |
| 257 event.type <= blink::WebInputEvent::Type::GestureTypeLast) { |
| 258 WebGestureEventToProto(*static_cast<const blink::WebGestureEvent*>(&event), |
| 259 proto->mutable_gesture()); |
| 260 } else { |
| 261 NOTIMPLEMENTED(); |
| 262 } |
| 263 } |
| 264 |
| 265 scoped_ptr<blink::WebInputEvent> ProtoToWebInputEvent( |
| 266 const InputMessage& proto) { |
| 267 blink::WebInputEvent::Type type = ProtoToWebInputEventType(proto.type()); |
| 268 |
| 269 scoped_ptr<blink::WebInputEvent> event; |
| 270 |
| 271 // Build the specific type of WebInputEvent and deserialize the specific |
| 272 // fields. |
| 273 if (type >= blink::WebInputEvent::Type::GestureTypeFirst && |
| 274 type <= blink::WebInputEvent::Type::GestureTypeLast) { |
| 275 DCHECK(proto.has_gesture()); |
| 276 event = ProtoToWebGestureEvent(proto.gesture()).Pass(); |
| 277 } else { |
| 278 NOTIMPLEMENTED(); |
| 279 return nullptr; |
| 280 } |
| 281 |
| 282 // Deserialize the common WebInputEvent fields. |
| 283 event->type = type; |
| 284 event->timeStampSeconds = proto.timestamp_seconds(); |
| 285 |
| 286 return event; |
| 287 } |
| 288 |
| 289 } // namespace blimp |
| OLD | NEW |