Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: ppapi/cpp/var.cc

Issue 7362012: Remove untrusted scripting support. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix DCHECK(MessageLoop::current()) failure for serialized var test Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium 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 "ppapi/cpp/var.h" 5 #include "ppapi/cpp/var.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 #include <string.h> 8 #include <string.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
11 11
12 #include "ppapi/c/pp_var.h" 12 #include "ppapi/c/pp_var.h"
13 #ifndef PPAPI_VAR_REMOVE_SCRIPTING
14 # include "ppapi/c/dev/ppb_var_deprecated.h"
15 #endif
16 #include "ppapi/c/ppb_var.h" 13 #include "ppapi/c/ppb_var.h"
17 #include "ppapi/cpp/instance.h" 14 #include "ppapi/cpp/instance.h"
18 #include "ppapi/cpp/logging.h" 15 #include "ppapi/cpp/logging.h"
19 #include "ppapi/cpp/module.h" 16 #include "ppapi/cpp/module.h"
20 #include "ppapi/cpp/module_impl.h" 17 #include "ppapi/cpp/module_impl.h"
21 #include "ppapi/cpp/dev/scriptable_object_deprecated.h"
22 18
23 // Define equivalent to snprintf on Windows. 19 // Define equivalent to snprintf on Windows.
24 #if defined(_MSC_VER) 20 #if defined(_MSC_VER)
25 # define snprintf sprintf_s 21 # define snprintf sprintf_s
26 #endif 22 #endif
27 23
28 namespace pp { 24 namespace pp {
29 25
30 namespace { 26 namespace {
31 27
32 template <> const char* interface_name<PPB_Var>() { 28 template <> const char* interface_name<PPB_Var>() {
33 return PPB_VAR_INTERFACE; 29 return PPB_VAR_INTERFACE;
34 } 30 }
35 31
36 #ifdef PPAPI_VAR_REMOVE_SCRIPTING
37 typedef PPB_Var PPB_Var_Interface_Type;
38 #else
39 typedef PPB_Var_Deprecated PPB_Var_Interface_Type;
40
41 template <> const char* interface_name<PPB_Var_Deprecated>() {
42 return PPB_VAR_DEPRECATED_INTERFACE;
43 }
44 #endif
45
46 // Technically you can call AddRef and Release on any Var, but it may involve 32 // Technically you can call AddRef and Release on any Var, but it may involve
47 // cross-process calls depending on the plugin. This is an optimization so we 33 // cross-process calls depending on the plugin. This is an optimization so we
48 // only do refcounting on the necessary objects. 34 // only do refcounting on the necessary objects.
49 inline bool NeedsRefcounting(const PP_Var& var) { 35 inline bool NeedsRefcounting(const PP_Var& var) {
50 return var.type > PP_VARTYPE_DOUBLE; 36 return var.type > PP_VARTYPE_DOUBLE;
51 } 37 }
52 38
53 } // namespace 39 } // namespace
54 40
55 using namespace deprecated;
56
57 Var::Var() { 41 Var::Var() {
58 memset(&var_, 0, sizeof(var_)); 42 memset(&var_, 0, sizeof(var_));
59 var_.type = PP_VARTYPE_UNDEFINED; 43 var_.type = PP_VARTYPE_UNDEFINED;
60 needs_release_ = false; 44 needs_release_ = false;
61 } 45 }
62 46
63 Var::Var(Null) { 47 Var::Var(Null) {
64 memset(&var_, 0, sizeof(var_)); 48 memset(&var_, 0, sizeof(var_));
65 var_.type = PP_VARTYPE_NULL; 49 var_.type = PP_VARTYPE_NULL;
66 needs_release_ = false; 50 needs_release_ = false;
(...skipping 14 matching lines...) Expand all
81 } 65 }
82 66
83 Var::Var(double d) { 67 Var::Var(double d) {
84 var_.type = PP_VARTYPE_DOUBLE; 68 var_.type = PP_VARTYPE_DOUBLE;
85 var_.padding = 0; 69 var_.padding = 0;
86 var_.value.as_double = d; 70 var_.value.as_double = d;
87 needs_release_ = false; 71 needs_release_ = false;
88 } 72 }
89 73
90 Var::Var(const char* utf8_str) { 74 Var::Var(const char* utf8_str) {
91 if (has_interface<PPB_Var_Interface_Type>()) { 75 if (has_interface<PPB_Var>()) {
92 uint32_t len = utf8_str ? static_cast<uint32_t>(strlen(utf8_str)) : 0; 76 uint32_t len = utf8_str ? static_cast<uint32_t>(strlen(utf8_str)) : 0;
93 var_ = get_interface<PPB_Var_Interface_Type>()->VarFromUtf8( 77 var_ = get_interface<PPB_Var>()->VarFromUtf8(Module::Get()->pp_module(),
94 Module::Get()->pp_module(), utf8_str, len); 78 utf8_str, len);
95 } else { 79 } else {
96 var_.type = PP_VARTYPE_NULL; 80 var_.type = PP_VARTYPE_NULL;
97 var_.padding = 0; 81 var_.padding = 0;
98 } 82 }
99 needs_release_ = (var_.type == PP_VARTYPE_STRING); 83 needs_release_ = (var_.type == PP_VARTYPE_STRING);
100 } 84 }
101 85
102 Var::Var(const std::string& utf8_str) { 86 Var::Var(const std::string& utf8_str) {
103 if (has_interface<PPB_Var_Interface_Type>()) { 87 if (has_interface<PPB_Var>()) {
104 var_ = get_interface<PPB_Var_Interface_Type>()->VarFromUtf8( 88 var_ = get_interface<PPB_Var>()->VarFromUtf8(
105 Module::Get()->pp_module(), 89 Module::Get()->pp_module(),
106 utf8_str.c_str(), 90 utf8_str.c_str(),
107 static_cast<uint32_t>(utf8_str.size())); 91 static_cast<uint32_t>(utf8_str.size()));
108 } else { 92 } else {
109 var_.type = PP_VARTYPE_NULL; 93 var_.type = PP_VARTYPE_NULL;
110 var_.padding = 0; 94 var_.padding = 0;
111 } 95 }
112 needs_release_ = (var_.type == PP_VARTYPE_STRING); 96 needs_release_ = (var_.type == PP_VARTYPE_STRING);
113 } 97 }
114 98
115 Var::Var(const Var& other) { 99 Var::Var(const Var& other) {
116 var_ = other.var_; 100 var_ = other.var_;
117 if (NeedsRefcounting(var_)) { 101 if (NeedsRefcounting(var_)) {
118 if (has_interface<PPB_Var_Interface_Type>()) { 102 if (has_interface<PPB_Var>()) {
119 needs_release_ = true; 103 needs_release_ = true;
120 get_interface<PPB_Var_Interface_Type>()->AddRef(var_); 104 get_interface<PPB_Var>()->AddRef(var_);
121 } else { 105 } else {
122 var_.type = PP_VARTYPE_NULL; 106 var_.type = PP_VARTYPE_NULL;
123 needs_release_ = false; 107 needs_release_ = false;
124 } 108 }
125 } else { 109 } else {
126 needs_release_ = false; 110 needs_release_ = false;
127 } 111 }
128 } 112 }
129 113
130 Var::~Var() { 114 Var::~Var() {
131 if (needs_release_ && has_interface<PPB_Var_Interface_Type>()) 115 if (needs_release_ && has_interface<PPB_Var>())
132 get_interface<PPB_Var_Interface_Type>()->Release(var_); 116 get_interface<PPB_Var>()->Release(var_);
133 } 117 }
134 118
135 Var& Var::operator=(const Var& other) { 119 Var& Var::operator=(const Var& other) {
136 if (needs_release_ && has_interface<PPB_Var_Interface_Type>()) 120 if (needs_release_ && has_interface<PPB_Var>())
137 get_interface<PPB_Var_Interface_Type>()->Release(var_); 121 get_interface<PPB_Var>()->Release(var_);
138 var_ = other.var_; 122 var_ = other.var_;
139 if (NeedsRefcounting(var_)) { 123 if (NeedsRefcounting(var_)) {
140 if (has_interface<PPB_Var_Interface_Type>()) { 124 if (has_interface<PPB_Var>()) {
141 needs_release_ = true; 125 needs_release_ = true;
142 get_interface<PPB_Var_Interface_Type>()->AddRef(var_); 126 get_interface<PPB_Var>()->AddRef(var_);
143 } else { 127 } else {
144 var_.type = PP_VARTYPE_NULL; 128 var_.type = PP_VARTYPE_NULL;
145 needs_release_ = false; 129 needs_release_ = false;
146 } 130 }
147 } else { 131 } else {
148 needs_release_ = false; 132 needs_release_ = false;
149 } 133 }
150 return *this; 134 return *this;
151 } 135 }
152 136
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 PP_NOTREACHED(); 181 PP_NOTREACHED();
198 return 0.0; 182 return 0.0;
199 } 183 }
200 184
201 std::string Var::AsString() const { 185 std::string Var::AsString() const {
202 if (!is_string()) { 186 if (!is_string()) {
203 PP_NOTREACHED(); 187 PP_NOTREACHED();
204 return std::string(); 188 return std::string();
205 } 189 }
206 190
207 if (!has_interface<PPB_Var_Interface_Type>()) 191 if (!has_interface<PPB_Var>())
208 return std::string(); 192 return std::string();
209 uint32_t len; 193 uint32_t len;
210 const char* str = 194 const char* str = get_interface<PPB_Var>()->VarToUtf8(var_, &len);
211 get_interface<PPB_Var_Interface_Type>()->VarToUtf8(var_, &len);
212 return std::string(str, len); 195 return std::string(str, len);
213 } 196 }
214 197
215 #ifndef PPAPI_VAR_REMOVE_SCRIPTING
216 Var::Var(Instance* instance, ScriptableObject* object) {
217 if (has_interface<PPB_Var_Deprecated>()) {
218 var_ = get_interface<PPB_Var_Deprecated>()->CreateObject(
219 instance->pp_instance(), object->GetClass(), object);
220 needs_release_ = true;
221 } else {
222 var_.type = PP_VARTYPE_NULL;
223 var_.padding = 0;
224 needs_release_ = false;
225 }
226 }
227
228 ScriptableObject* Var::AsScriptableObject() const {
229 if (!is_object()) {
230 PP_NOTREACHED();
231 } else if (has_interface<PPB_Var_Deprecated>()) {
232 void* object = NULL;
233 if (get_interface<PPB_Var_Deprecated>()->IsInstanceOf(
234 var_, ScriptableObject::GetClass(), &object)) {
235 return reinterpret_cast<ScriptableObject*>(object);
236 }
237 }
238 return NULL;
239 }
240
241 bool Var::HasProperty(const Var& name, Var* exception) const {
242 if (!has_interface<PPB_Var_Deprecated>())
243 return false;
244 return get_interface<PPB_Var_Deprecated>()->HasProperty(
245 var_, name.var_, OutException(exception).get());
246 }
247
248 bool Var::HasMethod(const Var& name, Var* exception) const {
249 if (!has_interface<PPB_Var_Deprecated>())
250 return false;
251 return get_interface<PPB_Var_Deprecated>()->HasMethod(
252 var_, name.var_, OutException(exception).get());
253 }
254
255 Var Var::GetProperty(const Var& name, Var* exception) const {
256 if (!has_interface<PPB_Var_Deprecated>())
257 return Var();
258 return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->GetProperty(
259 var_, name.var_, OutException(exception).get()));
260 }
261
262 void Var::GetAllPropertyNames(std::vector<Var>* properties,
263 Var* exception) const {
264 if (!has_interface<PPB_Var_Deprecated>())
265 return;
266 PP_Var* props = NULL;
267 uint32_t prop_count = 0;
268 get_interface<PPB_Var_Deprecated>()->GetAllPropertyNames(
269 var_, &prop_count, &props, OutException(exception).get());
270 if (!prop_count)
271 return;
272 properties->resize(prop_count);
273 for (uint32_t i = 0; i < prop_count; ++i) {
274 Var temp(PassRef(), props[i]);
275 (*properties)[i] = temp;
276 }
277 Module::Get()->core()->MemFree(props);
278 }
279
280 void Var::SetProperty(const Var& name, const Var& value, Var* exception) {
281 if (!has_interface<PPB_Var_Deprecated>())
282 return;
283 get_interface<PPB_Var_Deprecated>()->SetProperty(
284 var_, name.var_, value.var_, OutException(exception).get());
285 }
286
287 void Var::RemoveProperty(const Var& name, Var* exception) {
288 if (!has_interface<PPB_Var_Deprecated>())
289 return;
290 get_interface<PPB_Var_Deprecated>()->RemoveProperty(
291 var_, name.var_, OutException(exception).get());
292 }
293
294 Var Var::Call(const Var& method_name, uint32_t argc, Var* argv,
295 Var* exception) {
296 if (!has_interface<PPB_Var_Deprecated>())
297 return Var();
298 if (argc > 0) {
299 std::vector<PP_Var> args;
300 args.reserve(argc);
301 for (size_t i = 0; i < argc; i++)
302 args.push_back(argv[i].var_);
303 return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call(
304 var_, method_name.var_, argc, &args[0], OutException(exception).get()));
305 } else {
306 // Don't try to get the address of a vector if it's empty.
307 return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call(
308 var_, method_name.var_, 0, NULL, OutException(exception).get()));
309 }
310 }
311
312 Var Var::Construct(uint32_t argc, Var* argv, Var* exception) const {
313 if (!has_interface<PPB_Var_Deprecated>())
314 return Var();
315 if (argc > 0) {
316 std::vector<PP_Var> args;
317 args.reserve(argc);
318 for (size_t i = 0; i < argc; i++)
319 args.push_back(argv[i].var_);
320 return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Construct(
321 var_, argc, &args[0], OutException(exception).get()));
322 } else {
323 // Don't try to get the address of a vector if it's empty.
324 return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Construct(
325 var_, 0, NULL, OutException(exception).get()));
326 }
327 }
328
329 Var Var::Call(const Var& method_name, Var* exception) {
330 if (!has_interface<PPB_Var_Deprecated>())
331 return Var();
332 return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call(
333 var_, method_name.var_, 0, NULL, OutException(exception).get()));
334 }
335
336 Var Var::Call(const Var& method_name, const Var& arg1, Var* exception) {
337 if (!has_interface<PPB_Var_Deprecated>())
338 return Var();
339 PP_Var args[1] = {arg1.var_};
340 return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call(
341 var_, method_name.var_, 1, args, OutException(exception).get()));
342 }
343
344 Var Var::Call(const Var& method_name, const Var& arg1, const Var& arg2,
345 Var* exception) {
346 if (!has_interface<PPB_Var_Deprecated>())
347 return Var();
348 PP_Var args[2] = {arg1.var_, arg2.var_};
349 return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call(
350 var_, method_name.var_, 2, args, OutException(exception).get()));
351 }
352
353 Var Var::Call(const Var& method_name, const Var& arg1, const Var& arg2,
354 const Var& arg3, Var* exception) {
355 if (!has_interface<PPB_Var_Deprecated>())
356 return Var();
357 PP_Var args[3] = {arg1.var_, arg2.var_, arg3.var_};
358 return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call(
359 var_, method_name.var_, 3, args, OutException(exception).get()));
360 }
361
362 Var Var::Call(const Var& method_name, const Var& arg1, const Var& arg2,
363 const Var& arg3, const Var& arg4, Var* exception) {
364 if (!has_interface<PPB_Var_Deprecated>())
365 return Var();
366 PP_Var args[4] = {arg1.var_, arg2.var_, arg3.var_, arg4.var_};
367 return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call(
368 var_, method_name.var_, 4, args, OutException(exception).get()));
369 }
370 #endif
371
372 std::string Var::DebugString() const { 198 std::string Var::DebugString() const {
373 char buf[256]; 199 char buf[256];
374 if (is_undefined()) { 200 if (is_undefined()) {
375 snprintf(buf, sizeof(buf), "Var<UNDEFINED>"); 201 snprintf(buf, sizeof(buf), "Var<UNDEFINED>");
376 } else if (is_null()) { 202 } else if (is_null()) {
377 snprintf(buf, sizeof(buf), "Var<NULL>"); 203 snprintf(buf, sizeof(buf), "Var<NULL>");
378 } else if (is_bool()) { 204 } else if (is_bool()) {
379 snprintf(buf, sizeof(buf), AsBool() ? "Var<true>" : "Var<false>"); 205 snprintf(buf, sizeof(buf), AsBool() ? "Var<true>" : "Var<false>");
380 } else if (is_int()) { 206 } else if (is_int()) {
381 // Note that the following static_cast is necessary because 207 // Note that the following static_cast is necessary because
(...skipping 12 matching lines...) Expand all
394 str.append("..."); 220 str.append("...");
395 } 221 }
396 snprintf(buf, sizeof(buf), format, str.c_str()); 222 snprintf(buf, sizeof(buf), format, str.c_str());
397 } else if (is_object()) { 223 } else if (is_object()) {
398 snprintf(buf, sizeof(buf), "Var<OBJECT>"); 224 snprintf(buf, sizeof(buf), "Var<OBJECT>");
399 } 225 }
400 return buf; 226 return buf;
401 } 227 }
402 228
403 } // namespace pp 229 } // namespace pp
OLDNEW
« no previous file with comments | « ppapi/cpp/var.h ('k') | ppapi/proxy/dispatcher.cc » ('j') | ppapi/proxy/ppapi_proxy_test.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698