Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: webkit/plugins/ppapi/event_conversion.cc

Issue 7285010: Implement an input event resource. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/plugins/ppapi/event_conversion.h" 5 #include "webkit/plugins/ppapi/event_conversion.h"
6 6
7 #include "base/basictypes.h"
7 #include "base/i18n/char_iterator.h" 8 #include "base/i18n/char_iterator.h"
8 #include "base/logging.h" 9 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
10 #include "base/string_util.h" 11 #include "base/string_util.h"
11 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
12 #include "base/utf_string_conversion_utils.h" 13 #include "base/utf_string_conversion_utils.h"
13 #include "ppapi/c/pp_input_event.h" 14 #include "ppapi/c/pp_input_event.h"
15 #include "ppapi/shared_impl/input_event_impl.h"
14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
15 #include "webkit/plugins/ppapi/common.h" 17 #include "webkit/plugins/ppapi/common.h"
16 18
19 using ppapi::InputEventData;
17 using WebKit::WebInputEvent; 20 using WebKit::WebInputEvent;
18 using WebKit::WebKeyboardEvent; 21 using WebKit::WebKeyboardEvent;
19 using WebKit::WebMouseEvent; 22 using WebKit::WebMouseEvent;
20 using WebKit::WebMouseWheelEvent; 23 using WebKit::WebMouseWheelEvent;
21 24
22 namespace webkit { 25 namespace webkit {
23 namespace ppapi { 26 namespace ppapi {
24 27
25 namespace { 28 namespace {
26 29
(...skipping 23 matching lines...) Expand all
50 return PP_INPUTEVENT_TYPE_CHAR; 53 return PP_INPUTEVENT_TYPE_CHAR;
51 case WebInputEvent::Undefined: 54 case WebInputEvent::Undefined:
52 default: 55 default:
53 return PP_INPUTEVENT_TYPE_UNDEFINED; 56 return PP_INPUTEVENT_TYPE_UNDEFINED;
54 } 57 }
55 } 58 }
56 59
57 // Generates a PP_InputEvent with the fields common to all events, as well as 60 // Generates a PP_InputEvent with the fields common to all events, as well as
58 // the event type from the given web event. Event-specific fields will be zero 61 // the event type from the given web event. Event-specific fields will be zero
59 // initialized. 62 // initialized.
60 PP_InputEvent GetPPEventWithCommonFieldsAndType( 63 InputEventData GetEventWithCommonFieldsAndType(const WebInputEvent& web_event) {
61 const WebInputEvent& web_event) { 64 InputEventData result;
62 PP_InputEvent result; 65 result.event_type = ConvertEventTypes(web_event.type);
63 memset(&result, 0, sizeof(PP_InputEvent));
64 result.type = ConvertEventTypes(web_event.type);
65 // TODO(brettw) http://code.google.com/p/chromium/issues/detail?id=57448 66 // TODO(brettw) http://code.google.com/p/chromium/issues/detail?id=57448
66 // This should use a tick count rather than the wall clock time that WebKit 67 // This should use a tick count rather than the wall clock time that WebKit
67 // uses. 68 // uses.
68 result.time_stamp = web_event.timeStampSeconds; 69 result.event_time_stamp = web_event.timeStampSeconds;
69 return result; 70 return result;
70 } 71 }
71 72
72 void AppendKeyEvent(const WebInputEvent& event, 73 void AppendKeyEvent(const WebInputEvent& event,
73 std::vector<PP_InputEvent>* pp_events) { 74 std::vector<InputEventData>* result_events) {
74 const WebKeyboardEvent& key_event = 75 const WebKeyboardEvent& key_event =
75 reinterpret_cast<const WebKeyboardEvent&>(event); 76 reinterpret_cast<const WebKeyboardEvent&>(event);
dmichael (off chromium) 2011/07/01 20:04:19 static_cast
brettw 2011/07/01 21:14:52 Done.
76 PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event); 77 InputEventData result = GetEventWithCommonFieldsAndType(event);
77 result.u.key.modifier = key_event.modifiers; 78 result.event_modifiers = key_event.modifiers;
78 result.u.key.key_code = key_event.windowsKeyCode; 79 result.key_code = key_event.windowsKeyCode;
79 pp_events->push_back(result); 80 result_events->push_back(result);
80 } 81 }
81 82
82 void AppendCharEvent(const WebInputEvent& event, 83 void AppendCharEvent(const WebInputEvent& event,
83 std::vector<PP_InputEvent>* pp_events) { 84 std::vector<InputEventData>* result_events) {
84 const WebKeyboardEvent& key_event = 85 const WebKeyboardEvent& key_event =
85 reinterpret_cast<const WebKeyboardEvent&>(event); 86 reinterpret_cast<const WebKeyboardEvent&>(event);
86 87
87 // This is a bit complex, the input event will normally just have one 16-bit 88 // This is a bit complex, the input event will normally just have one 16-bit
88 // character in it, but may be zero or more than one. The text array is 89 // character in it, but may be zero or more than one. The text array is
89 // just padded with 0 values for the unused ones, but is not necessarily 90 // just padded with 0 values for the unused ones, but is not necessarily
90 // null-terminated. 91 // null-terminated.
91 // 92 //
92 // Here we see how many UTF-16 characters we have. 93 // Here we see how many UTF-16 characters we have.
93 size_t utf16_char_count = 0; 94 size_t utf16_char_count = 0;
94 while (utf16_char_count < WebKeyboardEvent::textLengthCap && 95 while (utf16_char_count < WebKeyboardEvent::textLengthCap &&
95 key_event.text[utf16_char_count]) 96 key_event.text[utf16_char_count])
96 utf16_char_count++; 97 utf16_char_count++;
97 98
98 // Make a separate PP_InputEvent for each Unicode character in the input. 99 // Make a separate PP_InputEvent for each Unicode character in the input.
99 base::i18n::UTF16CharIterator iter(key_event.text, utf16_char_count); 100 base::i18n::UTF16CharIterator iter(key_event.text, utf16_char_count);
100 while (!iter.end()) { 101 while (!iter.end()) {
101 PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event); 102 InputEventData result = GetEventWithCommonFieldsAndType(event);
102 result.u.character.modifier = key_event.modifiers; 103 result.event_modifiers = key_event.modifiers;
104 base::WriteUnicodeCharacter(iter.get(), &result.character_text);
103 105
104 std::string utf8_char; 106 result_events->push_back(result);
105 base::WriteUnicodeCharacter(iter.get(), &utf8_char);
106 base::strlcpy(result.u.character.text, utf8_char.c_str(),
107 sizeof(result.u.character.text));
108
109 pp_events->push_back(result);
110 iter.Advance(); 107 iter.Advance();
111 } 108 }
112 } 109 }
113 110
114 void AppendMouseEvent(const WebInputEvent& event, 111 void AppendMouseEvent(const WebInputEvent& event,
115 std::vector<PP_InputEvent>* pp_events) { 112 std::vector<InputEventData>* result_events) {
116 COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonNone) == 113 COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonNone) ==
117 static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE), 114 static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE),
118 MouseNone); 115 MouseNone);
119 COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonLeft) == 116 COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonLeft) ==
120 static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_LEFT), 117 static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_LEFT),
121 MouseLeft); 118 MouseLeft);
122 COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonRight) == 119 COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonRight) ==
123 static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_RIGHT), 120 static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_RIGHT),
124 MouseRight); 121 MouseRight);
125 COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonMiddle) == 122 COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonMiddle) ==
126 static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_MIDDLE), 123 static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_MIDDLE),
127 MouseMiddle); 124 MouseMiddle);
128 125
129 const WebMouseEvent& mouse_event = 126 const WebMouseEvent& mouse_event =
130 reinterpret_cast<const WebMouseEvent&>(event); 127 reinterpret_cast<const WebMouseEvent&>(event);
131 PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event); 128 InputEventData result = GetEventWithCommonFieldsAndType(event);
132 result.u.mouse.modifier = mouse_event.modifiers; 129 result.event_modifiers = mouse_event.modifiers;
133 result.u.mouse.button = 130 if (mouse_event.type == WebInputEvent::MouseDown ||
134 static_cast<PP_InputEvent_MouseButton>(mouse_event.button); 131 mouse_event.type == WebInputEvent::MouseUp) {
135 result.u.mouse.x = static_cast<float>(mouse_event.x); 132 result.mouse_button =
136 result.u.mouse.y = static_cast<float>(mouse_event.y); 133 static_cast<PP_InputEvent_MouseButton>(mouse_event.button);
137 result.u.mouse.click_count = mouse_event.clickCount; 134 }
138 pp_events->push_back(result); 135 result.mouse_position.x = mouse_event.x;
136 result.mouse_position.y = mouse_event.y;
137 result.mouse_click_count = mouse_event.clickCount;
138 result_events->push_back(result);
139 } 139 }
140 140
141 void AppendMouseWheelEvent(const WebInputEvent& event, 141 void AppendMouseWheelEvent(const WebInputEvent& event,
142 std::vector<PP_InputEvent>* pp_events) { 142 std::vector<InputEventData>* result_events) {
143 const WebMouseWheelEvent& mouse_wheel_event = 143 const WebMouseWheelEvent& mouse_wheel_event =
144 reinterpret_cast<const WebMouseWheelEvent&>(event); 144 reinterpret_cast<const WebMouseWheelEvent&>(event);
145 PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event); 145 InputEventData result = GetEventWithCommonFieldsAndType(event);
146 result.u.wheel.modifier = mouse_wheel_event.modifiers; 146 result.event_modifiers = mouse_wheel_event.modifiers;
147 result.u.wheel.delta_x = mouse_wheel_event.deltaX; 147 result.wheel_delta.x = mouse_wheel_event.deltaX;
148 result.u.wheel.delta_y = mouse_wheel_event.deltaY; 148 result.wheel_delta.y = mouse_wheel_event.deltaY;
149 result.u.wheel.wheel_ticks_x = mouse_wheel_event.wheelTicksX; 149 result.wheel_ticks.x = mouse_wheel_event.wheelTicksX;
150 result.u.wheel.wheel_ticks_y = mouse_wheel_event.wheelTicksY; 150 result.wheel_ticks.y = mouse_wheel_event.wheelTicksY;
151 result.u.wheel.scroll_by_page = 151 result.wheel_scroll_by_page = mouse_wheel_event.scrollByPage;
152 BoolToPPBool(!!mouse_wheel_event.scrollByPage); 152 result_events->push_back(result);
153 pp_events->push_back(result);
154 } 153 }
155 154
156 WebKeyboardEvent* BuildKeyEvent(const PP_InputEvent& event) { 155 WebKeyboardEvent* BuildKeyEvent(const PP_InputEvent& event) {
157 WebKeyboardEvent* key_event = new WebKeyboardEvent(); 156 WebKeyboardEvent* key_event = new WebKeyboardEvent();
158 switch (event.type) { 157 switch (event.type) {
159 case PP_INPUTEVENT_TYPE_RAWKEYDOWN: 158 case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
160 key_event->type = WebInputEvent::RawKeyDown; 159 key_event->type = WebInputEvent::RawKeyDown;
161 break; 160 break;
162 case PP_INPUTEVENT_TYPE_KEYDOWN: 161 case PP_INPUTEVENT_TYPE_KEYDOWN:
163 key_event->type = WebInputEvent::KeyDown; 162 key_event->type = WebInputEvent::KeyDown;
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 mouse_wheel_event->timeStampSeconds = event.time_stamp; 236 mouse_wheel_event->timeStampSeconds = event.time_stamp;
238 mouse_wheel_event->modifiers = event.u.wheel.modifier; 237 mouse_wheel_event->modifiers = event.u.wheel.modifier;
239 mouse_wheel_event->deltaX = event.u.wheel.delta_x; 238 mouse_wheel_event->deltaX = event.u.wheel.delta_x;
240 mouse_wheel_event->deltaY = event.u.wheel.delta_y; 239 mouse_wheel_event->deltaY = event.u.wheel.delta_y;
241 mouse_wheel_event->wheelTicksX = event.u.wheel.wheel_ticks_x; 240 mouse_wheel_event->wheelTicksX = event.u.wheel.wheel_ticks_x;
242 mouse_wheel_event->wheelTicksY = event.u.wheel.wheel_ticks_y; 241 mouse_wheel_event->wheelTicksY = event.u.wheel.wheel_ticks_y;
243 mouse_wheel_event->scrollByPage = event.u.wheel.scroll_by_page; 242 mouse_wheel_event->scrollByPage = event.u.wheel.scroll_by_page;
244 return mouse_wheel_event; 243 return mouse_wheel_event;
245 } 244 }
246 245
246 void InputEventDataToPPInputEvent(const InputEventData& data,
247 PP_InputEvent* result) {
248 memset(result, 0, sizeof(PP_InputEvent));
249 result->type = data.event_type;
250 result->time_stamp = data.event_time_stamp;
251
252 switch (data.event_type) {
253 case PP_INPUTEVENT_TYPE_MOUSEDOWN:
254 case PP_INPUTEVENT_TYPE_MOUSEUP:
255 case PP_INPUTEVENT_TYPE_MOUSEMOVE:
256 case PP_INPUTEVENT_TYPE_MOUSEENTER:
257 case PP_INPUTEVENT_TYPE_MOUSELEAVE:
258 case PP_INPUTEVENT_TYPE_CONTEXTMENU:
259 result->u.mouse.modifier = data.event_modifiers;
260 result->u.mouse.button = data.mouse_button;
261 result->u.mouse.x = static_cast<float>(data.mouse_position.x);
262 result->u.mouse.y = static_cast<float>(data.mouse_position.y);
263 result->u.mouse.click_count = data.mouse_click_count;
264 break;
265 case PP_INPUTEVENT_TYPE_MOUSEWHEEL:
266 result->u.wheel.modifier = data.event_modifiers;
267 result->u.wheel.delta_x = data.wheel_delta.x;
268 result->u.wheel.delta_y = data.wheel_delta.y;
269 result->u.wheel.wheel_ticks_x = data.wheel_ticks.x;
270 result->u.wheel.wheel_ticks_y = data.wheel_ticks.y;
271 break;
272 case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
273 case PP_INPUTEVENT_TYPE_KEYDOWN:
274 case PP_INPUTEVENT_TYPE_KEYUP:
275 result->u.key.modifier = data.event_modifiers;
276 result->u.key.key_code = data.key_code;
277 break;
278 case PP_INPUTEVENT_TYPE_CHAR:
279 result->u.character.modifier = data.event_modifiers;
280 base::strlcpy(result->u.character.text, data.character_text.c_str(),
281 arraysize(result->u.character.text));
282 break;
283 case PP_INPUTEVENT_TYPE_UNDEFINED:
284 break;
285 }
286 }
287
247 } // namespace 288 } // namespace
248 289
249 void CreatePPEvent(const WebInputEvent& event, 290 void CreatePPEvent(const WebInputEvent& event,
250 std::vector<PP_InputEvent>* pp_events) { 291 std::vector<PP_InputEvent>* pp_events) {
251 pp_events->clear(); 292 std::vector<InputEventData> data;
293 CreateInputEventData(event, &data);
294
295 pp_events->resize(data.size());
296 for (size_t i = 0; i < data.size(); i++)
297 InputEventDataToPPInputEvent(data[i], &(*pp_events)[i]);
298 }
299
300 void CreateInputEventData(const WebInputEvent& event,
301 std::vector<InputEventData>* result) {
302 result->clear();
252 303
253 switch (event.type) { 304 switch (event.type) {
254 case WebInputEvent::MouseDown: 305 case WebInputEvent::MouseDown:
255 case WebInputEvent::MouseUp: 306 case WebInputEvent::MouseUp:
256 case WebInputEvent::MouseMove: 307 case WebInputEvent::MouseMove:
257 case WebInputEvent::MouseEnter: 308 case WebInputEvent::MouseEnter:
258 case WebInputEvent::MouseLeave: 309 case WebInputEvent::MouseLeave:
259 case WebInputEvent::ContextMenu: 310 case WebInputEvent::ContextMenu:
260 AppendMouseEvent(event, pp_events); 311 AppendMouseEvent(event, result);
261 break; 312 break;
262 case WebInputEvent::MouseWheel: 313 case WebInputEvent::MouseWheel:
263 AppendMouseWheelEvent(event, pp_events); 314 AppendMouseWheelEvent(event, result);
264 break; 315 break;
265 case WebInputEvent::RawKeyDown: 316 case WebInputEvent::RawKeyDown:
266 case WebInputEvent::KeyDown: 317 case WebInputEvent::KeyDown:
267 case WebInputEvent::KeyUp: 318 case WebInputEvent::KeyUp:
268 AppendKeyEvent(event, pp_events); 319 AppendKeyEvent(event, result);
269 break; 320 break;
270 case WebInputEvent::Char: 321 case WebInputEvent::Char:
271 AppendCharEvent(event, pp_events); 322 AppendCharEvent(event, result);
272 break; 323 break;
273 case WebInputEvent::Undefined: 324 case WebInputEvent::Undefined:
274 default: 325 default:
275 break; 326 break;
276 } 327 }
277 } 328 }
278 329
279 WebInputEvent* CreateWebInputEvent(const PP_InputEvent& event) { 330 WebInputEvent* CreateWebInputEvent(const PP_InputEvent& event) {
280 scoped_ptr<WebInputEvent> web_input_event; 331 scoped_ptr<WebInputEvent> web_input_event;
281 switch (event.type) { 332 switch (event.type) {
(...skipping 16 matching lines...) Expand all
298 web_input_event.reset(BuildKeyEvent(event)); 349 web_input_event.reset(BuildKeyEvent(event));
299 break; 350 break;
300 case PP_INPUTEVENT_TYPE_CHAR: 351 case PP_INPUTEVENT_TYPE_CHAR:
301 web_input_event.reset(BuildCharEvent(event)); 352 web_input_event.reset(BuildCharEvent(event));
302 break; 353 break;
303 } 354 }
304 355
305 return web_input_event.release(); 356 return web_input_event.release();
306 } 357 }
307 358
359 PP_InputEvent_Class ClassifyInputEvent(WebInputEvent::Type type) {
360 switch (type) {
361 case WebInputEvent::MouseDown:
362 case WebInputEvent::MouseUp:
363 case WebInputEvent::MouseMove:
364 case WebInputEvent::MouseEnter:
365 case WebInputEvent::MouseLeave:
366 case WebInputEvent::ContextMenu:
367 return PP_INPUTEVENT_CLASS_MOUSE;
368 case WebInputEvent::MouseWheel:
369 return PP_INPUTEVENT_CLASS_WHEEL;
370 case WebInputEvent::RawKeyDown:
371 case WebInputEvent::KeyDown:
372 case WebInputEvent::KeyUp:
373 case WebInputEvent::Char:
374 return PP_INPUTEVENT_CLASS_KEYBOARD;
375 case WebInputEvent::Undefined:
376 default:
377 NOTREACHED();
378 return PP_InputEvent_Class(0);
379 }
380 }
381
308 } // namespace ppapi 382 } // namespace ppapi
309 } // namespace webkit 383 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698