15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/ui_events_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/renderer_host/input/web_input_event_util.h"
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/common/input/web_touch_event_traits.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebModifiersToUIFlags(int modifiers) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags = ui::EF_NONE;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::ShiftKey)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_SHIFT_DOWN;
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::ControlKey)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_CONTROL_DOWN;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::AltKey)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_ALT_DOWN;
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::MetaKey)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    flags |= ui::EF_COMMAND_DOWN;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::LeftButtonDown)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_LEFT_MOUSE_BUTTON;
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::RightButtonDown)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_RIGHT_MOUSE_BUTTON;
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::MiddleButtonDown)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_MIDDLE_MOUSE_BUTTON;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::CapsLockOn)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_CAPS_LOCK_DOWN;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return flags;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventType WebTouchPointStateToEventType(
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebTouchPoint::State state) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebTouchPoint::StateReleased:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::ET_TOUCH_RELEASED;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebTouchPoint::StatePressed:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::ET_TOUCH_PRESSED;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebTouchPoint::StateMoved:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::ET_TOUCH_MOVED;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebTouchPoint::StateCancelled:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::ET_TOUCH_CANCELLED;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::ET_UNKNOWN;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebTouchPoint::State TouchPointStateFromEvent(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::TouchEvent& event) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event.type()) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_PRESSED:
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebTouchPoint::StatePressed;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_RELEASED:
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebTouchPoint::StateReleased;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_MOVED:
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebTouchPoint::StateMoved;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_CANCELLED:
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebTouchPoint::StateCancelled;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebTouchPoint::StateUndefined;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebInputEvent::Type TouchEventTypeFromEvent(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::TouchEvent& event) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event.type()) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_PRESSED:
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebInputEvent::TouchStart;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_RELEASED:
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebInputEvent::TouchEnd;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_MOVED:
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebInputEvent::TouchMove;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_CANCELLED:
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebInputEvent::TouchCancel;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebInputEvent::Undefined;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MakeUITouchEventsFromWebTouchEvents(
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const TouchEventWithLatencyInfo& touch_with_latency,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedVector<ui::TouchEvent>* list,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TouchEventCoordinateSystem coordinate_system) {
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const blink::WebTouchEvent& touch = touch_with_latency.event;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::EventType type = ui::ET_UNKNOWN;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (touch.type) {
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebInputEvent::TouchStart:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type = ui::ET_TOUCH_PRESSED;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebInputEvent::TouchEnd:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type = ui::ET_TOUCH_RELEASED;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebInputEvent::TouchMove:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type = ui::ET_TOUCH_MOVED;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebInputEvent::TouchCancel:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type = ui::ET_TOUCH_CANCELLED;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags = WebModifiersToUIFlags(touch.modifiers);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<int64>(touch.timeStampSeconds * 1000000));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned i = 0; i < touch.touchesLength; ++i) {
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebTouchPoint& point = touch.touches[i];
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WebTouchPointStateToEventType(point.state) != type)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // ui events start in the co-ordinate space of the EventDispatcher.
12823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    gfx::PointF location;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (coordinate_system == LOCAL_COORDINATES)
13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      location = point.position;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      location = point.screenPosition;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::TouchEvent* uievent = new ui::TouchEvent(type,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          location,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          flags,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          point.id,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          timestamp,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          point.radiusX,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          point.radiusY,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          point.rotationAngle,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          point.force);
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    uievent->set_latency(touch_with_latency.latency);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list->push_back(uievent);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEventFromUIEvent(
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::GestureEvent& event) {
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent gesture_event;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event.type()) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_TAP:
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureTap;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.tap.tapCount = event.details().tap_count();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.tap.width = event.details().bounding_box().width();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.tap.height = event.details().bounding_box().height();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_TAP_DOWN:
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureTapDown;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.tapDown.width =
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().width();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.tapDown.height =
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().height();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case ui::ET_GESTURE_SHOW_PRESS:
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureShowPress;
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      gesture_event.data.showPress.width =
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          event.details().bounding_box().width();
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      gesture_event.data.showPress.height =
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          event.details().bounding_box().height();
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_TAP_CANCEL:
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureTapCancel;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_BEGIN:
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureScrollBegin;
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gesture_event.data.scrollBegin.deltaXHint =
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          event.details().scroll_x_hint();
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gesture_event.data.scrollBegin.deltaYHint =
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          event.details().scroll_y_hint();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_UPDATE:
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureScrollUpdate;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.scrollUpdate.deltaX = event.details().scroll_x();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.scrollUpdate.deltaY = event.details().scroll_y();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_END:
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureScrollEnd;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_BEGIN:
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GesturePinchBegin;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_UPDATE:
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GesturePinchUpdate;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.pinchUpdate.scale = event.details().scale();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_END:
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GesturePinchEnd;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_SCROLL_FLING_START:
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureFlingStart;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.flingStart.velocityX = event.details().velocity_x();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.flingStart.velocityY = event.details().velocity_y();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_SCROLL_FLING_CANCEL:
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureFlingCancel;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_LONG_PRESS:
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureLongPress;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.longPress.width =
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().width();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.longPress.height =
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().height();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_LONG_TAP:
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureLongTap;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.longPress.width =
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().width();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.longPress.height =
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().height();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_TWO_FINGER_TAP:
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureTwoFingerTap;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.twoFingerTap.firstFingerWidth =
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().first_finger_width();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.twoFingerTap.firstFingerHeight =
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().first_finger_height();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_BEGIN:
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_END:
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ui::ET_GESTURE_SWIPE:
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::Undefined;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unknown gesture type: " << event.type();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gesture_event.sourceDevice = blink::WebGestureDeviceTouchscreen;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.modifiers = EventFlagsToWebEventModifiers(event.flags());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.timeStampSeconds = event.time_stamp().InSecondsF();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gesture_event;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebTouchPoint* UpdateWebTouchEventFromUIEvent(
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::TouchEvent& event,
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebTouchEvent* web_event) {
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebTouchPoint* point = NULL;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event.type()) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_PRESSED:
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Add a new touch point.
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (web_event->touchesLength < blink::WebTouchEvent::touchesLengthCap) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        point = &web_event->touches[web_event->touchesLength++];
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        point->id = event.touch_id();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_RELEASED:
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_CANCELLED:
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_MOVED: {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The touch point should have been added to the event from an earlier
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // _PRESSED event. So find that.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // At the moment, only a maximum of 4 touch-points are allowed. So a
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // simple loop should be sufficient.
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (unsigned i = 0; i < web_event->touchesLength; ++i) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        point = web_event->touches + i;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (point->id == event.touch_id())
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        point = NULL;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DLOG(WARNING) << "Unknown touch event " << event.type();
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!point)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The spec requires the radii values to be positive (and 1 when unknown).
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->radiusX = std::max(1.f, event.radius_x());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->radiusY = std::max(1.f, event.radius_y());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->rotationAngle = event.rotation_angle();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->force = event.force();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the location and state of the point.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->state = TouchPointStateFromEvent(event);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->position.x = event.x();
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->position.y = event.y();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const gfx::PointF& root_point = event.root_location_f();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->screenPosition.x = root_point.x();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->screenPosition.y = root_point.y();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark the rest of the points as stationary.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned i = 0; i < web_event->touchesLength; ++i) {
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebTouchPoint* iter = web_event->touches + i;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iter != point)
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      iter->state = blink::WebTouchPoint::StateStationary;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the type of the touch event.
3045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebTouchEventTraits::ResetType(TouchEventTypeFromEvent(event),
3055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                 event.time_stamp().InSecondsF(),
3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                 web_event);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_event->modifiers = EventFlagsToWebEventModifiers(event.flags());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return point;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
313