OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |