OLD | NEW |
1 // Copyright (c) 2011 The Native Client Authors. All rights reserved. | 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 | 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 <assert.h> | 5 #include <assert.h> |
6 #include <sstream> | 6 #include <sstream> |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "native_client/src/include/nacl_macros.h" | 10 #include "native_client/src/include/nacl_macros.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 const char* caller) { | 64 const char* caller) { |
65 uintptr_t id = handle()->browser_interface()->StringToIdentifier(call_name); | 65 uintptr_t id = handle()->browser_interface()->StringToIdentifier(call_name); |
66 PLUGIN_PRINTF(("ScriptableHandlePpapi::%s (id=%"NACL_PRIxPTR")\n", | 66 PLUGIN_PRINTF(("ScriptableHandlePpapi::%s (id=%"NACL_PRIxPTR")\n", |
67 caller, id)); | 67 caller, id)); |
68 return handle()->HasMethod(id, call_type); | 68 return handle()->HasMethod(id, call_type); |
69 } | 69 } |
70 | 70 |
71 | 71 |
72 bool ScriptableHandlePpapi::HasProperty(const pp::Var& name, | 72 bool ScriptableHandlePpapi::HasProperty(const pp::Var& name, |
73 pp::Var* exception) { | 73 pp::Var* exception) { |
| 74 UNREFERENCED_PARAMETER(exception); |
74 PLUGIN_PRINTF(("ScriptableHandlePpapi::HasProperty (this=%p, name=%s)\n", | 75 PLUGIN_PRINTF(("ScriptableHandlePpapi::HasProperty (this=%p, name=%s)\n", |
75 static_cast<void*>(this), name.DebugString().c_str())); | 76 static_cast<void*>(this), name.DebugString().c_str())); |
76 if (!name.is_string() && !name.is_int()) | 77 if (!name.is_string() && !name.is_int()) |
77 return false; | 78 return false; |
78 bool has_property = false; | 79 bool has_property = |
79 if (scriptable_proxy_.is_undefined()) { | 80 HasCallType(PROPERTY_GET, NameAsString(name), "HasProperty"); |
80 has_property = HasCallType(PROPERTY_GET, NameAsString(name), "HasProperty"); | |
81 } else { | |
82 has_property = scriptable_proxy_.HasProperty(name, exception); | |
83 } | |
84 PLUGIN_PRINTF(("ScriptableHandlePpapi::HasProperty (has_property=%d)\n", | 81 PLUGIN_PRINTF(("ScriptableHandlePpapi::HasProperty (has_property=%d)\n", |
85 has_property)); | 82 has_property)); |
86 return has_property; | 83 return has_property; |
87 } | 84 } |
88 | 85 |
89 | 86 |
90 bool ScriptableHandlePpapi::HasMethod(const pp::Var& name, pp::Var* exception) { | 87 bool ScriptableHandlePpapi::HasMethod(const pp::Var& name, pp::Var* exception) { |
| 88 UNREFERENCED_PARAMETER(exception); |
91 PLUGIN_PRINTF(("ScriptableHandlePpapi::HasMethod (this=%p, name='%s')\n", | 89 PLUGIN_PRINTF(("ScriptableHandlePpapi::HasMethod (this=%p, name='%s')\n", |
92 static_cast<void*>(this), name.DebugString().c_str())); | 90 static_cast<void*>(this), name.DebugString().c_str())); |
93 if (!name.is_string()) | 91 if (!name.is_string()) |
94 return false; | 92 return false; |
95 bool has_method = false; | 93 bool has_method = |
96 if (scriptable_proxy_.is_undefined()) { | 94 HasCallType(METHOD_CALL, name.AsString(), "HasMethod"); |
97 has_method = HasCallType(METHOD_CALL, name.AsString(), "HasMethod"); | |
98 } else { | |
99 has_method = scriptable_proxy_.HasMethod(name, exception); | |
100 } | |
101 PLUGIN_PRINTF(("ScriptableHandlePpapi::HasMethod (has_method=%d)\n", | 95 PLUGIN_PRINTF(("ScriptableHandlePpapi::HasMethod (has_method=%d)\n", |
102 has_method)); | 96 has_method)); |
103 return has_method; | 97 return has_method; |
104 } | 98 } |
105 | 99 |
106 | 100 |
107 pp::Var ScriptableHandlePpapi::Invoke(CallType call_type, | 101 pp::Var ScriptableHandlePpapi::Invoke(CallType call_type, |
108 nacl::string call_name, | 102 nacl::string call_name, |
109 const char* caller, | 103 const char* caller, |
110 const std::vector<pp::Var>& args, | 104 const std::vector<pp::Var>& args, |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 } | 190 } |
197 if (call_type == PROPERTY_GET) assert(output_length == 1); | 191 if (call_type == PROPERTY_GET) assert(output_length == 1); |
198 return retvar; | 192 return retvar; |
199 } | 193 } |
200 | 194 |
201 | 195 |
202 pp::Var ScriptableHandlePpapi::GetProperty(const pp::Var& name, | 196 pp::Var ScriptableHandlePpapi::GetProperty(const pp::Var& name, |
203 pp::Var* exception) { | 197 pp::Var* exception) { |
204 PLUGIN_PRINTF(("ScriptableHandlePpapi::GetProperty (name=%s)\n", | 198 PLUGIN_PRINTF(("ScriptableHandlePpapi::GetProperty (name=%s)\n", |
205 name.DebugString().c_str())); | 199 name.DebugString().c_str())); |
206 pp::Var property; | 200 pp::Var property = |
207 if (scriptable_proxy_.is_undefined()) { | 201 Invoke(PROPERTY_GET, NameAsString(name), "GetProperty", |
208 property = Invoke(PROPERTY_GET, NameAsString(name), "GetProperty", | 202 std::vector<pp::Var>(), exception); |
209 std::vector<pp::Var>(), exception); | |
210 } else { | |
211 property = scriptable_proxy_.GetProperty(name, exception); | |
212 } | |
213 PLUGIN_PRINTF(("ScriptableHandlePpapi::GetProperty (property=%s)\n", | 203 PLUGIN_PRINTF(("ScriptableHandlePpapi::GetProperty (property=%s)\n", |
214 property.DebugString().c_str())); | 204 property.DebugString().c_str())); |
215 return property; | 205 return property; |
216 } | 206 } |
217 | 207 |
218 | 208 |
219 void ScriptableHandlePpapi::SetProperty(const pp::Var& name, | 209 void ScriptableHandlePpapi::SetProperty(const pp::Var& name, |
220 const pp::Var& value, | 210 const pp::Var& value, |
221 pp::Var* exception) { | 211 pp::Var* exception) { |
222 PLUGIN_PRINTF(("ScriptableHandlePpapi::SetProperty (name=%s, value=%s)\n", | 212 PLUGIN_PRINTF(("ScriptableHandlePpapi::SetProperty (name=%s, value=%s)\n", |
223 name.DebugString().c_str(), value.DebugString().c_str())); | 213 name.DebugString().c_str(), value.DebugString().c_str())); |
224 if (scriptable_proxy_.is_undefined()) { | 214 std::vector<pp::Var> args; |
225 std::vector<pp::Var> args; | 215 args.push_back(pp::Var(pp::Var::DontManage(), value.pp_var())); |
226 args.push_back(pp::Var(pp::Var::DontManage(), value.pp_var())); | 216 Invoke(PROPERTY_SET, NameAsString(name), "SetProperty", args, exception); |
227 Invoke(PROPERTY_SET, NameAsString(name), "SetProperty", args, exception); | |
228 } else { | |
229 scriptable_proxy_.SetProperty(name, value, exception); | |
230 } | |
231 | |
232 std::string exception_string("NULL"); | 217 std::string exception_string("NULL"); |
233 if (exception != NULL) { | 218 if (exception != NULL) { |
234 exception_string = exception->DebugString(); | 219 exception_string = exception->DebugString(); |
235 } | 220 } |
236 PLUGIN_PRINTF(("ScriptableHandlePpapi::SetProperty (exception=%s)\n", | 221 PLUGIN_PRINTF(("ScriptableHandlePpapi::SetProperty (exception=%s)\n", |
237 exception_string.c_str())); | 222 exception_string.c_str())); |
238 } | 223 } |
239 | 224 |
240 | 225 |
241 void ScriptableHandlePpapi::RemoveProperty(const pp::Var& name, | 226 void ScriptableHandlePpapi::RemoveProperty(const pp::Var& name, |
242 pp::Var* exception) { | 227 pp::Var* exception) { |
243 PLUGIN_PRINTF(("ScriptableHandlePpapi::RemoveProperty (name=%s)\n", | 228 PLUGIN_PRINTF(("ScriptableHandlePpapi::RemoveProperty (name=%s)\n", |
244 name.DebugString().c_str())); | 229 name.DebugString().c_str())); |
245 Error(NameAsString(name), "RemoveProperty", | 230 Error(NameAsString(name), "RemoveProperty", |
246 "property removal is not supported", exception); | 231 "property removal is not supported", exception); |
247 } | 232 } |
248 | 233 |
249 // TODO(polina): should methods also be added? | 234 // TODO(polina): should methods also be added? |
250 // This is currently never called and the exact semantics is not clear. | 235 // This is currently never called and the exact semantics is not clear. |
251 // http://code.google.com/p/chromium/issues/detail?id=51089 | 236 // http://code.google.com/p/chromium/issues/detail?id=51089 |
252 void ScriptableHandlePpapi::GetAllPropertyNames( | 237 void ScriptableHandlePpapi::GetAllPropertyNames( |
253 std::vector<pp::Var>* properties, | 238 std::vector<pp::Var>* properties, |
254 pp::Var* exception) { | 239 pp::Var* exception) { |
| 240 UNREFERENCED_PARAMETER(exception); |
255 PLUGIN_PRINTF(("ScriptableHandlePpapi::GetAllPropertyNames ()\n")); | 241 PLUGIN_PRINTF(("ScriptableHandlePpapi::GetAllPropertyNames ()\n")); |
256 if (scriptable_proxy_.is_undefined()) { | 242 std::vector<uintptr_t>* ids = handle()->GetPropertyIdentifiers(); |
257 std::vector<uintptr_t>* ids = handle()->GetPropertyIdentifiers(); | 243 PLUGIN_PRINTF(("ScriptableHandlePpapi::GetAllPropertyNames " |
258 PLUGIN_PRINTF(("ScriptableHandlePpapi::GetAllPropertyNames " | 244 "(ids=%"NACL_PRIuS")\n", ids->size())); |
259 "(ids=%"NACL_PRIuS")\n", ids->size())); | 245 for (size_t i = 0; i < ids->size(); ++i) { |
260 for (size_t i = 0; i < ids->size(); ++i) { | 246 nacl::string name = |
261 nacl::string name = | 247 handle()->browser_interface()->IdentifierToString(ids->at(i)); |
262 handle()->browser_interface()->IdentifierToString(ids->at(i)); | 248 properties->push_back(pp::Var(name)); |
263 properties->push_back(pp::Var(name)); | |
264 } | |
265 PLUGIN_PRINTF(("ScriptableHandlePpapi::GetAllPropertyNames " | |
266 "(properties=%"NACL_PRIuS")\n", properties->size())); | |
267 } else { | |
268 scriptable_proxy_.GetAllPropertyNames(properties, exception); | |
269 } | 249 } |
| 250 PLUGIN_PRINTF(("ScriptableHandlePpapi::GetAllPropertyNames " |
| 251 "(properties=%"NACL_PRIuS")\n", properties->size())); |
270 } | 252 } |
271 | 253 |
272 | 254 |
273 pp::Var ScriptableHandlePpapi::Call(const pp::Var& name, | 255 pp::Var ScriptableHandlePpapi::Call(const pp::Var& name, |
274 const std::vector<pp::Var>& args, | 256 const std::vector<pp::Var>& args, |
275 pp::Var* exception) { | 257 pp::Var* exception) { |
276 PLUGIN_PRINTF(("ScriptableHandlePpapi::Call (name=%s, %"NACL_PRIuS | 258 PLUGIN_PRINTF(("ScriptableHandlePpapi::Call (name=%s, %"NACL_PRIuS |
277 " args)\n", name.DebugString().c_str(), args.size())); | 259 " args)\n", name.DebugString().c_str(), args.size())); |
278 if (name.is_undefined()) // invoke default | 260 if (name.is_undefined()) // invoke default |
279 return pp::Var(); | 261 return pp::Var(); |
280 assert(name.is_string()); | 262 assert(name.is_string()); |
281 pp::Var return_var; | 263 pp::Var return_var = |
282 if (scriptable_proxy_.is_undefined()) { | 264 Invoke(METHOD_CALL, name.AsString(), "Call", args, exception); |
283 return_var = Invoke(METHOD_CALL, name.AsString(), "Call", args, exception); | |
284 } else { | |
285 uint32_t argc = static_cast<uint32_t>(args.size()); | |
286 pp::Var* args_array = NULL; | |
287 // Check that array has at least 1 element. Visual Studio's STL will | |
288 // throw an exception if we access args[0] in DEBUG configurations. | |
289 if (argc > 0) { | |
290 // STL vectors are guaranteed to use continguous memory, so we can use | |
291 // some pointer magic to convert the vector into an array. | |
292 args_array = const_cast<pp::Var*>(&args[0]); | |
293 } | |
294 return_var = scriptable_proxy_.Call(name, argc, args_array, exception); | |
295 } | |
296 PLUGIN_PRINTF(("ScriptableHandlePpapi::Call (return=%s)\n", | 265 PLUGIN_PRINTF(("ScriptableHandlePpapi::Call (return=%s)\n", |
297 return_var.DebugString().c_str())); | 266 return_var.DebugString().c_str())); |
298 return return_var; | 267 return return_var; |
299 } | 268 } |
300 | 269 |
301 | 270 |
302 pp::Var ScriptableHandlePpapi::Construct(const std::vector<pp::Var>& args, | 271 pp::Var ScriptableHandlePpapi::Construct(const std::vector<pp::Var>& args, |
303 pp::Var* exception) { | 272 pp::Var* exception) { |
304 PLUGIN_PRINTF(("ScriptableHandlePpapi::Construct (%"NACL_PRIuS | 273 PLUGIN_PRINTF(("ScriptableHandlePpapi::Construct (%"NACL_PRIuS |
305 " args)\n", args.size())); | 274 " args)\n", args.size())); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 static_cast<void*>(this), static_cast<void*>(handle()))); | 341 static_cast<void*>(this), static_cast<void*>(handle()))); |
373 handle()->Delete(); | 342 handle()->Delete(); |
374 set_handle(NULL); | 343 set_handle(NULL); |
375 } | 344 } |
376 PLUGIN_PRINTF(("ScriptableHandlePpapi::~ScriptableHandlePpapi " | 345 PLUGIN_PRINTF(("ScriptableHandlePpapi::~ScriptableHandlePpapi " |
377 "(this=%p, return)\n", | 346 "(this=%p, return)\n", |
378 static_cast<void*>(this))); | 347 static_cast<void*>(this))); |
379 } | 348 } |
380 | 349 |
381 } // namespace plugin | 350 } // namespace plugin |
OLD | NEW |