| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "blimp/net/input_message_converter.h" |
| |
| #include "base/logging.h" |
| #include "blimp/common/proto/input.pb.h" |
| #include "third_party/WebKit/public/platform/WebGestureDevice.h" |
| #include "third_party/WebKit/public/web/WebInputEvent.h" |
| |
| namespace blimp { |
| namespace { |
| |
| std::unique_ptr<blink::WebGestureEvent> BuildCommonWebGesture( |
| const InputMessage& proto, |
| blink::WebInputEvent::Type type) { |
| std::unique_ptr<blink::WebGestureEvent> event(new blink::WebGestureEvent); |
| event->type = type; |
| event->timeStampSeconds = proto.timestamp_seconds(); |
| |
| const GestureCommon& common = proto.gesture_common(); |
| event->x = common.x(); |
| event->y = common.y(); |
| event->globalX = common.global_x(); |
| event->globalY = common.global_y(); |
| event->sourceDevice = blink::WebGestureDevice::WebGestureDeviceTouchscreen; |
| return event; |
| } |
| |
| std::unique_ptr<blink::WebGestureEvent> ProtoToGestureScrollBegin( |
| const InputMessage& proto) { |
| std::unique_ptr<blink::WebGestureEvent> event(BuildCommonWebGesture( |
| proto, blink::WebInputEvent::Type::GestureScrollBegin)); |
| |
| const GestureScrollBegin& details = proto.gesture_scroll_begin(); |
| event->data.scrollBegin.deltaXHint = details.delta_x_hint(); |
| event->data.scrollBegin.deltaYHint = details.delta_y_hint(); |
| event->data.scrollBegin.targetViewport = details.target_viewport(); |
| |
| return event; |
| } |
| |
| std::unique_ptr<blink::WebGestureEvent> ProtoToGestureScrollEnd( |
| const InputMessage& proto) { |
| return BuildCommonWebGesture(proto, |
| blink::WebInputEvent::Type::GestureScrollEnd); |
| } |
| |
| std::unique_ptr<blink::WebGestureEvent> ProtoToGestureScrollUpdate( |
| const InputMessage& proto) { |
| std::unique_ptr<blink::WebGestureEvent> event(BuildCommonWebGesture( |
| proto, blink::WebInputEvent::Type::GestureScrollUpdate)); |
| |
| const GestureScrollUpdate& details = proto.gesture_scroll_update(); |
| event->data.scrollUpdate.deltaX = details.delta_x(); |
| event->data.scrollUpdate.deltaY = details.delta_y(); |
| event->data.scrollUpdate.velocityX = details.velocity_x(); |
| event->data.scrollUpdate.velocityY = details.velocity_y(); |
| event->data.scrollUpdate.previousUpdateInSequencePrevented = |
| details.previous_update_in_sequence_prevented(); |
| event->data.scrollUpdate.preventPropagation = details.prevent_propagation(); |
| event->data.scrollUpdate.inertial = details.inertial(); |
| |
| return event; |
| } |
| |
| std::unique_ptr<blink::WebGestureEvent> ProtoToGestureFlingStart( |
| const InputMessage& proto) { |
| std::unique_ptr<blink::WebGestureEvent> event(BuildCommonWebGesture( |
| proto, blink::WebInputEvent::Type::GestureFlingStart)); |
| |
| const GestureFlingStart& details = proto.gesture_fling_start(); |
| event->data.flingStart.velocityX = details.velocity_x(); |
| event->data.flingStart.velocityY = details.velocity_y(); |
| event->data.flingStart.targetViewport = details.target_viewport(); |
| |
| return event; |
| } |
| |
| std::unique_ptr<blink::WebGestureEvent> ProtoToGestureFlingCancel( |
| const InputMessage& proto) { |
| std::unique_ptr<blink::WebGestureEvent> event(BuildCommonWebGesture( |
| proto, blink::WebInputEvent::Type::GestureFlingCancel)); |
| |
| const GestureFlingCancel& details = proto.gesture_fling_cancel(); |
| event->data.flingCancel.preventBoosting = details.prevent_boosting(); |
| |
| return event; |
| } |
| |
| std::unique_ptr<blink::WebGestureEvent> ProtoToGestureTap( |
| const InputMessage& proto) { |
| std::unique_ptr<blink::WebGestureEvent> event( |
| BuildCommonWebGesture(proto, blink::WebInputEvent::Type::GestureTap)); |
| |
| const GestureTap& details = proto.gesture_tap(); |
| event->data.tap.tapCount = details.tap_count(); |
| event->data.tap.width = details.width(); |
| event->data.tap.height = details.height(); |
| |
| return event; |
| } |
| |
| std::unique_ptr<blink::WebGestureEvent> ProtoToGesturePinchBegin( |
| const InputMessage& proto) { |
| return BuildCommonWebGesture(proto, |
| blink::WebInputEvent::Type::GesturePinchBegin); |
| } |
| |
| std::unique_ptr<blink::WebGestureEvent> ProtoToGesturePinchEnd( |
| const InputMessage& proto) { |
| return BuildCommonWebGesture(proto, |
| blink::WebInputEvent::Type::GesturePinchEnd); |
| } |
| |
| std::unique_ptr<blink::WebGestureEvent> ProtoToGesturePinchUpdate( |
| const InputMessage& proto) { |
| std::unique_ptr<blink::WebGestureEvent> event(BuildCommonWebGesture( |
| proto, blink::WebInputEvent::Type::GesturePinchUpdate)); |
| |
| const GesturePinchUpdate& details = proto.gesture_pinch_update(); |
| event->data.pinchUpdate.zoomDisabled = details.zoom_disabled(); |
| event->data.pinchUpdate.scale = details.scale(); |
| |
| return event; |
| } |
| |
| } // namespace |
| |
| InputMessageConverter::InputMessageConverter() {} |
| |
| InputMessageConverter::~InputMessageConverter() {} |
| |
| std::unique_ptr<blink::WebGestureEvent> InputMessageConverter::ProcessMessage( |
| const InputMessage& message) { |
| std::unique_ptr<blink::WebGestureEvent> event; |
| |
| switch (message.type()) { |
| case InputMessage::Type_GestureScrollBegin: |
| event = ProtoToGestureScrollBegin(message); |
| break; |
| case InputMessage::Type_GestureScrollEnd: |
| event = ProtoToGestureScrollEnd(message); |
| break; |
| case InputMessage::Type_GestureScrollUpdate: |
| event = ProtoToGestureScrollUpdate(message); |
| break; |
| case InputMessage::Type_GestureFlingStart: |
| event = ProtoToGestureFlingStart(message); |
| break; |
| case InputMessage::Type_GestureFlingCancel: |
| event = ProtoToGestureFlingCancel(message); |
| break; |
| case InputMessage::Type_GestureTap: |
| event = ProtoToGestureTap(message); |
| break; |
| case InputMessage::Type_GesturePinchBegin: |
| event = ProtoToGesturePinchBegin(message); |
| break; |
| case InputMessage::Type_GesturePinchEnd: |
| event = ProtoToGesturePinchEnd(message); |
| break; |
| case InputMessage::Type_GesturePinchUpdate: |
| event = ProtoToGesturePinchUpdate(message); |
| break; |
| case InputMessage::UNKNOWN: |
| DLOG(FATAL) << "Received an InputMessage with an unknown type."; |
| return nullptr; |
| } |
| |
| return event; |
| } |
| |
| ui::TextInputType InputMessageConverter::TextInputTypeFromProto( |
| ImeMessage_InputType type) { |
| switch (type) { |
| case ImeMessage_InputType_NONE: |
| return ui::TEXT_INPUT_TYPE_NONE; |
| case ImeMessage_InputType_TEXT: |
| return ui::TEXT_INPUT_TYPE_TEXT; |
| case ImeMessage_InputType_PASSWORD: |
| return ui::TEXT_INPUT_TYPE_PASSWORD; |
| case ImeMessage_InputType_SEARCH: |
| return ui::TEXT_INPUT_TYPE_SEARCH; |
| case ImeMessage_InputType_EMAIL: |
| return ui::TEXT_INPUT_TYPE_EMAIL; |
| case ImeMessage_InputType_NUMBER: |
| return ui::TEXT_INPUT_TYPE_NUMBER; |
| case ImeMessage_InputType_TELEPHONE: |
| return ui::TEXT_INPUT_TYPE_TELEPHONE; |
| case ImeMessage_InputType_URL: |
| return ui::TEXT_INPUT_TYPE_URL; |
| case ImeMessage_InputType_DATE: |
| return ui::TEXT_INPUT_TYPE_DATE; |
| case ImeMessage_InputType_DATE_TIME: |
| return ui::TEXT_INPUT_TYPE_DATE_TIME; |
| case ImeMessage_InputType_DATE_TIME_LOCAL: |
| return ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL; |
| case ImeMessage_InputType_MONTH: |
| return ui::TEXT_INPUT_TYPE_MONTH; |
| case ImeMessage_InputType_TIME: |
| return ui::TEXT_INPUT_TYPE_TIME; |
| case ImeMessage_InputType_WEEK: |
| return ui::TEXT_INPUT_TYPE_WEEK; |
| case ImeMessage_InputType_TEXT_AREA: |
| return ui::TEXT_INPUT_TYPE_TEXT_AREA; |
| case ImeMessage_InputType_CONTENT_EDITABLE: |
| return ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE; |
| case ImeMessage_InputType_DATE_TIME_FIELD: |
| return ui::TEXT_INPUT_TYPE_DATE_TIME_FIELD; |
| } |
| return ui::TEXT_INPUT_TYPE_NONE; |
| } |
| |
| ImeMessage_InputType InputMessageConverter::TextInputTypeToProto( |
| ui::TextInputType type) { |
| switch (type) { |
| case ui::TEXT_INPUT_TYPE_NONE: |
| NOTREACHED() << "IME needs an editable TextInputType"; |
| return ImeMessage_InputType_NONE; |
| case ui::TEXT_INPUT_TYPE_TEXT: |
| return ImeMessage_InputType_TEXT; |
| case ui::TEXT_INPUT_TYPE_PASSWORD: |
| return ImeMessage_InputType_PASSWORD; |
| case ui::TEXT_INPUT_TYPE_SEARCH: |
| return ImeMessage_InputType_SEARCH; |
| case ui::TEXT_INPUT_TYPE_EMAIL: |
| return ImeMessage_InputType_EMAIL; |
| case ui::TEXT_INPUT_TYPE_NUMBER: |
| return ImeMessage_InputType_NUMBER; |
| case ui::TEXT_INPUT_TYPE_TELEPHONE: |
| return ImeMessage_InputType_TELEPHONE; |
| case ui::TEXT_INPUT_TYPE_URL: |
| return ImeMessage_InputType_URL; |
| case ui::TEXT_INPUT_TYPE_DATE: |
| return ImeMessage_InputType_DATE; |
| case ui::TEXT_INPUT_TYPE_DATE_TIME: |
| return ImeMessage_InputType_DATE_TIME; |
| case ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL: |
| return ImeMessage_InputType_DATE_TIME_LOCAL; |
| case ui::TEXT_INPUT_TYPE_MONTH: |
| return ImeMessage_InputType_MONTH; |
| case ui::TEXT_INPUT_TYPE_TIME: |
| return ImeMessage_InputType_TIME; |
| case ui::TEXT_INPUT_TYPE_WEEK: |
| return ImeMessage_InputType_WEEK; |
| case ui::TEXT_INPUT_TYPE_TEXT_AREA: |
| return ImeMessage_InputType_TEXT_AREA; |
| case ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE: |
| return ImeMessage_InputType_CONTENT_EDITABLE; |
| case ui::TEXT_INPUT_TYPE_DATE_TIME_FIELD: |
| return ImeMessage_InputType_DATE_TIME_FIELD; |
| } |
| return ImeMessage_InputType_NONE; |
| } |
| |
| } // namespace blimp |