OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2011 The Native Client 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 "native_client/src/shared/ppapi_proxy/browser_ppp_input_event.h" | |
6 | |
7 #include "native_client/src/include/nacl_scoped_ptr.h" | |
8 #include "native_client/src/include/portability.h" | |
9 #include "native_client/src/shared/ppapi_proxy/browser_globals.h" | |
10 #include "native_client/src/shared/ppapi_proxy/input_event_data.h" | |
11 #include "native_client/src/shared/ppapi_proxy/object_serialize.h" | |
12 #include "native_client/src/shared/ppapi_proxy/browser_ppp.h" | |
13 #include "native_client/src/shared/ppapi_proxy/trusted/srpcgen/ppp_rpc.h" | |
14 #include "native_client/src/shared/ppapi_proxy/utility.h" | |
15 #include "native_client/src/third_party/ppapi/c/pp_resource.h" | |
16 #include "native_client/src/third_party/ppapi/c/ppp_input_event.h" | |
17 | |
18 namespace ppapi_proxy { | |
19 | |
20 namespace { | |
21 | |
22 PP_Bool HandleInputEvent(PP_Instance instance, PP_Resource input_event) { | |
23 DebugPrintf("PPP_InputEvent::HandleInputEvent: instance=%"NACL_PRIu32", " | |
24 "input_event = %"NACL_PRIu32"\n", | |
25 instance, input_event); | |
26 | |
27 PP_Var character_text = PP_MakeUndefined(); | |
28 InputEventData data; | |
29 data.event_type = PPBInputEventInterface()->GetType(input_event); | |
30 data.event_time_stamp = PPBInputEventInterface()->GetTimeStamp(input_event); | |
31 data.event_modifiers = PPBInputEventInterface()->GetModifiers(input_event); | |
32 // The browser should not send us input events for which we have not | |
33 // registered. | |
34 DCHECK(BrowserInputEvent::InputEventTypeIsRegistered(instance, | |
35 data.event_type)); | |
36 // If the input event is not being filtered, we should ignore what the NaCl | |
37 // returns. This is consistent with what the browser does. | |
38 bool ignore_return_value = | |
39 !(BrowserInputEvent::InputEventTypeIsFiltered(instance, data.event_type)); | |
40 | |
41 switch (data.event_type) { | |
42 // These events all use the PPB_MouseInputEvent interface. | |
43 case PP_INPUTEVENT_TYPE_MOUSEDOWN: | |
44 case PP_INPUTEVENT_TYPE_MOUSEUP: | |
45 case PP_INPUTEVENT_TYPE_MOUSEENTER: | |
46 case PP_INPUTEVENT_TYPE_MOUSELEAVE: | |
47 case PP_INPUTEVENT_TYPE_MOUSEMOVE: | |
48 case PP_INPUTEVENT_TYPE_CONTEXTMENU: | |
49 data.mouse_button = | |
50 PPBMouseInputEventInterface()->GetMouseButton(input_event); | |
51 data.mouse_position = | |
52 PPBMouseInputEventInterface()->GetMousePosition(input_event); | |
53 data.mouse_click_count = | |
54 PPBMouseInputEventInterface()->GetMouseClickCount(input_event); | |
55 break; | |
56 // This event uses the PPB_WheelInputEvent interface. | |
57 case PP_INPUTEVENT_TYPE_MOUSEWHEEL: | |
58 data.wheel_delta = | |
59 PPBWheelInputEventInterface()->GetWheelDelta(input_event); | |
60 data.wheel_ticks = | |
61 PPBWheelInputEventInterface()->GetWheelTicks(input_event); | |
62 data.wheel_scroll_by_page = | |
63 PPBWheelInputEventInterface()->GetScrollByPage(input_event); | |
64 break; | |
65 // These events all use the PPB_KeyInputEvent interface. | |
66 case PP_INPUTEVENT_TYPE_RAWKEYDOWN: | |
67 case PP_INPUTEVENT_TYPE_KEYDOWN: | |
68 case PP_INPUTEVENT_TYPE_KEYUP: | |
69 case PP_INPUTEVENT_TYPE_CHAR: | |
70 data.key_code = | |
71 PPBKeyboardInputEventInterface()->GetKeyCode(input_event); | |
72 character_text = | |
73 PPBKeyboardInputEventInterface()->GetCharacterText(input_event); | |
74 break; | |
75 case PP_INPUTEVENT_TYPE_UNDEFINED: | |
76 return PP_FALSE; | |
77 // No default case; if any new types are added we should get a compile | |
78 // warning. | |
79 } | |
80 // Now data and character_text have all the data we want to send to the | |
81 // untrusted side. | |
82 | |
83 // character_text should either be undefined or a string type. | |
84 DCHECK((character_text.type == PP_VARTYPE_UNDEFINED) || | |
85 (character_text.type == PP_VARTYPE_STRING)); | |
86 // Serialize the character_text Var. | |
87 uint32_t text_size = kMaxVarSize; | |
88 nacl::scoped_array<char> text_bytes(Serialize(&character_text, 1, | |
89 &text_size)); | |
90 int32_t handled; | |
91 // char* event_data = const_cast<char*>(reinterpret_cast<const char*>(data)); | |
sehr (please use chromium)
2011/07/20 00:33:41
Why is this commented out? Remove it.
dmichael (off chromium)
2011/07/20 03:50:22
Oops, done.
| |
92 NaClSrpcError srpc_result = | |
93 PppInputEventRpcClient::PPP_InputEvent_HandleInputEvent( | |
94 GetMainSrpcChannel(instance), | |
95 instance, | |
96 input_event, | |
97 sizeof(data), | |
98 reinterpret_cast<char*>(&data), | |
99 text_size, | |
100 text_bytes.get(), | |
101 &handled); | |
102 DebugPrintf("PPP_Instance::HandleInputEvent: %s\n", | |
103 NaClSrpcErrorString(srpc_result)); | |
104 if (srpc_result != NACL_SRPC_RESULT_OK) { | |
105 return PP_FALSE; | |
106 } | |
107 if (ignore_return_value) { | |
108 return PP_FALSE; | |
109 } | |
110 PP_Bool handled_bool = static_cast<PP_Bool>(handled); | |
111 // The 'handled' int should only ever have a value matching one of PP_FALSE | |
112 // or PP_TRUE. Otherwise, there's an error in the proxy. | |
113 DCHECK((handled_bool == PP_FALSE) || (handled_bool == PP_TRUE)); | |
114 return handled_bool; | |
115 } | |
116 | |
117 } // namespace | |
118 | |
119 // static | |
120 void BrowserInputEvent::InputEventsRequested(PP_Instance instance, | |
121 uint32_t event_classes, | |
122 bool filtering) { | |
123 RegisteredTypes& registered_types = instance_registered_map()[instance]; | |
124 if (filtering) { | |
125 registered_types.filtering |= event_classes; | |
126 registered_types.nonfiltering &= ~event_classes; | |
127 } else { | |
128 // Don't allow unfiltered keyboard access. | |
129 uint32_t fixed_classes = | |
130 event_classes & ~uint32_t(PP_INPUTEVENT_CLASS_KEYBOARD); | |
131 registered_types.nonfiltering |= fixed_classes; | |
132 registered_types.filtering &= ~fixed_classes; | |
133 } | |
134 } | |
135 | |
136 // static | |
137 void BrowserInputEvent::InputEventsCleared(PP_Instance instance, | |
138 uint32_t event_classes) { | |
139 RegisteredTypes& registered_types = instance_registered_map()[instance]; | |
140 registered_types.filtering &= ~(event_classes); | |
141 registered_types.nonfiltering &= ~(event_classes); | |
142 } | |
143 | |
144 // static | |
145 void BrowserInputEvent::InstanceDestroyed(PP_Instance instance) { | |
146 instance_registered_map().erase(instance); | |
147 } | |
148 | |
149 // static | |
150 bool BrowserInputEvent::InputEventTypeIsRegistered(PP_Instance instance, | |
151 PP_InputEvent_Type type) { | |
152 InstanceRegisteredTypesMap::const_iterator iter = | |
153 instance_registered_map().find(instance); | |
154 if (iter != instance_registered_map().end()) { | |
155 return ((type & iter->second.filtering) || | |
156 (type & iter->second.nonfiltering)); | |
157 } | |
158 return false; | |
159 } | |
160 | |
161 // static | |
162 bool BrowserInputEvent::InputEventTypeIsFiltered(PP_Instance instance, | |
163 PP_InputEvent_Type type) { | |
164 InstanceRegisteredTypesMap::const_iterator iter = | |
165 instance_registered_map().find(instance); | |
166 if (iter != instance_registered_map().end()) { | |
167 return (type & iter->second.filtering); | |
168 } | |
169 return false; | |
170 } | |
171 | |
172 const PPP_InputEvent* BrowserInputEvent::GetInterface() { | |
173 static const PPP_InputEvent interface = { | |
174 HandleInputEvent | |
175 }; | |
176 return &interface; | |
177 } | |
178 | |
179 } // namespace ppapi_proxy | |
OLD | NEW |