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/web_input_event_aura.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/renderer_host/input/web_input_event_util.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/ui_events_helper.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#if defined(USE_X11) || defined(USE_OZONE)
1434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#include "ui/events/keycodes/dom4/keycode_converter.h"
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeUntranslatedWebMouseEventFromNativeEvent(
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::NativeEvent& native_event);
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeUntranslatedWebMouseWheelEventFromNativeEvent(
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::NativeEvent& native_event);
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebKeyboardEvent MakeWebKeyboardEventFromNativeEvent(
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::NativeEvent& native_event);
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEventFromNativeEvent(
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::NativeEvent& native_event);
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_X11) || defined(USE_OZONE)
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent(
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ui::KeyEvent* event) {
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebKeyboardEvent webkit_event;
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.timeStampSeconds = event->time_stamp().InSecondsF();
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags());
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (event->type()) {
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case ui::ET_KEY_PRESSED:
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = event->is_char() ? blink::WebInputEvent::Char :
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          blink::WebInputEvent::RawKeyDown;
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case ui::ET_KEY_RELEASED:
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::KeyUp;
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    default:
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      NOTREACHED();
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (webkit_event.modifiers & blink::WebInputEvent::AltKey)
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    webkit_event.isSystemKey = true;
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  webkit_event.windowsKeyCode = event->GetLocatedWindowsKeyboardCode();
5334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  webkit_event.nativeKeyCode =
5434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    ui::KeycodeConverter::CodeToNativeKeycode(event->code().c_str());
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  webkit_event.unmodifiedText[0] = event->GetUnmodifiedText();
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  webkit_event.text[0] = event->GetText();
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.setKeyIdentifierFromWindowsKeyCode();
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return webkit_event;
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent(
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ui::ScrollEvent* event) {
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  webkit_event.type = blink::WebInputEvent::MouseWheel;
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  webkit_event.button = blink::WebMouseEvent::ButtonNone;
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags());
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.timeStampSeconds = event->time_stamp().InSecondsF();
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.hasPreciseScrollingDeltas = true;
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  float offset_ordinal_x = 0.f;
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  float offset_ordinal_y = 0.f;
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if ((event->flags() & ui::EF_SHIFT_DOWN) != 0 && event->x_offset() == 0) {
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaX = event->y_offset();
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaY = 0;
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    offset_ordinal_x = event->y_offset_ordinal();
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    offset_ordinal_y = event->x_offset_ordinal();
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaX = event->x_offset();
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaY = event->y_offset();
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    offset_ordinal_x = event->x_offset_ordinal();
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    offset_ordinal_y = event->y_offset_ordinal();
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (offset_ordinal_x != 0.f && webkit_event.deltaX != 0.f)
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.accelerationRatioX = offset_ordinal_x / webkit_event.deltaX;
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.wheelTicksX = webkit_event.deltaX / kPixelsPerTick;
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick;
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (offset_ordinal_y != 0.f && webkit_event.deltaY != 0.f)
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.accelerationRatioY = offset_ordinal_y / webkit_event.deltaY;
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return webkit_event;
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEventFromAuraEvent(
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ui::ScrollEvent* event) {
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent webkit_event;
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  switch (event->type()) {
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case ui::ET_SCROLL_FLING_START:
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::GestureFlingStart;
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      webkit_event.data.flingStart.velocityX = event->x_offset();
104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      webkit_event.data.flingStart.velocityY = event->y_offset();
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case ui::ET_SCROLL_FLING_CANCEL:
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::GestureFlingCancel;
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case ui::ET_SCROLL:
110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      NOTREACHED() << "Invalid gesture type: " << event->type();
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    default:
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      NOTREACHED() << "Unknown gesture type: " << event->type();
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  webkit_event.sourceDevice = blink::WebGestureDeviceTouchpad;
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags());
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.timeStampSeconds = event->time_stamp().InSecondsF();
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return webkit_event;
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeWebMouseEventFromAuraEvent(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent* event);
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent(
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseWheelEvent* event);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// General approach:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::Event only carries a subset of possible event data provided to Aura by
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the host platform. WebKit utilizes a larger subset of that information than
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Aura itself. WebKit includes some built in cracking functionality that we
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rely on to obtain this information cleanly and consistently.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The only place where an ui::Event's data differs from what the underlying
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::NativeEvent would provide is position data, since we would like to
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provide coordinates relative to the aura::Window that is hosting the
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// renderer, not the top level platform window.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// The approach is to fully construct a blink::WebInputEvent from the
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::Event's base::NativeEvent, and then replace the coordinate fields with
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the translated values from the ui::Event.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The exception is mouse events on linux. The ui::MouseEvent contains enough
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// necessary information to construct a WebMouseEvent. So instead of extracting
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the information from the XEvent, which can be tricky when supporting both
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XInput2 and XInput, the WebMouseEvent is constructed from the
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::MouseEvent. This will not be necessary once only XInput2 is supported.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeWebMouseEvent(ui::MouseEvent* event) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct an untranslated event from the platform event data.
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent webkit_event =
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Windows we have WM_ events comming from desktop and pure aura
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // events comming from metro mode.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->native_event().message ?
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeUntranslatedWebMouseEventFromNativeEvent(event->native_event()) :
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeWebMouseEventFromAuraEvent(event);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeWebMouseEventFromAuraEvent(event);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Replace the event's coordinate fields with translated position data from
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |event|.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowX = webkit_event.x = event->x();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowY = webkit_event.y = event->y();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(OS_WIN)
170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (event->native_event().message)
171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return webkit_event;
172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point root_point = event->root_location();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalX = root_point.x();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalY = root_point.y();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webkit_event;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEvent(ui::MouseWheelEvent* event) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct an untranslated event from the platform event data.
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event = event->native_event().message ?
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeUntranslatedWebMouseWheelEventFromNativeEvent(event->native_event()) :
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeWebMouseWheelEventFromAuraEvent(event);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event =
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeWebMouseWheelEventFromAuraEvent(event);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Replace the event's coordinate fields with translated position data from
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |event|.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowX = webkit_event.x = event->x();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowY = webkit_event.y = event->y();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point root_point = event->root_location();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalX = root_point.x();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalY = root_point.y();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webkit_event;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEvent(ui::ScrollEvent* event) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct an untranslated event from the platform event data.
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event =
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeUntranslatedWebMouseWheelEventFromNativeEvent(event->native_event());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event =
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeWebMouseWheelEventFromAuraEvent(event);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Replace the event's coordinate fields with translated position data from
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |event|.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowX = webkit_event.x = event->x();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowY = webkit_event.y = event->y();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point root_point = event->root_location();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalX = root_point.x();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalY = root_point.y();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webkit_event;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebKeyboardEvent MakeWebKeyboardEvent(ui::KeyEvent* event) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Windows can figure out whether or not to construct a RawKeyDown or a Char
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebInputEvent based on the type of message carried in
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event->native_event(). X11 is not so fortunate, there is no separate
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // translated event type, so DesktopHostLinux sends an extra KeyEvent with
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is_char() == true. We need to pass the ui::KeyEvent to the X11 function
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to detect this case so the right event type can be constructed.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!event->HasNativeEvent())
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return blink::WebKeyboardEvent();
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key events require no translation by the aura system.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MakeWebKeyboardEventFromNativeEvent(event->native_event());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MakeWebKeyboardEventFromAuraEvent(event);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEvent(ui::GestureEvent* event) {
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent gesture_event;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event->HasNativeEvent())
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gesture_event = MakeWebGestureEventFromNativeEvent(event->native_event());
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gesture_event = MakeWebGestureEventFromUIEvent(*event);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event = MakeWebGestureEventFromUIEvent(*event);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.x = event->x();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.y = event->y();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point root_point = event->root_location();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.globalX = root_point.x();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.globalY = root_point.y();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gesture_event;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEvent(ui::ScrollEvent* event) {
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent gesture_event;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event = MakeWebGestureEventFromNativeEvent(event->native_event());
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event = MakeWebGestureEventFromAuraEvent(event);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.x = event->x();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.y = event->y();
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point root_point = event->root_location();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.globalX = root_point.x();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.globalY = root_point.y();
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gesture_event;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEventFlingCancel() {
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent gesture_event;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All other fields are ignored on a GestureFlingCancel event.
287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gesture_event.type = blink::WebInputEvent::GestureFlingCancel;
28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gesture_event.sourceDevice = blink::WebGestureDeviceTouchpad;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gesture_event;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeWebMouseEventFromAuraEvent(ui::MouseEvent* event) {
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent webkit_event;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.timeStampSeconds = event->time_stamp().InSecondsF();
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  webkit_event.button = blink::WebMouseEvent::ButtonNone;
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int button_flags = event->flags();
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (event->type() == ui::ET_MOUSE_PRESSED ||
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      event->type() == ui::ET_MOUSE_RELEASED) {
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // We want to use changed_button_flags() for mouse pressed & released.
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // These flags can be used only if they are set which is not always the case
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // (see e.g. GetChangedMouseButtonFlagsFromNative() in events_win.cc).
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (event->changed_button_flags())
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      button_flags = event->changed_button_flags();
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (button_flags & ui::EF_LEFT_MOUSE_BUTTON)
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    webkit_event.button = blink::WebMouseEvent::ButtonLeft;
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (button_flags & ui::EF_MIDDLE_MOUSE_BUTTON)
311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    webkit_event.button = blink::WebMouseEvent::ButtonMiddle;
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (button_flags & ui::EF_RIGHT_MOUSE_BUTTON)
313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    webkit_event.button = blink::WebMouseEvent::ButtonRight;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->type()) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_PRESSED:
317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::MouseDown;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      webkit_event.clickCount = event->GetClickCount();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_RELEASED:
321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::MouseUp;
322d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      webkit_event.clickCount = event->GetClickCount();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_ENTERED:
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_EXITED:
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_MOVED:
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_DRAGGED:
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::MouseMove;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIMPLEMENTED() << "Received unexpected event: " << event->type();
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webkit_event;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent(
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseWheelEvent* event) {
340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  webkit_event.type = blink::WebInputEvent::MouseWheel;
343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  webkit_event.button = blink::WebMouseEvent::ButtonNone;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.timeStampSeconds = event->time_stamp().InSecondsF();
346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if ((event->flags() & ui::EF_SHIFT_DOWN) != 0 && event->x_offset() == 0) {
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaX = event->y_offset();
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaY = 0;
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaX = event->x_offset();
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaY = event->y_offset();
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
355ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  webkit_event.wheelTicksX = webkit_event.deltaX / kPixelsPerTick;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webkit_event;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
362