blink_input_events_type_converters.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/html_viewer/blink_input_events_type_converters.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/time.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/WebKit/public/web/WebInputEvent.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/event_constants.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo {
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Used for scrolling. This matches Firefox behavior.
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kPixelsPerTick = 53;
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint EventFlagsToWebEventModifiers(int flags) {
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int modifiers = 0;
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (flags & ui::EF_SHIFT_DOWN)
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    modifiers |= blink::WebInputEvent::ShiftKey;
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (flags & ui::EF_CONTROL_DOWN)
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    modifiers |= blink::WebInputEvent::ControlKey;
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (flags & ui::EF_ALT_DOWN)
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    modifiers |= blink::WebInputEvent::AltKey;
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(beng): MetaKey/META_MASK
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (flags & ui::EF_LEFT_MOUSE_BUTTON)
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    modifiers |= blink::WebInputEvent::LeftButtonDown;
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (flags & ui::EF_MIDDLE_MOUSE_BUTTON)
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    modifiers |= blink::WebInputEvent::MiddleButtonDown;
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (flags & ui::EF_RIGHT_MOUSE_BUTTON)
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    modifiers |= blink::WebInputEvent::RightButtonDown;
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (flags & ui::EF_CAPS_LOCK_DOWN)
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    modifiers |= blink::WebInputEvent::CapsLockOn;
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return modifiers;
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint EventFlagsToWebInputEventModifiers(int flags) {
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (flags & ui::EF_SHIFT_DOWN ? blink::WebInputEvent::ShiftKey : 0) |
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (flags & ui::EF_CONTROL_DOWN ? blink::WebInputEvent::ControlKey : 0) |
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (flags & ui::EF_CAPS_LOCK_DOWN ? blink::WebInputEvent::CapsLockOn : 0) |
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (flags & ui::EF_ALT_DOWN ? blink::WebInputEvent::AltKey : 0);
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TODO(erg): This function is extremely hacky and should only be accepted
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// since this is demo code which won't live very long. Actually calculating
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// this accurately would require the native X11 event so we could get accurate
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// key codes via XKeyEventToWindowsKeyCode() and ui::GetCharacterFromXEvent().
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// That option is closed to us, and thus, hack.
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint32_t MakeHackyText(int32_t key_code, int flags) {
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!(flags & ui::EF_SHIFT_DOWN) && key_code >= 'A' && key_code <= 'Z')
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    key_code = key_code + ('a' - 'A');
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return key_code;
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint GetClickCount(int flags) {
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (flags & ui::EF_IS_TRIPLE_CLICK)
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return 3;
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else if (flags & ui::EF_IS_DOUBLE_CLICK)
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return 2;
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return 1;
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<blink::WebInputEvent>
71116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTypeConverter<EventPtr, scoped_ptr<blink::WebInputEvent> >::ConvertTo(
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const EventPtr& event) {
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (event->action == ui::ET_MOUSE_PRESSED ||
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      event->action == ui::ET_MOUSE_RELEASED ||
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      event->action == ui::ET_MOUSE_ENTERED ||
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      event->action == ui::ET_MOUSE_EXITED ||
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      event->action == ui::ET_MOUSE_MOVED ||
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      event->action == ui::ET_MOUSE_DRAGGED) {
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<blink::WebMouseEvent> web_event(new blink::WebMouseEvent);
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->x = event->location->x;
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->y = event->location->y;
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->modifiers = EventFlagsToWebEventModifiers(event->flags);
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->timeStampSeconds =
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF();
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->button = blink::WebMouseEvent::ButtonNone;
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (event->flags & ui::EF_LEFT_MOUSE_BUTTON)
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_event->button = blink::WebMouseEvent::ButtonLeft;
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (event->flags & ui::EF_MIDDLE_MOUSE_BUTTON)
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_event->button = blink::WebMouseEvent::ButtonMiddle;
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (event->flags & ui::EF_RIGHT_MOUSE_BUTTON)
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_event->button = blink::WebMouseEvent::ButtonRight;
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    switch (event->action) {
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case ui::ET_MOUSE_PRESSED:
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        web_event->type = blink::WebInputEvent::MouseDown;
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        web_event->clickCount = GetClickCount(event->flags);
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case ui::ET_MOUSE_RELEASED:
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        web_event->type = blink::WebInputEvent::MouseUp;
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        web_event->clickCount = GetClickCount(event->flags);
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case ui::ET_MOUSE_ENTERED:
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case ui::ET_MOUSE_EXITED:
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case ui::ET_MOUSE_MOVED:
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case ui::ET_MOUSE_DRAGGED:
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        web_event->type = blink::WebInputEvent::MouseMove;
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      default:
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        NOTIMPLEMENTED() << "Received unexpected event: " << event->action;
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return web_event.PassAs<blink::WebInputEvent>();
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if ((event->action == ui::ET_KEY_PRESSED ||
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              event->action == ui::ET_KEY_RELEASED) &&
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch             event->key_data) {
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<blink::WebKeyboardEvent> web_event(new blink::WebKeyboardEvent);
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // TODO(erg): This derivation of is_char is a bad hack, along with our key
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // code and text calculations. Normally, key code calculations need the
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // gfx::NativeEvent, which we don't have access to here. Likewise, the
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // calculation of the |text| is overly simplified for similar
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // reasons. (Contrast with web_input_event_aurax11.cc in content/.)
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool is_char =
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        event->key_data->is_char ||
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        (event->key_data->key_code >= 32 && event->key_data->key_code < 127);
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    switch (event->action) {
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case ui::ET_KEY_PRESSED:
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        web_event->type = is_char ? blink::WebInputEvent::Char :
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            blink::WebInputEvent::RawKeyDown;
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case ui::ET_KEY_RELEASED:
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        web_event->type = blink::WebInputEvent::KeyUp;
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      default:
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        NOTREACHED();
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->modifiers = EventFlagsToWebInputEventModifiers(event->flags);
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->timeStampSeconds =
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF();
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (web_event->modifiers & blink::WebInputEvent::AltKey)
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_event->isSystemKey = true;
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->windowsKeyCode = event->key_data->key_code;
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->nativeKeyCode = event->key_data->key_code;
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->text[0] = MakeHackyText(event->key_data->key_code, event->flags);
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->unmodifiedText[0] = event->key_data->key_code;
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->setKeyIdentifierFromWindowsKeyCode();
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return web_event.PassAs<blink::WebInputEvent>();
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (event->action == ui::ET_MOUSEWHEEL) {
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<blink::WebMouseWheelEvent> web_event(
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new blink::WebMouseWheelEvent);
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->type = blink::WebInputEvent::MouseWheel;
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->button = blink::WebMouseEvent::ButtonNone;
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->modifiers = EventFlagsToWebEventModifiers(event->flags);
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->timeStampSeconds =
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF();
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->x = event->location->x;
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->y = event->location->y;
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if ((event->flags & ui::EF_SHIFT_DOWN) != 0 &&
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        event->wheel_data->x_offset == 0) {
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_event->deltaX = event->wheel_data->y_offset;
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_event->deltaY = 0;
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } else {
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_event->deltaX = event->wheel_data->x_offset;
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_event->deltaY = event->wheel_data->y_offset;
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->wheelTicksX = web_event->deltaX / kPixelsPerTick;
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_event->wheelTicksY = web_event->deltaY / kPixelsPerTick;
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return web_event.PassAs<blink::WebInputEvent>();
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return scoped_ptr<blink::WebInputEvent>();
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace mojo
188