14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/input/synthetic_web_input_event_builders.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/logging.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace content {
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent;
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebKeyboardEvent;
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebGestureEvent;
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent;
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent;
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent;
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchPoint;
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebMouseEvent SyntheticWebMouseEventBuilder::Build(
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebInputEvent::Type type) {
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebMouseEvent result;
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.type = type;
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return result;
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebMouseEvent SyntheticWebMouseEventBuilder::Build(
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebInputEvent::Type type,
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    int window_x,
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    int window_y,
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    int modifiers) {
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(WebInputEvent::isMouseEventType(type));
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebMouseEvent result = Build(type);
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.x = window_x;
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.y = window_y;
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.windowX = window_x;
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.windowY = window_y;
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.modifiers = modifiers;
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (type == WebInputEvent::MouseDown || type == WebInputEvent::MouseUp)
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    result.button = WebMouseEvent::ButtonLeft;
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  else
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    result.button = WebMouseEvent::ButtonNone;
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return result;
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebMouseWheelEvent SyntheticWebMouseWheelEventBuilder::Build(
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebMouseWheelEvent::Phase phase) {
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebMouseWheelEvent result;
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.type = WebInputEvent::MouseWheel;
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.phase = phase;
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return result;
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebMouseWheelEvent SyntheticWebMouseWheelEventBuilder::Build(float dx,
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                             float dy,
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                             int modifiers,
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                             bool precise) {
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebMouseWheelEvent result;
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.type = WebInputEvent::MouseWheel;
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.deltaX = dx;
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.deltaY = dy;
64d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  if (dx)
65d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    result.wheelTicksX = dx > 0.0f ? 1.0f : -1.0f;
66d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  if (dy)
67d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    result.wheelTicksY = dy > 0.0f ? 1.0f : -1.0f;
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.modifiers = modifiers;
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.hasPreciseScrollingDeltas = precise;
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return result;
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebKeyboardEvent SyntheticWebKeyboardEventBuilder::Build(
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebInputEvent::Type type) {
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(WebInputEvent::isKeyboardEventType(type));
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebKeyboardEvent result;
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.type = type;
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.windowsKeyCode = ui::VKEY_L;  // non-null made up value.
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return result;
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebGestureEvent SyntheticWebGestureEventBuilder::Build(
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebInputEvent::Type type,
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebGestureEvent::SourceDevice source_device) {
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(WebInputEvent::isGestureEventType(type));
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebGestureEvent result;
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.type = type;
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.sourceDevice = source_device;
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return result;
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebGestureEvent SyntheticWebGestureEventBuilder::BuildScrollUpdate(
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    float dx,
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    float dy,
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int modifiers) {
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebGestureEvent result = Build(WebInputEvent::GestureScrollUpdate,
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 WebGestureEvent::Touchscreen);
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.data.scrollUpdate.deltaX = dx;
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.data.scrollUpdate.deltaY = dy;
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.modifiers = modifiers;
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return result;
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebGestureEvent SyntheticWebGestureEventBuilder::BuildPinchUpdate(
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    float scale,
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    float anchor_x,
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    float anchor_y,
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int modifiers) {
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebGestureEvent result = Build(WebInputEvent::GesturePinchUpdate,
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 WebGestureEvent::Touchscreen);
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.data.pinchUpdate.scale = scale;
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.x = anchor_x;
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.y = anchor_y;
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.modifiers = modifiers;
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return result;
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebGestureEvent SyntheticWebGestureEventBuilder::BuildFling(
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    float velocity_x,
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    float velocity_y,
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebGestureEvent::SourceDevice source_device) {
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebGestureEvent result = Build(WebInputEvent::GestureFlingStart,
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 source_device);
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.data.flingStart.velocityX = velocity_x;
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.data.flingStart.velocityY = velocity_y;
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return result;
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SyntheticWebTouchEvent::SyntheticWebTouchEvent() : WebTouchEvent() {}
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SyntheticWebTouchEvent::ResetPoints() {
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int point = 0;
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (unsigned int i = 0; i < touchesLength; ++i) {
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (touches[i].state == WebTouchPoint::StateReleased)
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      continue;
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    touches[point] = touches[i];
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    touches[point].state = WebTouchPoint::StateStationary;
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ++point;
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  touchesLength = point;
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  type = WebInputEvent::Undefined;
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)int SyntheticWebTouchEvent::PressPoint(int x, int y) {
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (touchesLength == touchesLengthCap)
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return -1;
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebTouchPoint& point = touches[touchesLength];
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  point.id = touchesLength;
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  point.position.x = point.screenPosition.x = x;
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  point.position.y = point.screenPosition.y = y;
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  point.state = WebTouchPoint::StatePressed;
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  point.radiusX = point.radiusY = 1.f;
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ++touchesLength;
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  type = WebInputEvent::TouchStart;
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return point.id;
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SyntheticWebTouchEvent::MovePoint(int index, int x, int y) {
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CHECK(index >= 0 && index < touchesLengthCap);
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebTouchPoint& point = touches[index];
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  point.position.x = point.screenPosition.x = x;
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  point.position.y = point.screenPosition.y = y;
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  touches[index].state = WebTouchPoint::StateMoved;
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  type = WebInputEvent::TouchMove;
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SyntheticWebTouchEvent::ReleasePoint(int index) {
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CHECK(index >= 0 && index < touchesLengthCap);
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  touches[index].state = WebTouchPoint::StateReleased;
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  type = WebInputEvent::TouchEnd;
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SyntheticWebTouchEvent::CancelPoint(int index) {
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CHECK(index >= 0 && index < touchesLengthCap);
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  touches[index].state = WebTouchPoint::StateCancelled;
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  type = WebInputEvent::TouchCancel;
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SyntheticWebTouchEvent::SetTimestamp(base::TimeDelta timestamp) {
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  timeStampSeconds = timestamp.InSecondsF();
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SyntheticWebTouchEvent SyntheticWebTouchEventBuilder::Build(
1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    WebInputEvent::Type type) {
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(WebInputEvent::isTouchEventType(type));
1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SyntheticWebTouchEvent result;
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result.type = type;
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return result;
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace content
193