web_input_event_aura.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/ui_events_helper.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(USE_OZONE)
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(USE_X11) || defined(USE_OZONE)
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// From third_party/WebKit/Source/web/gtk/WebInputEventFactory.cpp:
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebUChar GetControlCharacter(int windows_key_code, bool shift) {
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (windows_key_code >= ui::VKEY_A &&
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    windows_key_code <= ui::VKEY_Z) {
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // ctrl-A ~ ctrl-Z map to \x01 ~ \x1A
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return windows_key_code - ui::VKEY_A + 1;
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (shift) {
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // following graphics chars require shift key to input.
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    switch (windows_key_code) {
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // ctrl-@ maps to \x00 (Null byte)
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case ui::VKEY_2:
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return 0;
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // ctrl-^ maps to \x1E (Record separator, Information separator two)
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case ui::VKEY_6:
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return 0x1E;
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // ctrl-_ maps to \x1F (Unit separator, Information separator one)
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case ui::VKEY_OEM_MINUS:
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return 0x1F;
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // Returns 0 for all other keys to avoid inputting unexpected chars.
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      default:
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  } else {
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    switch (windows_key_code) {
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // ctrl-[ maps to \x1B (Escape)
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case ui::VKEY_OEM_4:
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return 0x1B;
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // ctrl-\ maps to \x1C (File separator, Information separator four)
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case ui::VKEY_OEM_5:
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return 0x1C;
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // ctrl-] maps to \x1D (Group separator, Information separator three)
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case ui::VKEY_OEM_6:
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return 0x1D;
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // ctrl-Enter maps to \x0A (Line feed)
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case ui::VKEY_RETURN:
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return 0x0A;
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // Returns 0 for all other keys to avoid inputting unexpected chars.
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      default:
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return 0;
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeUntranslatedWebMouseEventFromNativeEvent(
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::NativeEvent& native_event);
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeUntranslatedWebMouseWheelEventFromNativeEvent(
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::NativeEvent& native_event);
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebKeyboardEvent MakeWebKeyboardEventFromNativeEvent(
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::NativeEvent& native_event);
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEventFromNativeEvent(
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::NativeEvent& native_event);
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#elif defined(USE_X11)
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::KeyEvent* event);
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#elif defined(USE_OZONE)
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent(
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ui::KeyEvent* event) {
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::NativeEvent& native_event = event->native_event();
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ui::EventType type = ui::EventTypeFromNative(native_event);
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebKeyboardEvent webkit_event;
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.timeStampSeconds = event->time_stamp().InSecondsF();
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags());
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  switch (type) {
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case ui::ET_KEY_PRESSED:
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = event->is_char() ? blink::WebInputEvent::Char :
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          blink::WebInputEvent::RawKeyDown;
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case ui::ET_KEY_RELEASED:
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::KeyUp;
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    default:
95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      NOTREACHED();
96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (webkit_event.modifiers & blink::WebInputEvent::AltKey)
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    webkit_event.isSystemKey = true;
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  wchar_t character = ui::KeyboardCodeFromNative(native_event);
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.windowsKeyCode = character;
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.nativeKeyCode = character;
104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (webkit_event.windowsKeyCode == ui::VKEY_RETURN)
106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    webkit_event.unmodifiedText[0] = '\r';
107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  else
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    webkit_event.unmodifiedText[0] = ui::GetCharacterFromKeyCode(
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ui::KeyboardCodeFromNative(native_event),
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ui::EventFlagsFromNative(native_event));
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (webkit_event.modifiers & blink::WebInputEvent::ControlKey) {
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    webkit_event.text[0] =
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        GetControlCharacter(
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            webkit_event.windowsKeyCode,
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            webkit_event.modifiers & blink::WebInputEvent::ShiftKey);
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  } else {
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    webkit_event.text[0] = webkit_event.unmodifiedText[0];
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.setKeyIdentifierFromWindowsKeyCode();
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return webkit_event;
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(USE_X11) || defined(USE_OZONE)
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent(
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ui::ScrollEvent* event) {
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event;
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  webkit_event.type = blink::WebInputEvent::MouseWheel;
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  webkit_event.button = blink::WebMouseEvent::ButtonNone;
133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags());
134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.timeStampSeconds = event->time_stamp().InSecondsF();
135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.hasPreciseScrollingDeltas = true;
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  float offset_ordinal_x = 0.f;
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  float offset_ordinal_y = 0.f;
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if ((event->flags() & ui::EF_SHIFT_DOWN) != 0 && event->x_offset() == 0) {
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaX = event->y_offset();
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaY = 0;
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    offset_ordinal_x = event->y_offset_ordinal();
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    offset_ordinal_y = event->x_offset_ordinal();
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaX = event->x_offset();
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaY = event->y_offset();
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    offset_ordinal_x = event->x_offset_ordinal();
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    offset_ordinal_y = event->y_offset_ordinal();
149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (offset_ordinal_x != 0.f && webkit_event.deltaX != 0.f)
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.accelerationRatioX = offset_ordinal_x / webkit_event.deltaX;
153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.wheelTicksX = webkit_event.deltaX / kPixelsPerTick;
154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick;
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (offset_ordinal_y != 0.f && webkit_event.deltaY != 0.f)
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.accelerationRatioY = offset_ordinal_y / webkit_event.deltaY;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return webkit_event;
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEventFromAuraEvent(
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ui::ScrollEvent* event) {
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent webkit_event;
163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  switch (event->type()) {
165d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case ui::ET_SCROLL_FLING_START:
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::GestureFlingStart;
167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      webkit_event.data.flingStart.velocityX = event->x_offset();
168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      webkit_event.data.flingStart.velocityY = event->y_offset();
169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case ui::ET_SCROLL_FLING_CANCEL:
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::GestureFlingCancel;
172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case ui::ET_SCROLL:
174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      NOTREACHED() << "Invalid gesture type: " << event->type();
175d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    default:
177d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      NOTREACHED() << "Unknown gesture type: " << event->type();
178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  webkit_event.sourceDevice = blink::WebGestureDeviceTouchpad;
181d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags());
182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  webkit_event.timeStampSeconds = event->time_stamp().InSecondsF();
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return webkit_event;
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeWebMouseEventFromAuraEvent(
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent* event);
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent(
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseWheelEvent* event);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// General approach:
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::Event only carries a subset of possible event data provided to Aura by
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the host platform. WebKit utilizes a larger subset of that information than
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Aura itself. WebKit includes some built in cracking functionality that we
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rely on to obtain this information cleanly and consistently.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The only place where an ui::Event's data differs from what the underlying
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::NativeEvent would provide is position data, since we would like to
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provide coordinates relative to the aura::Window that is hosting the
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// renderer, not the top level platform window.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// The approach is to fully construct a blink::WebInputEvent from the
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::Event's base::NativeEvent, and then replace the coordinate fields with
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the translated values from the ui::Event.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The exception is mouse events on linux. The ui::MouseEvent contains enough
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// necessary information to construct a WebMouseEvent. So instead of extracting
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the information from the XEvent, which can be tricky when supporting both
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XInput2 and XInput, the WebMouseEvent is constructed from the
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::MouseEvent. This will not be necessary once only XInput2 is supported.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeWebMouseEvent(ui::MouseEvent* event) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct an untranslated event from the platform event data.
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent webkit_event =
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Windows we have WM_ events comming from desktop and pure aura
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // events comming from metro mode.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->native_event().message ?
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeUntranslatedWebMouseEventFromNativeEvent(event->native_event()) :
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeWebMouseEventFromAuraEvent(event);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeWebMouseEventFromAuraEvent(event);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Replace the event's coordinate fields with translated position data from
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |event|.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowX = webkit_event.x = event->x();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowY = webkit_event.y = event->y();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(OS_WIN)
234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (event->native_event().message)
235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return webkit_event;
236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point root_point = event->root_location();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalX = root_point.x();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalY = root_point.y();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webkit_event;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEvent(ui::MouseWheelEvent* event) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct an untranslated event from the platform event data.
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event = event->native_event().message ?
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeUntranslatedWebMouseWheelEventFromNativeEvent(event->native_event()) :
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeWebMouseWheelEventFromAuraEvent(event);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event =
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeWebMouseWheelEventFromAuraEvent(event);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Replace the event's coordinate fields with translated position data from
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |event|.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowX = webkit_event.x = event->x();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowY = webkit_event.y = event->y();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point root_point = event->root_location();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalX = root_point.x();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalY = root_point.y();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webkit_event;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEvent(ui::ScrollEvent* event) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct an untranslated event from the platform event data.
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event =
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeUntranslatedWebMouseWheelEventFromNativeEvent(event->native_event());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event =
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeWebMouseWheelEventFromAuraEvent(event);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Replace the event's coordinate fields with translated position data from
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |event|.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowX = webkit_event.x = event->x();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.windowY = webkit_event.y = event->y();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point root_point = event->root_location();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalX = root_point.x();
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.globalY = root_point.y();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webkit_event;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebKeyboardEvent MakeWebKeyboardEvent(ui::KeyEvent* event) {
290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!event->HasNativeEvent())
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return blink::WebKeyboardEvent();
292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Windows can figure out whether or not to construct a RawKeyDown or a Char
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebInputEvent based on the type of message carried in
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event->native_event(). X11 is not so fortunate, there is no separate
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // translated event type, so DesktopHostLinux sends an extra KeyEvent with
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is_char() == true. We need to pass the ui::KeyEvent to the X11 function
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to detect this case so the right event type can be constructed.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key events require no translation by the aura system.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MakeWebKeyboardEventFromNativeEvent(event->native_event());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MakeWebKeyboardEventFromAuraEvent(event);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEvent(ui::GestureEvent* event) {
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent gesture_event;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event->HasNativeEvent())
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gesture_event = MakeWebGestureEventFromNativeEvent(event->native_event());
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gesture_event = MakeWebGestureEventFromUIEvent(*event);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event = MakeWebGestureEventFromUIEvent(*event);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.x = event->x();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.y = event->y();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point root_point = event->root_location();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.globalX = root_point.x();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.globalY = root_point.y();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gesture_event;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEvent(ui::ScrollEvent* event) {
329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent gesture_event;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event = MakeWebGestureEventFromNativeEvent(event->native_event());
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event = MakeWebGestureEventFromAuraEvent(event);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.x = event->x();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.y = event->y();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point root_point = event->root_location();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.globalX = root_point.x();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_event.globalY = root_point.y();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gesture_event;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEventFlingCancel() {
348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent gesture_event;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All other fields are ignored on a GestureFlingCancel event.
351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gesture_event.type = blink::WebInputEvent::GestureFlingCancel;
35246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gesture_event.sourceDevice = blink::WebGestureDeviceTouchpad;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gesture_event;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeWebMouseEventFromAuraEvent(ui::MouseEvent* event) {
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent webkit_event;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.timeStampSeconds = event->time_stamp().InSecondsF();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  webkit_event.button = blink::WebMouseEvent::ButtonNone;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->flags() & ui::EF_LEFT_MOUSE_BUTTON)
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    webkit_event.button = blink::WebMouseEvent::ButtonLeft;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->flags() & ui::EF_MIDDLE_MOUSE_BUTTON)
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    webkit_event.button = blink::WebMouseEvent::ButtonMiddle;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->flags() & ui::EF_RIGHT_MOUSE_BUTTON)
368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    webkit_event.button = blink::WebMouseEvent::ButtonRight;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->type()) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_PRESSED:
372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::MouseDown;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      webkit_event.clickCount = event->GetClickCount();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_RELEASED:
376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::MouseUp;
377d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      webkit_event.clickCount = event->GetClickCount();
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_ENTERED:
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_EXITED:
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_MOVED:
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_DRAGGED:
383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      webkit_event.type = blink::WebInputEvent::MouseMove;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIMPLEMENTED() << "Received unexpected event: " << event->type();
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webkit_event;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent(
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseWheelEvent* event) {
395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent webkit_event;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  webkit_event.type = blink::WebInputEvent::MouseWheel;
398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  webkit_event.button = blink::WebMouseEvent::ButtonNone;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags());
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.timeStampSeconds = event->time_stamp().InSecondsF();
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if ((event->flags() & ui::EF_SHIFT_DOWN) != 0 && event->x_offset() == 0) {
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaX = event->y_offset();
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaY = 0;
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaX = event->x_offset();
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    webkit_event.deltaY = event->y_offset();
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
410ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  webkit_event.wheelTicksX = webkit_event.deltaX / kPixelsPerTick;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webkit_event;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
417