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/cpp/input_event.h"
6
7 #include "ppapi/cpp/instance_handle.h"
8 #include "ppapi/cpp/module.h"
9 #include "ppapi/cpp/module_impl.h"
10 #include "ppapi/cpp/point.h"
11 #include "ppapi/cpp/touch_point.h"
12 #include "ppapi/cpp/var.h"
13
14 namespace pp {
15
16 namespace {
17
interface_name()18 template <> const char* interface_name<PPB_InputEvent_1_0>() {
19 return PPB_INPUT_EVENT_INTERFACE_1_0;
20 }
21
interface_name()22 template <> const char* interface_name<PPB_KeyboardInputEvent_1_0>() {
23 return PPB_KEYBOARD_INPUT_EVENT_INTERFACE_1_0;
24 }
25
interface_name()26 template <> const char* interface_name<PPB_MouseInputEvent_1_1>() {
27 return PPB_MOUSE_INPUT_EVENT_INTERFACE_1_1;
28 }
29
interface_name()30 template <> const char* interface_name<PPB_WheelInputEvent_1_0>() {
31 return PPB_WHEEL_INPUT_EVENT_INTERFACE_1_0;
32 }
33
interface_name()34 template <> const char* interface_name<PPB_TouchInputEvent_1_0>() {
35 return PPB_TOUCH_INPUT_EVENT_INTERFACE_1_0;
36 }
37
interface_name()38 template <> const char* interface_name<PPB_IMEInputEvent_1_0>() {
39 return PPB_IME_INPUT_EVENT_INTERFACE_1_0;
40 }
41
42 } // namespace
43
44 // InputEvent ------------------------------------------------------------------
45
InputEvent()46 InputEvent::InputEvent() : Resource() {
47 }
48
InputEvent(PP_Resource input_event_resource)49 InputEvent::InputEvent(PP_Resource input_event_resource) : Resource() {
50 // Type check the input event before setting it.
51 if (!has_interface<PPB_InputEvent_1_0>())
52 return;
53 if (get_interface<PPB_InputEvent_1_0>()->IsInputEvent(input_event_resource)) {
54 Module::Get()->core()->AddRefResource(input_event_resource);
55 PassRefFromConstructor(input_event_resource);
56 }
57 }
58
~InputEvent()59 InputEvent::~InputEvent() {
60 }
61
GetType() const62 PP_InputEvent_Type InputEvent::GetType() const {
63 if (!has_interface<PPB_InputEvent_1_0>())
64 return PP_INPUTEVENT_TYPE_UNDEFINED;
65 return get_interface<PPB_InputEvent_1_0>()->GetType(pp_resource());
66 }
67
GetTimeStamp() const68 PP_TimeTicks InputEvent::GetTimeStamp() const {
69 if (!has_interface<PPB_InputEvent_1_0>())
70 return 0.0f;
71 return get_interface<PPB_InputEvent_1_0>()->GetTimeStamp(pp_resource());
72 }
73
GetModifiers() const74 uint32_t InputEvent::GetModifiers() const {
75 if (!has_interface<PPB_InputEvent_1_0>())
76 return 0;
77 return get_interface<PPB_InputEvent_1_0>()->GetModifiers(pp_resource());
78 }
79
80 // MouseInputEvent -------------------------------------------------------------
81
MouseInputEvent()82 MouseInputEvent::MouseInputEvent() : InputEvent() {
83 }
84
MouseInputEvent(const InputEvent & event)85 MouseInputEvent::MouseInputEvent(const InputEvent& event) : InputEvent() {
86 // Type check the input event before setting it.
87 if (!has_interface<PPB_MouseInputEvent_1_1>())
88 return;
89 if (get_interface<PPB_MouseInputEvent_1_1>()->IsMouseInputEvent(
90 event.pp_resource())) {
91 Module::Get()->core()->AddRefResource(event.pp_resource());
92 PassRefFromConstructor(event.pp_resource());
93 }
94 }
95
MouseInputEvent(const InstanceHandle & instance,PP_InputEvent_Type type,PP_TimeTicks time_stamp,uint32_t modifiers,PP_InputEvent_MouseButton mouse_button,const Point & mouse_position,int32_t click_count,const Point & mouse_movement)96 MouseInputEvent::MouseInputEvent(const InstanceHandle& instance,
97 PP_InputEvent_Type type,
98 PP_TimeTicks time_stamp,
99 uint32_t modifiers,
100 PP_InputEvent_MouseButton mouse_button,
101 const Point& mouse_position,
102 int32_t click_count,
103 const Point& mouse_movement) {
104 // Type check the input event before setting it.
105 if (!has_interface<PPB_MouseInputEvent_1_1>())
106 return;
107 PassRefFromConstructor(get_interface<PPB_MouseInputEvent_1_1>()->Create(
108 instance.pp_instance(), type, time_stamp, modifiers, mouse_button,
109 &mouse_position.pp_point(), click_count, &mouse_movement.pp_point()));
110 }
111
GetButton() const112 PP_InputEvent_MouseButton MouseInputEvent::GetButton() const {
113 if (!has_interface<PPB_MouseInputEvent_1_1>())
114 return PP_INPUTEVENT_MOUSEBUTTON_NONE;
115 return get_interface<PPB_MouseInputEvent_1_1>()->GetButton(pp_resource());
116 }
117
GetPosition() const118 Point MouseInputEvent::GetPosition() const {
119 if (!has_interface<PPB_MouseInputEvent_1_1>())
120 return Point();
121 return get_interface<PPB_MouseInputEvent_1_1>()->GetPosition(pp_resource());
122 }
123
GetClickCount() const124 int32_t MouseInputEvent::GetClickCount() const {
125 if (!has_interface<PPB_MouseInputEvent_1_1>())
126 return 0;
127 return get_interface<PPB_MouseInputEvent_1_1>()->GetClickCount(pp_resource());
128 }
129
GetMovement() const130 Point MouseInputEvent::GetMovement() const {
131 if (!has_interface<PPB_MouseInputEvent_1_1>())
132 return Point();
133 return get_interface<PPB_MouseInputEvent_1_1>()->GetMovement(pp_resource());
134 }
135
136 // WheelInputEvent -------------------------------------------------------------
137
WheelInputEvent()138 WheelInputEvent::WheelInputEvent() : InputEvent() {
139 }
140
WheelInputEvent(const InputEvent & event)141 WheelInputEvent::WheelInputEvent(const InputEvent& event) : InputEvent() {
142 // Type check the input event before setting it.
143 if (!has_interface<PPB_WheelInputEvent_1_0>())
144 return;
145 if (get_interface<PPB_WheelInputEvent_1_0>()->IsWheelInputEvent(
146 event.pp_resource())) {
147 Module::Get()->core()->AddRefResource(event.pp_resource());
148 PassRefFromConstructor(event.pp_resource());
149 }
150 }
151
WheelInputEvent(const InstanceHandle & instance,PP_TimeTicks time_stamp,uint32_t modifiers,const FloatPoint & wheel_delta,const FloatPoint & wheel_ticks,bool scroll_by_page)152 WheelInputEvent::WheelInputEvent(const InstanceHandle& instance,
153 PP_TimeTicks time_stamp,
154 uint32_t modifiers,
155 const FloatPoint& wheel_delta,
156 const FloatPoint& wheel_ticks,
157 bool scroll_by_page) {
158 // Type check the input event before setting it.
159 if (!has_interface<PPB_WheelInputEvent_1_0>())
160 return;
161 PassRefFromConstructor(get_interface<PPB_WheelInputEvent_1_0>()->Create(
162 instance.pp_instance(), time_stamp, modifiers,
163 &wheel_delta.pp_float_point(), &wheel_ticks.pp_float_point(),
164 PP_FromBool(scroll_by_page)));
165 }
166
GetDelta() const167 FloatPoint WheelInputEvent::GetDelta() const {
168 if (!has_interface<PPB_WheelInputEvent_1_0>())
169 return FloatPoint();
170 return get_interface<PPB_WheelInputEvent_1_0>()->GetDelta(pp_resource());
171 }
172
GetTicks() const173 FloatPoint WheelInputEvent::GetTicks() const {
174 if (!has_interface<PPB_WheelInputEvent_1_0>())
175 return FloatPoint();
176 return get_interface<PPB_WheelInputEvent_1_0>()->GetTicks(pp_resource());
177 }
178
GetScrollByPage() const179 bool WheelInputEvent::GetScrollByPage() const {
180 if (!has_interface<PPB_WheelInputEvent_1_0>())
181 return false;
182 return PP_ToBool(
183 get_interface<PPB_WheelInputEvent_1_0>()->GetScrollByPage(pp_resource()));
184 }
185
186 // KeyboardInputEvent ----------------------------------------------------------
187
KeyboardInputEvent()188 KeyboardInputEvent::KeyboardInputEvent() : InputEvent() {
189 }
190
KeyboardInputEvent(const InputEvent & event)191 KeyboardInputEvent::KeyboardInputEvent(const InputEvent& event) : InputEvent() {
192 // Type check the input event before setting it.
193 if (!has_interface<PPB_KeyboardInputEvent_1_0>())
194 return;
195 if (get_interface<PPB_KeyboardInputEvent_1_0>()->IsKeyboardInputEvent(
196 event.pp_resource())) {
197 Module::Get()->core()->AddRefResource(event.pp_resource());
198 PassRefFromConstructor(event.pp_resource());
199 }
200 }
201
KeyboardInputEvent(const InstanceHandle & instance,PP_InputEvent_Type type,PP_TimeTicks time_stamp,uint32_t modifiers,uint32_t key_code,const Var & character_text)202 KeyboardInputEvent::KeyboardInputEvent(const InstanceHandle& instance,
203 PP_InputEvent_Type type,
204 PP_TimeTicks time_stamp,
205 uint32_t modifiers,
206 uint32_t key_code,
207 const Var& character_text) {
208 // Type check the input event before setting it.
209 if (!has_interface<PPB_KeyboardInputEvent_1_0>())
210 return;
211 PassRefFromConstructor(get_interface<PPB_KeyboardInputEvent_1_0>()->Create(
212 instance.pp_instance(), type, time_stamp, modifiers, key_code,
213 character_text.pp_var()));
214 }
215
GetKeyCode() const216 uint32_t KeyboardInputEvent::GetKeyCode() const {
217 if (!has_interface<PPB_KeyboardInputEvent_1_0>())
218 return 0;
219 return get_interface<PPB_KeyboardInputEvent_1_0>()->GetKeyCode(pp_resource());
220 }
221
GetCharacterText() const222 Var KeyboardInputEvent::GetCharacterText() const {
223 if (!has_interface<PPB_KeyboardInputEvent_1_0>())
224 return Var();
225 return Var(PASS_REF,
226 get_interface<PPB_KeyboardInputEvent_1_0>()->GetCharacterText(
227 pp_resource()));
228 }
229
230 // TouchInputEvent ------------------------------------------------------------
TouchInputEvent()231 TouchInputEvent::TouchInputEvent() : InputEvent() {
232 }
233
TouchInputEvent(const InputEvent & event)234 TouchInputEvent::TouchInputEvent(const InputEvent& event) : InputEvent() {
235 if (!has_interface<PPB_TouchInputEvent_1_0>())
236 return;
237 // Type check the input event before setting it.
238 if (get_interface<PPB_TouchInputEvent_1_0>()->IsTouchInputEvent(
239 event.pp_resource())) {
240 Module::Get()->core()->AddRefResource(event.pp_resource());
241 PassRefFromConstructor(event.pp_resource());
242 }
243 }
244
TouchInputEvent(const InstanceHandle & instance,PP_InputEvent_Type type,PP_TimeTicks time_stamp,uint32_t modifiers)245 TouchInputEvent::TouchInputEvent(const InstanceHandle& instance,
246 PP_InputEvent_Type type,
247 PP_TimeTicks time_stamp,
248 uint32_t modifiers) {
249 // Type check the input event before setting it.
250 if (!has_interface<PPB_TouchInputEvent_1_0>())
251 return;
252 PassRefFromConstructor(get_interface<PPB_TouchInputEvent_1_0>()->Create(
253 instance.pp_instance(), type, time_stamp, modifiers));
254 }
255
AddTouchPoint(PP_TouchListType list,PP_TouchPoint point)256 void TouchInputEvent::AddTouchPoint(PP_TouchListType list,
257 PP_TouchPoint point) {
258 if (!has_interface<PPB_TouchInputEvent_1_0>())
259 return;
260 get_interface<PPB_TouchInputEvent_1_0>()->AddTouchPoint(pp_resource(), list,
261 &point);
262 }
263
GetTouchCount(PP_TouchListType list) const264 uint32_t TouchInputEvent::GetTouchCount(PP_TouchListType list) const {
265 if (!has_interface<PPB_TouchInputEvent_1_0>())
266 return 0;
267 return get_interface<PPB_TouchInputEvent_1_0>()->GetTouchCount(pp_resource(),
268 list);
269 }
270
GetTouchById(PP_TouchListType list,uint32_t id) const271 TouchPoint TouchInputEvent::GetTouchById(PP_TouchListType list,
272 uint32_t id) const {
273 if (!has_interface<PPB_TouchInputEvent_1_0>())
274 return TouchPoint();
275 return TouchPoint(get_interface<PPB_TouchInputEvent_1_0>()->
276 GetTouchById(pp_resource(), list, id));
277 }
278
GetTouchByIndex(PP_TouchListType list,uint32_t index) const279 TouchPoint TouchInputEvent::GetTouchByIndex(PP_TouchListType list,
280 uint32_t index) const {
281 if (!has_interface<PPB_TouchInputEvent_1_0>())
282 return TouchPoint();
283 return TouchPoint(get_interface<PPB_TouchInputEvent_1_0>()->
284 GetTouchByIndex(pp_resource(), list, index));
285 }
286
287 // IMEInputEvent -------------------------------------------------------
288
IMEInputEvent()289 IMEInputEvent::IMEInputEvent() : InputEvent() {
290 }
291
IMEInputEvent(const InputEvent & event)292 IMEInputEvent::IMEInputEvent(const InputEvent& event) : InputEvent() {
293 if (has_interface<PPB_IMEInputEvent_1_0>()) {
294 if (get_interface<PPB_IMEInputEvent_1_0>()->IsIMEInputEvent(
295 event.pp_resource())) {
296 Module::Get()->core()->AddRefResource(event.pp_resource());
297 PassRefFromConstructor(event.pp_resource());
298 }
299 }
300 }
301
IMEInputEvent(const InstanceHandle & instance,PP_InputEvent_Type type,PP_TimeTicks time_stamp,const Var & text,const std::vector<uint32_t> & segment_offsets,int32_t target_segment,const std::pair<uint32_t,uint32_t> & selection)302 IMEInputEvent::IMEInputEvent(
303 const InstanceHandle& instance,
304 PP_InputEvent_Type type,
305 PP_TimeTicks time_stamp,
306 const Var& text,
307 const std::vector<uint32_t>& segment_offsets,
308 int32_t target_segment,
309 const std::pair<uint32_t, uint32_t>& selection) : InputEvent() {
310 if (!has_interface<PPB_IMEInputEvent_1_0>())
311 return;
312 uint32_t dummy = 0;
313 PassRefFromConstructor(get_interface<PPB_IMEInputEvent_1_0>()->Create(
314 instance.pp_instance(), type, time_stamp, text.pp_var(),
315 segment_offsets.empty() ? 0 : segment_offsets.size() - 1,
316 segment_offsets.empty() ? &dummy : &segment_offsets[0],
317 target_segment, selection.first, selection.second));
318 }
319
320
GetText() const321 Var IMEInputEvent::GetText() const {
322 if (has_interface<PPB_IMEInputEvent_1_0>()) {
323 return Var(PASS_REF,
324 get_interface<PPB_IMEInputEvent_1_0>()->GetText(
325 pp_resource()));
326 }
327 return Var();
328 }
329
GetSegmentNumber() const330 uint32_t IMEInputEvent::GetSegmentNumber() const {
331 if (has_interface<PPB_IMEInputEvent_1_0>()) {
332 return get_interface<PPB_IMEInputEvent_1_0>()->GetSegmentNumber(
333 pp_resource());
334 }
335 return 0;
336 }
337
GetSegmentOffset(uint32_t index) const338 uint32_t IMEInputEvent::GetSegmentOffset(uint32_t index) const {
339 if (has_interface<PPB_IMEInputEvent_1_0>()) {
340 return get_interface<PPB_IMEInputEvent_1_0>()->GetSegmentOffset(
341 pp_resource(), index);
342 }
343 return 0;
344 }
345
GetTargetSegment() const346 int32_t IMEInputEvent::GetTargetSegment() const {
347 if (has_interface<PPB_IMEInputEvent_1_0>()) {
348 return get_interface<PPB_IMEInputEvent_1_0>()->GetTargetSegment(
349 pp_resource());
350 }
351 return 0;
352 }
353
GetSelection(uint32_t * start,uint32_t * end) const354 void IMEInputEvent::GetSelection(uint32_t* start, uint32_t* end) const {
355 if (has_interface<PPB_IMEInputEvent_1_0>()) {
356 get_interface<PPB_IMEInputEvent_1_0>()->GetSelection(pp_resource(),
357 start,
358 end);
359 }
360 }
361
362 } // namespace pp
363