• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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