Chromium Code Reviews| 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 |