// 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 BuildCommonWebGesture( const InputMessage& proto, blink::WebInputEvent::Type type) { std::unique_ptr 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 ProtoToGestureScrollBegin( const InputMessage& proto) { std::unique_ptr 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 ProtoToGestureScrollEnd( const InputMessage& proto) { return BuildCommonWebGesture(proto, blink::WebInputEvent::Type::GestureScrollEnd); } std::unique_ptr ProtoToGestureScrollUpdate( const InputMessage& proto) { std::unique_ptr 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 ProtoToGestureFlingStart( const InputMessage& proto) { std::unique_ptr 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 ProtoToGestureFlingCancel( const InputMessage& proto) { std::unique_ptr 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 ProtoToGestureTap( const InputMessage& proto) { std::unique_ptr 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 ProtoToGesturePinchBegin( const InputMessage& proto) { return BuildCommonWebGesture(proto, blink::WebInputEvent::Type::GesturePinchBegin); } std::unique_ptr ProtoToGesturePinchEnd( const InputMessage& proto) { return BuildCommonWebGesture(proto, blink::WebInputEvent::Type::GesturePinchEnd); } std::unique_ptr ProtoToGesturePinchUpdate( const InputMessage& proto) { std::unique_ptr 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 InputMessageConverter::ProcessMessage( const InputMessage& message) { std::unique_ptr 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