OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 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 "webkit/glue/plugins/pepper_event_conversion.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "base/scoped_ptr.h" |
| 9 #include "third_party/ppapi/c/pp_event.h" |
| 10 #include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h" |
| 11 |
| 12 using WebKit::WebInputEvent; |
| 13 using WebKit::WebKeyboardEvent; |
| 14 using WebKit::WebMouseEvent; |
| 15 using WebKit::WebMouseWheelEvent; |
| 16 |
| 17 namespace { |
| 18 // Anonymous namespace for functions converting WebInputEvent to PP_Event and |
| 19 // back. |
| 20 PP_Event_Type ConvertEventTypes(WebInputEvent::Type wetype) { |
| 21 switch (wetype) { |
| 22 case WebInputEvent::MouseDown: |
| 23 return PP_Event_Type_MouseDown; |
| 24 case WebInputEvent::MouseUp: |
| 25 return PP_Event_Type_MouseUp; |
| 26 case WebInputEvent::MouseMove: |
| 27 return PP_Event_Type_MouseMove; |
| 28 case WebInputEvent::MouseEnter: |
| 29 return PP_Event_Type_MouseEnter; |
| 30 case WebInputEvent::MouseLeave: |
| 31 return PP_Event_Type_MouseLeave; |
| 32 case WebInputEvent::MouseWheel: |
| 33 return PP_Event_Type_MouseWheel; |
| 34 case WebInputEvent::RawKeyDown: |
| 35 return PP_Event_Type_RawKeyDown; |
| 36 case WebInputEvent::KeyDown: |
| 37 return PP_Event_Type_KeyDown; |
| 38 case WebInputEvent::KeyUp: |
| 39 return PP_Event_Type_KeyUp; |
| 40 case WebInputEvent::Char: |
| 41 return PP_Event_Type_Char; |
| 42 case WebInputEvent::Undefined: |
| 43 default: |
| 44 return PP_Event_Type_Undefined; |
| 45 } |
| 46 } |
| 47 |
| 48 void BuildKeyEvent(const WebInputEvent* event, PP_Event* pp_event) { |
| 49 const WebKeyboardEvent* key_event = |
| 50 reinterpret_cast<const WebKeyboardEvent*>(event); |
| 51 pp_event->u.key.modifier = key_event->modifiers; |
| 52 pp_event->u.key.normalizedKeyCode = key_event->windowsKeyCode; |
| 53 } |
| 54 |
| 55 void BuildCharEvent(const WebInputEvent* event, PP_Event* pp_event) { |
| 56 const WebKeyboardEvent* key_event = |
| 57 reinterpret_cast<const WebKeyboardEvent*>(event); |
| 58 pp_event->u.character.modifier = key_event->modifiers; |
| 59 // For consistency, check that the sizes of the texts agree. |
| 60 DCHECK(sizeof(pp_event->u.character.text) == sizeof(key_event->text)); |
| 61 DCHECK(sizeof(pp_event->u.character.unmodifiedText) == |
| 62 sizeof(key_event->unmodifiedText)); |
| 63 for (size_t i = 0; i < WebKeyboardEvent::textLengthCap; ++i) { |
| 64 pp_event->u.character.text[i] = key_event->text[i]; |
| 65 pp_event->u.character.unmodifiedText[i] = key_event->unmodifiedText[i]; |
| 66 } |
| 67 } |
| 68 |
| 69 void BuildMouseEvent(const WebInputEvent* event, PP_Event* pp_event) { |
| 70 const WebMouseEvent* mouse_event = |
| 71 reinterpret_cast<const WebMouseEvent*>(event); |
| 72 pp_event->u.mouse.modifier = mouse_event->modifiers; |
| 73 pp_event->u.mouse.button = mouse_event->button; |
| 74 pp_event->u.mouse.x = mouse_event->x; |
| 75 pp_event->u.mouse.y = mouse_event->y; |
| 76 pp_event->u.mouse.clickCount = mouse_event->clickCount; |
| 77 } |
| 78 |
| 79 void BuildMouseWheelEvent(const WebInputEvent* event, PP_Event* pp_event) { |
| 80 const WebMouseWheelEvent* mouse_wheel_event = |
| 81 reinterpret_cast<const WebMouseWheelEvent*>(event); |
| 82 pp_event->u.wheel.modifier = mouse_wheel_event->modifiers; |
| 83 pp_event->u.wheel.deltaX = mouse_wheel_event->deltaX; |
| 84 pp_event->u.wheel.deltaY = mouse_wheel_event->deltaY; |
| 85 pp_event->u.wheel.wheelTicksX = mouse_wheel_event->wheelTicksX; |
| 86 pp_event->u.wheel.wheelTicksY = mouse_wheel_event->wheelTicksY; |
| 87 pp_event->u.wheel.scrollByPage = mouse_wheel_event->scrollByPage; |
| 88 } |
| 89 |
| 90 |
| 91 WebKeyboardEvent* BuildKeyEvent(const PP_Event& event) { |
| 92 WebKeyboardEvent* key_event = new WebKeyboardEvent(); |
| 93 switch (event.type) { |
| 94 case PP_Event_Type_RawKeyDown: |
| 95 key_event->type = WebInputEvent::RawKeyDown; |
| 96 break; |
| 97 case PP_Event_Type_KeyDown: |
| 98 key_event->type = WebInputEvent::KeyDown; |
| 99 break; |
| 100 case PP_Event_Type_KeyUp: |
| 101 key_event->type = WebInputEvent::KeyUp; |
| 102 break; |
| 103 } |
| 104 key_event->timeStampSeconds = event.timeStampSeconds; |
| 105 key_event->modifiers = event.u.key.modifier; |
| 106 key_event->windowsKeyCode = event.u.key.normalizedKeyCode; |
| 107 return key_event; |
| 108 } |
| 109 |
| 110 WebKeyboardEvent* BuildCharEvent(const PP_Event& event) { |
| 111 WebKeyboardEvent* key_event = new WebKeyboardEvent(); |
| 112 key_event->type = WebInputEvent::Char; |
| 113 key_event->timeStampSeconds = event.timeStampSeconds; |
| 114 key_event->modifiers = event.u.character.modifier; |
| 115 // For consistency, check that the sizes of the texts agree. |
| 116 DCHECK(sizeof(event.u.character.text) == sizeof(key_event->text)); |
| 117 DCHECK(sizeof(event.u.character.unmodifiedText) == |
| 118 sizeof(key_event->unmodifiedText)); |
| 119 for (size_t i = 0; i < WebKeyboardEvent::textLengthCap; ++i) { |
| 120 key_event->text[i] = event.u.character.text[i]; |
| 121 key_event->unmodifiedText[i] = event.u.character.unmodifiedText[i]; |
| 122 } |
| 123 return key_event; |
| 124 } |
| 125 |
| 126 WebMouseEvent* BuildMouseEvent(const PP_Event& event) { |
| 127 WebMouseEvent* mouse_event = new WebMouseEvent(); |
| 128 switch (event.type) { |
| 129 case PP_Event_Type_MouseDown: |
| 130 mouse_event->type = WebInputEvent::MouseDown; |
| 131 break; |
| 132 case PP_Event_Type_MouseUp: |
| 133 mouse_event->type = WebInputEvent::MouseUp; |
| 134 break; |
| 135 case PP_Event_Type_MouseMove: |
| 136 mouse_event->type = WebInputEvent::MouseMove; |
| 137 break; |
| 138 case PP_Event_Type_MouseEnter: |
| 139 mouse_event->type = WebInputEvent::MouseEnter; |
| 140 break; |
| 141 case PP_Event_Type_MouseLeave: |
| 142 mouse_event->type = WebInputEvent::MouseLeave; |
| 143 break; |
| 144 } |
| 145 mouse_event->timeStampSeconds = event.timeStampSeconds; |
| 146 mouse_event->modifiers = event.u.mouse.modifier; |
| 147 mouse_event->button = |
| 148 static_cast<WebMouseEvent::Button>(event.u.mouse.button); |
| 149 mouse_event->x = event.u.mouse.x; |
| 150 mouse_event->y = event.u.mouse.y; |
| 151 mouse_event->clickCount = event.u.mouse.clickCount; |
| 152 return mouse_event; |
| 153 } |
| 154 |
| 155 WebMouseWheelEvent* BuildMouseWheelEvent(const PP_Event& event) { |
| 156 WebMouseWheelEvent* mouse_wheel_event = new WebMouseWheelEvent(); |
| 157 mouse_wheel_event->type = WebInputEvent::MouseWheel; |
| 158 mouse_wheel_event->timeStampSeconds = event.timeStampSeconds; |
| 159 mouse_wheel_event->modifiers = event.u.wheel.modifier; |
| 160 mouse_wheel_event->deltaX = event.u.wheel.deltaX; |
| 161 mouse_wheel_event->deltaY = event.u.wheel.deltaY; |
| 162 mouse_wheel_event->wheelTicksX = event.u.wheel.wheelTicksX; |
| 163 mouse_wheel_event->wheelTicksY = event.u.wheel.wheelTicksY; |
| 164 mouse_wheel_event->scrollByPage = event.u.wheel.scrollByPage; |
| 165 return mouse_wheel_event; |
| 166 } |
| 167 |
| 168 } // namespace |
| 169 |
| 170 namespace pepper { |
| 171 |
| 172 PP_Event* CreatePP_Event(const WebInputEvent& event) { |
| 173 scoped_ptr<PP_Event> pp_event(new PP_Event); |
| 174 |
| 175 pp_event->type = ConvertEventTypes(event.type); |
| 176 pp_event->size = sizeof(pp_event); |
| 177 pp_event->timeStampSeconds = event.timeStampSeconds; |
| 178 switch (pp_event->type) { |
| 179 case PP_Event_Type_Undefined: |
| 180 return NULL; |
| 181 case PP_Event_Type_MouseDown: |
| 182 case PP_Event_Type_MouseUp: |
| 183 case PP_Event_Type_MouseMove: |
| 184 case PP_Event_Type_MouseEnter: |
| 185 case PP_Event_Type_MouseLeave: |
| 186 BuildMouseEvent(&event, pp_event.get()); |
| 187 break; |
| 188 case PP_Event_Type_MouseWheel: |
| 189 BuildMouseWheelEvent(&event, pp_event.get()); |
| 190 break; |
| 191 case PP_Event_Type_RawKeyDown: |
| 192 case PP_Event_Type_KeyDown: |
| 193 case PP_Event_Type_KeyUp: |
| 194 BuildKeyEvent(&event, pp_event.get()); |
| 195 break; |
| 196 case PP_Event_Type_Char: |
| 197 BuildCharEvent(&event, pp_event.get()); |
| 198 break; |
| 199 } |
| 200 |
| 201 return pp_event.release(); |
| 202 } |
| 203 |
| 204 WebInputEvent* CreateWebInputEvent(const PP_Event& event) { |
| 205 scoped_ptr<WebInputEvent> web_input_event; |
| 206 switch (event.type) { |
| 207 case PP_Event_Type_Undefined: |
| 208 return NULL; |
| 209 case PP_Event_Type_MouseDown: |
| 210 case PP_Event_Type_MouseUp: |
| 211 case PP_Event_Type_MouseMove: |
| 212 case PP_Event_Type_MouseEnter: |
| 213 case PP_Event_Type_MouseLeave: |
| 214 web_input_event.reset(BuildMouseEvent(event)); |
| 215 break; |
| 216 case PP_Event_Type_MouseWheel: |
| 217 web_input_event.reset(BuildMouseWheelEvent(event)); |
| 218 break; |
| 219 case PP_Event_Type_RawKeyDown: |
| 220 case PP_Event_Type_KeyDown: |
| 221 case PP_Event_Type_KeyUp: |
| 222 web_input_event.reset(BuildKeyEvent(event)); |
| 223 break; |
| 224 case PP_Event_Type_Char: |
| 225 web_input_event.reset(BuildCharEvent(event)); |
| 226 break; |
| 227 case PP_Event_Type_Focus: |
| 228 // NOTIMPLEMENTED(); |
| 229 return NULL; |
| 230 } |
| 231 |
| 232 return web_input_event.release(); |
| 233 } |
| 234 |
| 235 } // namespace pepper |
OLD | NEW |