blob: 99427c6a155d87e2e22d5d2821bddb1842f6f56b [file] [log] [blame]
// 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