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