1bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// found in the LICENSE file.
4bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/browser/renderer_host/input/web_input_event_builders_android.h"
6bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
7bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/logging.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/input/motion_event_android.h"
9bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/browser/renderer_host/input/web_input_event_util.h"
10bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/browser/renderer_host/input/web_input_event_util_posix.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion_android.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes_posix.h"
13bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent;
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebKeyboardEvent;
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebGestureEvent;
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent;
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent;
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebTouchEvent;
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebTouchPoint;
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content {
23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochWebKeyboardEvent WebKeyboardEventBuilder::Build(WebInputEvent::Type type,
25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                                int modifiers,
26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                                double time_sec,
27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                                int keycode,
28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                                int unicode_character,
29bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                                bool is_system_key) {
30bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(WebInputEvent::isKeyboardEventType(type));
31bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  WebKeyboardEvent result;
32bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
33bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.type = type;
34bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.modifiers = modifiers;
35bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.timeStampSeconds = time_sec;
36bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  ui::KeyboardCode windows_key_code =
37bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      ui::KeyboardCodeFromAndroidKeyCode(keycode);
38bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  UpdateWindowsKeyCodeAndKeyIdentifier(&result, windows_key_code);
39bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.modifiers |= GetLocationModifiersFromWindowsKeyCode(windows_key_code);
40bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.nativeKeyCode = keycode;
41bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.unmodifiedText[0] = unicode_character;
42bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (result.windowsKeyCode == ui::VKEY_RETURN) {
43bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    // This is the same behavior as GTK:
44bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    // We need to treat the enter key as a key press of character \r. This
45bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    // is apparently just how webkit handles it and what it expects.
46bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    result.unmodifiedText[0] = '\r';
47bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
48bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.text[0] = result.unmodifiedText[0];
49bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.isSystemKey = is_system_key;
50bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
51bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  return result;
52bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
53bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)WebMouseEvent WebMouseEventBuilder::Build(blink::WebInputEvent::Type type,
55bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                          WebMouseEvent::Button button,
56bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                          double time_sec,
57bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                          int window_x,
58bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                          int window_y,
59bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                          int modifiers,
60bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                          int click_count) {
61bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(WebInputEvent::isMouseEventType(type));
62bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  WebMouseEvent result;
63bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
64bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.type = type;
65bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.x = window_x;
66bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.y = window_y;
67bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.windowX = window_x;
68bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.windowY = window_y;
69bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.timeStampSeconds = time_sec;
70bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.clickCount = click_count;
71bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.modifiers = modifiers;
72bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
73bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (type == WebInputEvent::MouseDown || type == WebInputEvent::MouseUp)
74bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    result.button = button;
75bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  else
76bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    result.button = WebMouseEvent::ButtonNone;
77bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
78bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  return result;
79bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
80bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
81bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochWebMouseWheelEvent WebMouseWheelEventBuilder::Build(Direction direction,
82bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                                    double time_sec,
83bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                                    int window_x,
84bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                                    int window_y) {
85bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  WebMouseWheelEvent result;
86bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
87bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.type = WebInputEvent::MouseWheel;
88bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.x = window_x;
89bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.y = window_y;
90bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.windowX = window_x;
91bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.windowY = window_y;
92bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.timeStampSeconds = time_sec;
93bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.button = WebMouseEvent::ButtonNone;
94bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
95bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  // The below choices are matched from GTK.
96bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  const float scrollbar_pixels_per_tick = 160.0f / 3.0f;
97bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
98bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  switch (direction) {
99bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case DIRECTION_UP:
100bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      result.deltaY = scrollbar_pixels_per_tick;
101bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      result.wheelTicksY = 1;
102bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      break;
103bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case DIRECTION_DOWN:
104bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      result.deltaY = -scrollbar_pixels_per_tick;
105bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      result.wheelTicksY = -1;
106bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      break;
107bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case DIRECTION_LEFT:
108bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      result.deltaX = scrollbar_pixels_per_tick;
109bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      result.wheelTicksX = 1;
110bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      break;
111bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case DIRECTION_RIGHT:
112bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      result.deltaX = -scrollbar_pixels_per_tick;
113bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      result.wheelTicksX = -1;
114bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      break;
115bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
116bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
117bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  return result;
118bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
119bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
120bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochWebGestureEvent WebGestureEventBuilder::Build(WebInputEvent::Type type,
121bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                              double time_sec,
122bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                              int x,
123bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                              int y) {
124bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(WebInputEvent::isGestureEventType(type));
125bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  WebGestureEvent result;
126bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
127bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.type = type;
128bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.x = x;
129bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.y = y;
130bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  result.timeStampSeconds = time_sec;
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  result.sourceDevice = blink::WebGestureDeviceTouchscreen;
132bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
133bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  return result;
134bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
135bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
136bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}  // namespace content
137