ui_events_helper.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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)
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/common/input/web_touch_event_traits.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebModifiersToUIFlags(int modifiers) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags = ui::EF_NONE;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::ShiftKey)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_SHIFT_DOWN;
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::ControlKey)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_CONTROL_DOWN;
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::AltKey)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_ALT_DOWN;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::LeftButtonDown)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_LEFT_MOUSE_BUTTON;
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::RightButtonDown)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_RIGHT_MOUSE_BUTTON;
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::MiddleButtonDown)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_MIDDLE_MOUSE_BUTTON;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (modifiers & blink::WebInputEvent::CapsLockOn)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ui::EF_CAPS_LOCK_DOWN;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return flags;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventType WebTouchPointStateToEventType(
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebTouchPoint::State state) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebTouchPoint::StateReleased:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::ET_TOUCH_RELEASED;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebTouchPoint::StatePressed:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::ET_TOUCH_PRESSED;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebTouchPoint::StateMoved:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::ET_TOUCH_MOVED;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebTouchPoint::StateCancelled:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::ET_TOUCH_CANCELLED;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::ET_UNKNOWN;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebTouchPoint::State TouchPointStateFromEvent(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::TouchEvent& event) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event.type()) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_PRESSED:
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebTouchPoint::StatePressed;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_RELEASED:
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebTouchPoint::StateReleased;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_MOVED:
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebTouchPoint::StateMoved;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_CANCELLED:
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebTouchPoint::StateCancelled;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebTouchPoint::StateUndefined;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebInputEvent::Type TouchEventTypeFromEvent(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::TouchEvent& event) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event.type()) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_PRESSED:
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebInputEvent::TouchStart;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_RELEASED:
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebInputEvent::TouchEnd;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_MOVED:
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebInputEvent::TouchMove;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_CANCELLED:
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebInputEvent::TouchCancel;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebInputEvent::Undefined;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MakeUITouchEventsFromWebTouchEvents(
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const TouchEventWithLatencyInfo& touch_with_latency,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedVector<ui::TouchEvent>* list,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TouchEventCoordinateSystem coordinate_system) {
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const blink::WebTouchEvent& touch = touch_with_latency.event;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::EventType type = ui::ET_UNKNOWN;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (touch.type) {
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebInputEvent::TouchStart:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type = ui::ET_TOUCH_PRESSED;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebInputEvent::TouchEnd:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type = ui::ET_TOUCH_RELEASED;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebInputEvent::TouchMove:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type = ui::ET_TOUCH_MOVED;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebInputEvent::TouchCancel:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type = ui::ET_TOUCH_CANCELLED;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags = WebModifiersToUIFlags(touch.modifiers);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<int64>(touch.timeStampSeconds * 1000000));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned i = 0; i < touch.touchesLength; ++i) {
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebTouchPoint& point = touch.touches[i];
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WebTouchPointStateToEventType(point.state) != type)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // ui events start in the co-ordinate space of the EventDispatcher.
12523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    gfx::PointF location;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (coordinate_system == LOCAL_COORDINATES)
12723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      location = point.position;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
12923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      location = point.screenPosition;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::TouchEvent* uievent = new ui::TouchEvent(type,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          location,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          flags,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          point.id,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          timestamp,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          point.radiusX,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          point.radiusY,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          point.rotationAngle,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          point.force);
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    uievent->set_latency(touch_with_latency.latency);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list->push_back(uievent);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEventFromUIEvent(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::GestureEvent& event) {
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent gesture_event;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event.type()) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_TAP:
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureTap;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.tap.tapCount = event.details().tap_count();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.tap.width = event.details().bounding_box().width();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.tap.height = event.details().bounding_box().height();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_TAP_DOWN:
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureTapDown;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.tapDown.width =
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().width();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.tapDown.height =
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().height();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case ui::ET_GESTURE_SHOW_PRESS:
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureShowPress;
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      gesture_event.data.showPress.width =
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          event.details().bounding_box().width();
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      gesture_event.data.showPress.height =
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          event.details().bounding_box().height();
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_TAP_CANCEL:
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureTapCancel;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_BEGIN:
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureScrollBegin;
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gesture_event.data.scrollBegin.deltaXHint =
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          event.details().scroll_x_hint();
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gesture_event.data.scrollBegin.deltaYHint =
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          event.details().scroll_y_hint();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_UPDATE:
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureScrollUpdate;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.scrollUpdate.deltaX = event.details().scroll_x();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.scrollUpdate.deltaY = event.details().scroll_y();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_END:
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureScrollEnd;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_BEGIN:
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GesturePinchBegin;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_UPDATE:
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GesturePinchUpdate;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.pinchUpdate.scale = event.details().scale();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_END:
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GesturePinchEnd;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_SCROLL_FLING_START:
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureFlingStart;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.flingStart.velocityX = event.details().velocity_x();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.flingStart.velocityY = event.details().velocity_y();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_SCROLL_FLING_CANCEL:
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureFlingCancel;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_LONG_PRESS:
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureLongPress;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.longPress.width =
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().width();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.longPress.height =
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().height();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_LONG_TAP:
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureLongTap;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.longPress.width =
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().width();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.longPress.height =
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().bounding_box().height();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_TWO_FINGER_TAP:
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::GestureTwoFingerTap;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.twoFingerTap.firstFingerWidth =
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().first_finger_width();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_event.data.twoFingerTap.firstFingerHeight =
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.details().first_finger_height();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_BEGIN:
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_END:
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ui::ET_GESTURE_SWIPE:
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gesture_event.type = blink::WebInputEvent::Undefined;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unknown gesture type: " << event.type();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gesture_event.sourceDevice = blink::WebGestureEvent::Touchscreen;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.modifiers = EventFlagsToWebEventModifiers(event.flags());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.timeStampSeconds = event.time_stamp().InSecondsF();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gesture_event;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int EventFlagsToWebEventModifiers(int flags) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & ui::EF_SHIFT_DOWN)
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    modifiers |= blink::WebInputEvent::ShiftKey;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & ui::EF_CONTROL_DOWN)
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    modifiers |= blink::WebInputEvent::ControlKey;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & ui::EF_ALT_DOWN)
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    modifiers |= blink::WebInputEvent::AltKey;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(beng): MetaKey/META_MASK
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & ui::EF_LEFT_MOUSE_BUTTON)
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    modifiers |= blink::WebInputEvent::LeftButtonDown;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & ui::EF_MIDDLE_MOUSE_BUTTON)
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    modifiers |= blink::WebInputEvent::MiddleButtonDown;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & ui::EF_RIGHT_MOUSE_BUTTON)
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    modifiers |= blink::WebInputEvent::RightButtonDown;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & ui::EF_CAPS_LOCK_DOWN)
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    modifiers |= blink::WebInputEvent::CapsLockOn;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return modifiers;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebTouchPoint* UpdateWebTouchEventFromUIEvent(
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::TouchEvent& event,
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebTouchEvent* web_event) {
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebTouchPoint* point = NULL;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event.type()) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_PRESSED:
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Add a new touch point.
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (web_event->touchesLength < blink::WebTouchEvent::touchesLengthCap) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        point = &web_event->touches[web_event->touchesLength++];
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        point->id = event.touch_id();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_RELEASED:
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_CANCELLED:
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_TOUCH_MOVED: {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The touch point should have been added to the event from an earlier
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // _PRESSED event. So find that.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // At the moment, only a maximum of 4 touch-points are allowed. So a
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // simple loop should be sufficient.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (unsigned i = 0; i < web_event->touchesLength; ++i) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        point = web_event->touches + i;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (point->id == event.touch_id())
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        point = NULL;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DLOG(WARNING) << "Unknown touch event " << event.type();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!point)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The spec requires the radii values to be positive (and 1 when unknown).
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->radiusX = std::max(1.f, event.radius_x());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->radiusY = std::max(1.f, event.radius_y());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->rotationAngle = event.rotation_angle();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->force = event.force();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the location and state of the point.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->state = TouchPointStateFromEvent(event);
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (point->state == blink::WebTouchPoint::StateMoved) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // It is possible for badly written touch drivers to emit Move events even
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // when the touch location hasn't changed. In such cases, consume the event
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and pretend nothing happened.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (point->position.x == event.x() && point->position.y == event.y())
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->position.x = event.x();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->position.y = event.y();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point root_point = event.root_location();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->screenPosition.x = root_point.x();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  point->screenPosition.y = root_point.y();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark the rest of the points as stationary.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned i = 0; i < web_event->touchesLength; ++i) {
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebTouchPoint* iter = web_event->touches + i;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iter != point)
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      iter->state = blink::WebTouchPoint::StateStationary;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the type of the touch event.
3295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebTouchEventTraits::ResetType(TouchEventTypeFromEvent(event),
3305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                 event.time_stamp().InSecondsF(),
3315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                 web_event);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_event->modifiers = EventFlagsToWebEventModifiers(event.flags());
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return point;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
338