1 // Copyright (c) 2012 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 "ppapi/shared_impl/ppb_input_event_shared.h" 6 7 #include "ppapi/shared_impl/ppapi_globals.h" 8 #include "ppapi/shared_impl/var.h" 9 10 using ppapi::thunk::PPB_InputEvent_API; 11 12 namespace ppapi { 13 14 InputEventData::InputEventData() 15 : is_filtered(false), 16 event_type(PP_INPUTEVENT_TYPE_UNDEFINED), 17 event_time_stamp(0.0), 18 event_modifiers(0), 19 mouse_button(PP_INPUTEVENT_MOUSEBUTTON_NONE), 20 mouse_position(PP_MakePoint(0, 0)), 21 mouse_click_count(0), 22 mouse_movement(PP_MakePoint(0, 0)), 23 wheel_delta(PP_MakeFloatPoint(0.0f, 0.0f)), 24 wheel_ticks(PP_MakeFloatPoint(0.0f, 0.0f)), 25 wheel_scroll_by_page(false), 26 key_code(0), 27 code(), 28 character_text(), 29 composition_target_segment(-1), 30 composition_selection_start(0), 31 composition_selection_end(0), 32 touches(), 33 changed_touches(), 34 target_touches() {} 35 36 InputEventData::~InputEventData() {} 37 38 PPB_InputEvent_Shared::PPB_InputEvent_Shared(ResourceObjectType type, 39 PP_Instance instance, 40 const InputEventData& data) 41 : Resource(type, instance), data_(data) {} 42 43 PPB_InputEvent_API* PPB_InputEvent_Shared::AsPPB_InputEvent_API() { 44 return this; 45 } 46 47 const InputEventData& PPB_InputEvent_Shared::GetInputEventData() const { 48 return data_; 49 } 50 51 PP_InputEvent_Type PPB_InputEvent_Shared::GetType() { return data_.event_type; } 52 53 PP_TimeTicks PPB_InputEvent_Shared::GetTimeStamp() { 54 return data_.event_time_stamp; 55 } 56 57 uint32_t PPB_InputEvent_Shared::GetModifiers() { return data_.event_modifiers; } 58 59 PP_InputEvent_MouseButton PPB_InputEvent_Shared::GetMouseButton() { 60 return data_.mouse_button; 61 } 62 63 PP_Point PPB_InputEvent_Shared::GetMousePosition() { 64 return data_.mouse_position; 65 } 66 67 int32_t PPB_InputEvent_Shared::GetMouseClickCount() { 68 return data_.mouse_click_count; 69 } 70 71 PP_Point PPB_InputEvent_Shared::GetMouseMovement() { 72 return data_.mouse_movement; 73 } 74 75 PP_FloatPoint PPB_InputEvent_Shared::GetWheelDelta() { 76 return data_.wheel_delta; 77 } 78 79 PP_FloatPoint PPB_InputEvent_Shared::GetWheelTicks() { 80 return data_.wheel_ticks; 81 } 82 83 PP_Bool PPB_InputEvent_Shared::GetWheelScrollByPage() { 84 return PP_FromBool(data_.wheel_scroll_by_page); 85 } 86 87 uint32_t PPB_InputEvent_Shared::GetKeyCode() { return data_.key_code; } 88 89 PP_Var PPB_InputEvent_Shared::GetCharacterText() { 90 return StringVar::StringToPPVar(data_.character_text); 91 } 92 93 PP_Var PPB_InputEvent_Shared::GetCode() { 94 return StringVar::StringToPPVar(data_.code); 95 } 96 97 uint32_t PPB_InputEvent_Shared::GetIMESegmentNumber() { 98 if (data_.composition_segment_offsets.empty()) 99 return 0; 100 return static_cast<uint32_t>(data_.composition_segment_offsets.size() - 1); 101 } 102 103 uint32_t PPB_InputEvent_Shared::GetIMESegmentOffset(uint32_t index) { 104 if (index >= data_.composition_segment_offsets.size()) 105 return 0; 106 return data_.composition_segment_offsets[index]; 107 } 108 109 int32_t PPB_InputEvent_Shared::GetIMETargetSegment() { 110 return data_.composition_target_segment; 111 } 112 113 void PPB_InputEvent_Shared::GetIMESelection(uint32_t* start, uint32_t* end) { 114 if (start) 115 *start = data_.composition_selection_start; 116 if (end) 117 *end = data_.composition_selection_end; 118 } 119 120 void PPB_InputEvent_Shared::AddTouchPoint(PP_TouchListType list, 121 const PP_TouchPoint& point) { 122 switch (list) { 123 case PP_TOUCHLIST_TYPE_TOUCHES: 124 data_.touches.push_back(point); 125 break; 126 case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES: 127 data_.changed_touches.push_back(point); 128 break; 129 case PP_TOUCHLIST_TYPE_TARGETTOUCHES: 130 data_.target_touches.push_back(point); 131 break; 132 default: 133 break; 134 } 135 } 136 137 uint32_t PPB_InputEvent_Shared::GetTouchCount(PP_TouchListType list) { 138 switch (list) { 139 case PP_TOUCHLIST_TYPE_TOUCHES: 140 return static_cast<uint32_t>(data_.touches.size()); 141 case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES: 142 return static_cast<uint32_t>(data_.changed_touches.size()); 143 case PP_TOUCHLIST_TYPE_TARGETTOUCHES: 144 return static_cast<uint32_t>(data_.target_touches.size()); 145 } 146 147 return 0; 148 } 149 150 PP_TouchPoint PPB_InputEvent_Shared::GetTouchByIndex(PP_TouchListType list, 151 uint32_t index) { 152 std::vector<PP_TouchPoint>* points; 153 switch (list) { 154 case PP_TOUCHLIST_TYPE_TOUCHES: 155 points = &data_.touches; 156 break; 157 case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES: 158 points = &data_.changed_touches; 159 break; 160 case PP_TOUCHLIST_TYPE_TARGETTOUCHES: 161 points = &data_.target_touches; 162 break; 163 default: 164 return PP_MakeTouchPoint(); 165 } 166 if (index >= points->size()) { 167 return PP_MakeTouchPoint(); 168 } 169 return points->at(index); 170 } 171 172 PP_TouchPoint PPB_InputEvent_Shared::GetTouchById(PP_TouchListType list, 173 uint32_t id) { 174 const std::vector<PP_TouchPoint>* points; 175 switch (list) { 176 case PP_TOUCHLIST_TYPE_TOUCHES: 177 points = &data_.touches; 178 break; 179 case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES: 180 points = &data_.changed_touches; 181 break; 182 case PP_TOUCHLIST_TYPE_TARGETTOUCHES: 183 points = &data_.target_touches; 184 break; 185 default: 186 return PP_MakeTouchPoint(); 187 } 188 for (size_t i = 0; i < points->size(); i++) { 189 if (points->at(i).id == id) 190 return points->at(i); 191 } 192 return PP_MakeTouchPoint(); 193 } 194 195 PP_Bool PPB_InputEvent_Shared::TraceInputLatency(PP_Bool has_damage) { 196 ui::LatencyInfo latency = data_.latency_info; 197 if (!latency.FindLatency(ui::INPUT_EVENT_LATENCY_BEGIN_PLUGIN_COMPONENT, 198 0, NULL)) 199 return PP_FALSE; 200 if (has_damage) { 201 PpapiGlobals::Get()->AddLatencyInfo(latency, pp_instance()); 202 } else { 203 latency.AddLatencyNumber( 204 ui::INPUT_EVENT_LATENCY_TERMINATED_PLUGIN_COMPONENT, 0, 0); 205 } 206 return PP_TRUE; 207 } 208 209 // static 210 PP_Resource PPB_InputEvent_Shared::CreateIMEInputEvent( 211 ResourceObjectType type, 212 PP_Instance instance, 213 PP_InputEvent_Type event_type, 214 PP_TimeTicks time_stamp, 215 struct PP_Var text, 216 uint32_t segment_number, 217 const uint32_t* segment_offsets, 218 int32_t target_segment, 219 uint32_t selection_start, 220 uint32_t selection_end) { 221 if (event_type != PP_INPUTEVENT_TYPE_IME_COMPOSITION_START && 222 event_type != PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE && 223 event_type != PP_INPUTEVENT_TYPE_IME_COMPOSITION_END && 224 event_type != PP_INPUTEVENT_TYPE_IME_TEXT) 225 return 0; 226 227 InputEventData data; 228 data.event_type = event_type; 229 data.event_time_stamp = time_stamp; 230 if (text.type == PP_VARTYPE_STRING) { 231 StringVar* text_str = StringVar::FromPPVar(text); 232 if (!text_str) 233 return 0; 234 data.character_text = text_str->value(); 235 } 236 data.composition_target_segment = target_segment; 237 if (segment_number != 0) { 238 data.composition_segment_offsets.assign( 239 &segment_offsets[0], &segment_offsets[segment_number + 1]); 240 } 241 data.composition_selection_start = selection_start; 242 data.composition_selection_end = selection_end; 243 244 return (new PPB_InputEvent_Shared(type, instance, data))->GetReference(); 245 } 246 247 // static 248 PP_Resource PPB_InputEvent_Shared::CreateKeyboardInputEvent( 249 ResourceObjectType type, 250 PP_Instance instance, 251 PP_InputEvent_Type event_type, 252 PP_TimeTicks time_stamp, 253 uint32_t modifiers, 254 uint32_t key_code, 255 struct PP_Var character_text, 256 struct PP_Var code) { 257 if (event_type != PP_INPUTEVENT_TYPE_RAWKEYDOWN && 258 event_type != PP_INPUTEVENT_TYPE_KEYDOWN && 259 event_type != PP_INPUTEVENT_TYPE_KEYUP && 260 event_type != PP_INPUTEVENT_TYPE_CHAR) 261 return 0; 262 263 InputEventData data; 264 data.event_type = event_type; 265 data.event_time_stamp = time_stamp; 266 data.event_modifiers = modifiers; 267 data.key_code = key_code; 268 if (character_text.type == PP_VARTYPE_STRING) { 269 StringVar* text_str = StringVar::FromPPVar(character_text); 270 if (!text_str) 271 return 0; 272 data.character_text = text_str->value(); 273 } 274 if (code.type == PP_VARTYPE_STRING) { 275 StringVar* code_str = StringVar::FromPPVar(code); 276 if (!code_str) 277 return 0; 278 data.code = code_str->value(); 279 } 280 281 return (new PPB_InputEvent_Shared(type, instance, data))->GetReference(); 282 } 283 284 // static 285 PP_Resource PPB_InputEvent_Shared::CreateMouseInputEvent( 286 ResourceObjectType type, 287 PP_Instance instance, 288 PP_InputEvent_Type event_type, 289 PP_TimeTicks time_stamp, 290 uint32_t modifiers, 291 PP_InputEvent_MouseButton mouse_button, 292 const PP_Point* mouse_position, 293 int32_t click_count, 294 const PP_Point* mouse_movement) { 295 if (event_type != PP_INPUTEVENT_TYPE_MOUSEDOWN && 296 event_type != PP_INPUTEVENT_TYPE_MOUSEUP && 297 event_type != PP_INPUTEVENT_TYPE_MOUSEMOVE && 298 event_type != PP_INPUTEVENT_TYPE_MOUSEENTER && 299 event_type != PP_INPUTEVENT_TYPE_MOUSELEAVE) 300 return 0; 301 302 InputEventData data; 303 data.event_type = event_type; 304 data.event_time_stamp = time_stamp; 305 data.event_modifiers = modifiers; 306 data.mouse_button = mouse_button; 307 data.mouse_position = *mouse_position; 308 data.mouse_click_count = click_count; 309 data.mouse_movement = *mouse_movement; 310 311 return (new PPB_InputEvent_Shared(type, instance, data))->GetReference(); 312 } 313 314 // static 315 PP_Resource PPB_InputEvent_Shared::CreateWheelInputEvent( 316 ResourceObjectType type, 317 PP_Instance instance, 318 PP_TimeTicks time_stamp, 319 uint32_t modifiers, 320 const PP_FloatPoint* wheel_delta, 321 const PP_FloatPoint* wheel_ticks, 322 PP_Bool scroll_by_page) { 323 InputEventData data; 324 data.event_type = PP_INPUTEVENT_TYPE_WHEEL; 325 data.event_time_stamp = time_stamp; 326 data.event_modifiers = modifiers; 327 data.wheel_delta = *wheel_delta; 328 data.wheel_ticks = *wheel_ticks; 329 data.wheel_scroll_by_page = PP_ToBool(scroll_by_page); 330 331 return (new PPB_InputEvent_Shared(type, instance, data))->GetReference(); 332 } 333 334 // static 335 PP_Resource PPB_InputEvent_Shared::CreateTouchInputEvent( 336 ResourceObjectType type, 337 PP_Instance instance, 338 PP_InputEvent_Type event_type, 339 PP_TimeTicks time_stamp, 340 uint32_t modifiers) { 341 if (event_type != PP_INPUTEVENT_TYPE_TOUCHSTART && 342 event_type != PP_INPUTEVENT_TYPE_TOUCHMOVE && 343 event_type != PP_INPUTEVENT_TYPE_TOUCHEND && 344 event_type != PP_INPUTEVENT_TYPE_TOUCHCANCEL) 345 return 0; 346 347 InputEventData data; 348 data.event_type = event_type; 349 data.event_time_stamp = time_stamp; 350 data.event_modifiers = modifiers; 351 return (new PPB_InputEvent_Shared(type, instance, data))->GetReference(); 352 } 353 354 } // namespace ppapi 355