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

Side by Side Diff: webkit/glue/plugins/pepper_var.cc

Issue 2123009: Add initial support for exceptions.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 7 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
« no previous file with comments | « webkit/glue/plugins/pepper_var.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "webkit/glue/plugins/pepper_var.h" 5 #include "webkit/glue/plugins/pepper_var.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/scoped_ptr.h" 8 #include "base/scoped_ptr.h"
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "third_party/ppapi/c/pp_var.h" 10 #include "third_party/ppapi/c/pp_var.h"
11 #include "third_party/ppapi/c/ppb_var.h" 11 #include "third_party/ppapi/c/ppb_var.h"
12 #include "third_party/WebKit/WebKit/chromium/public/WebBindings.h" 12 #include "third_party/WebKit/WebKit/chromium/public/WebBindings.h"
13 #include "webkit/glue/plugins/pepper_string.h" 13 #include "webkit/glue/plugins/pepper_string.h"
14 #include "v8/include/v8.h"
15
16 // Uncomment to enable catching JS exceptions
17 // #define HAVE_WEBBINDINGS_EXCEPTION_HANDLER 1
14 18
15 using WebKit::WebBindings; 19 using WebKit::WebBindings;
16 20
17 namespace pepper { 21 namespace pepper {
18 22
19 namespace { 23 namespace {
20 24
25 PP_Var VarFromUtf8(const char* data, uint32_t len);
26
27 // ---------------------------------------------------------------------------
28 // Exceptions
29
30 class TryCatch {
31 public:
32 TryCatch(PP_Var* exception) : exception_(exception) {
33 #ifdef HAVE_WEBBINDINGS_EXCEPTION_HANDLER
34 WebBindings::pushExceptionHandler(&TryCatch::Catch, this);
35 #endif
36 }
37
38 ~TryCatch() {
39 #ifdef HAVE_WEBBINDINGS_EXCEPTION_HANDLER
40 WebBindings::popExceptionHandler();
41 #endif
42 }
43
44 bool HasException() const {
45 return exception_ && exception_->type != PP_VarType_Void;
46 }
47
48 void SetException(const char* message) {
49 DCHECK(!HasException());
50 if (exception_)
51 *exception_ = VarFromUtf8(message, strlen(message));
52 }
53
54 private:
55 static void Catch(void* self, const NPUTF8* message) {
56 static_cast<TryCatch*>(self)->SetException(message);
57 }
58
59 // May be null if the consumer isn't interesting in catching exceptions.
60 PP_Var* exception_;
61 };
62
63 const char kInvalidObjectException[] = "Error: Invalid object";
64 const char kInvalidPropertyException[] = "Error: Invalid property";
65 const char kUnableToGetPropertyException[] = "Error: Unable to get property";
66 const char kUnableToSetPropertyException[] = "Error: Unable to set property";
67 const char kUnableToRemovePropertyException[] =
68 "Error: Unable to remove property";
69 const char kUnableToGetAllPropertiesException[] =
70 "Error: Unable to get all properties";
71 const char kUnableToCallMethodException[] = "Error: Unable to call method";
72 const char kUnableToConstructException[] = "Error: Unable to construct";
73
74 // ---------------------------------------------------------------------------
75 // Utilities
76
21 String* GetStringUnchecked(PP_Var var) { 77 String* GetStringUnchecked(PP_Var var) {
22 return reinterpret_cast<String*>(var.value.as_id); 78 return reinterpret_cast<String*>(var.value.as_id);
23 } 79 }
24 80
25 NPObject* GetNPObjectUnchecked(PP_Var var) { 81 NPObject* GetNPObjectUnchecked(PP_Var var) {
26 return reinterpret_cast<NPObject*>(var.value.as_id); 82 return reinterpret_cast<NPObject*>(var.value.as_id);
27 } 83 }
28 84
29 NPObject* GetNPObject(PP_Var var) { 85 NPObject* GetNPObject(PP_Var var) {
30 if (var.type != PP_VarType_Object) 86 if (var.type != PP_VarType_Object)
31 return NULL; 87 return NULL;
32 return GetNPObjectUnchecked(var); 88 return GetNPObjectUnchecked(var);
33 } 89 }
34 90
91 // Returns a PP_Var that corresponds to the given NPVariant. The contents of
92 // the NPVariant will be copied unless the NPVariant corresponds to an object.
93 PP_Var NPVariantToPPVar(NPVariant* variant) {
94 switch (variant->type) {
95 case NPVariantType_Void:
96 return PP_MakeVoid();
97 case NPVariantType_Null:
98 return PP_MakeNull();
99 case NPVariantType_Bool:
100 return PP_MakeBool(NPVARIANT_TO_BOOLEAN(*variant));
101 case NPVariantType_Int32:
102 return PP_MakeInt32(NPVARIANT_TO_INT32(*variant));
103 case NPVariantType_Double:
104 return PP_MakeDouble(NPVARIANT_TO_DOUBLE(*variant));
105 case NPVariantType_String:
106 return VarFromUtf8(NPVARIANT_TO_STRING(*variant).UTF8Characters,
107 NPVARIANT_TO_STRING(*variant).UTF8Length);
108 case NPVariantType_Object:
109 return NPObjectToPPVar(NPVARIANT_TO_OBJECT(*variant));
110 }
111 NOTREACHED();
112 return PP_MakeVoid();
113 }
114
115 // Returns a NPVariant that corresponds to the given PP_Var. The contents of
116 // the PP_Var will be copied unless the PP_Var corresponds to an object.
117 NPVariant PPVarToNPVariant(PP_Var var) {
118 NPVariant ret;
119 switch (var.type) {
120 case PP_VarType_Void:
121 VOID_TO_NPVARIANT(ret);
122 break;
123 case PP_VarType_Null:
124 NULL_TO_NPVARIANT(ret);
125 break;
126 case PP_VarType_Bool:
127 BOOLEAN_TO_NPVARIANT(var.value.as_bool, ret);
128 break;
129 case PP_VarType_Int32:
130 INT32_TO_NPVARIANT(var.value.as_int, ret);
131 break;
132 case PP_VarType_Double:
133 DOUBLE_TO_NPVARIANT(var.value.as_double, ret);
134 break;
135 case PP_VarType_String: {
136 const std::string& value = GetStringUnchecked(var)->value();
137 STRINGN_TO_NPVARIANT(base::strdup(value.c_str()), value.size(), ret);
138 break;
139 }
140 case PP_VarType_Object: {
141 NPObject* object = GetNPObjectUnchecked(var);
142 OBJECT_TO_NPVARIANT(WebBindings::retainObject(object), ret);
143 break;
144 }
145 }
146 return ret;
147 }
148
149 // Returns a NPVariant that corresponds to the given PP_Var. The contents of
150 // the PP_Var will NOT be copied, so you need to ensure that the PP_Var remains
151 // valid while the resultant NPVariant is in use.
152 NPVariant PPVarToNPVariantNoCopy(PP_Var var) {
153 NPVariant ret;
154 switch (var.type) {
155 case PP_VarType_Void:
156 VOID_TO_NPVARIANT(ret);
157 break;
158 case PP_VarType_Null:
159 NULL_TO_NPVARIANT(ret);
160 break;
161 case PP_VarType_Bool:
162 BOOLEAN_TO_NPVARIANT(var.value.as_bool, ret);
163 break;
164 case PP_VarType_Int32:
165 INT32_TO_NPVARIANT(var.value.as_int, ret);
166 break;
167 case PP_VarType_Double:
168 DOUBLE_TO_NPVARIANT(var.value.as_double, ret);
169 break;
170 case PP_VarType_String: {
171 const std::string& value = GetStringUnchecked(var)->value();
172 STRINGN_TO_NPVARIANT(value.c_str(), value.size(), ret);
173 break;
174 }
175 case PP_VarType_Object: {
176 OBJECT_TO_NPVARIANT(GetNPObjectUnchecked(var), ret);
177 break;
178 }
179 }
180 return ret;
181 }
182
183 // Returns a NPIdentifier that corresponds to the given PP_Var. The contents
184 // of the PP_Var will be copied. Returns NULL if the given PP_Var is not a a
185 // string or integer type.
186 NPIdentifier PPVarToNPIdentifier(PP_Var var) {
187 switch (var.type) {
188 case PP_VarType_String:
189 return WebBindings::getStringIdentifier(
190 GetStringUnchecked(var)->value().c_str());
191 case PP_VarType_Int32:
192 return WebBindings::getIntIdentifier(var.value.as_int);
193 default:
194 return NULL;
195 }
196 }
197
198 // ---------------------------------------------------------------------------
199 // PPB_Var methods
200
35 void AddRef(PP_Var var) { 201 void AddRef(PP_Var var) {
36 if (var.type == PP_VarType_String) { 202 if (var.type == PP_VarType_String) {
37 GetStringUnchecked(var)->AddRef(); 203 GetStringUnchecked(var)->AddRef();
38 } else if (var.type == PP_VarType_Object) { 204 } else if (var.type == PP_VarType_Object) {
39 // TODO(darin): Add thread safety check 205 // TODO(darin): Add thread safety check
40 WebBindings::retainObject(GetNPObjectUnchecked(var)); 206 WebBindings::retainObject(GetNPObjectUnchecked(var));
41 } 207 }
42 } 208 }
43 209
44 void Release(PP_Var var) { 210 void Release(PP_Var var) {
(...skipping 22 matching lines...) Expand all
67 const std::string& str = GetStringUnchecked(var)->value(); 233 const std::string& str = GetStringUnchecked(var)->value();
68 *len = static_cast<uint32_t>(str.size()); 234 *len = static_cast<uint32_t>(str.size());
69 if (str.empty()) 235 if (str.empty())
70 return ""; // Don't return NULL on success. 236 return ""; // Don't return NULL on success.
71 return str.data(); 237 return str.data();
72 } 238 }
73 239
74 bool HasProperty(PP_Var var, 240 bool HasProperty(PP_Var var,
75 PP_Var name, 241 PP_Var name,
76 PP_Var* exception) { 242 PP_Var* exception) {
77 if (exception && exception->type != PP_VarType_Void) 243 TryCatch try_catch(exception);
244 if (try_catch.HasException())
78 return false; 245 return false;
79 246
80 NPObject* object = GetNPObject(var); 247 NPObject* object = GetNPObject(var);
81 if (!object) { 248 if (!object) {
82 // TODO(darin): raise exception 249 try_catch.SetException(kInvalidObjectException);
83 return false; 250 return false;
84 } 251 }
85 252
86 NPIdentifier identifier = PPVarToNPIdentifier(name); 253 NPIdentifier identifier = PPVarToNPIdentifier(name);
87 if (!identifier) { 254 if (!identifier) {
88 // TODO(darin): raise exception 255 try_catch.SetException(kInvalidPropertyException);
89 return false; 256 return false;
90 } 257 }
91 258
92 return WebBindings::hasProperty(NULL, object, identifier); 259 return WebBindings::hasProperty(NULL, object, identifier);
93 } 260 }
94 261
95 PP_Var GetProperty(PP_Var var, 262 PP_Var GetProperty(PP_Var var,
96 PP_Var name, 263 PP_Var name,
97 PP_Var* exception) { 264 PP_Var* exception) {
98 if (exception && exception->type != PP_VarType_Void) 265 TryCatch try_catch(exception);
266 if (try_catch.HasException())
99 return PP_MakeVoid(); 267 return PP_MakeVoid();
100 268
101 NPObject* object = GetNPObject(var); 269 NPObject* object = GetNPObject(var);
102 if (!object) { 270 if (!object) {
103 // TODO(darin): raise exception 271 try_catch.SetException(kInvalidObjectException);
104 return PP_MakeVoid(); 272 return PP_MakeVoid();
105 } 273 }
106 274
107 NPIdentifier identifier = PPVarToNPIdentifier(name); 275 NPIdentifier identifier = PPVarToNPIdentifier(name);
108 if (!identifier) { 276 if (!identifier) {
109 // TODO(darin): raise exception 277 try_catch.SetException(kInvalidPropertyException);
110 return PP_MakeVoid(); 278 return PP_MakeVoid();
111 } 279 }
112 280
113 NPVariant result; 281 NPVariant result;
114 if (!WebBindings::getProperty(NULL, object, identifier, &result)) { 282 if (!WebBindings::getProperty(NULL, object, identifier, &result)) {
115 // TODO(darin): raise exception 283 // An exception may have been raised.
284 if (!try_catch.HasException())
285 try_catch.SetException(kUnableToGetPropertyException);
116 return PP_MakeVoid(); 286 return PP_MakeVoid();
117 } 287 }
118 288
119 PP_Var ret = NPVariantToPPVar(&result); 289 PP_Var ret = NPVariantToPPVar(&result);
120 WebBindings::releaseVariantValue(&result); 290 WebBindings::releaseVariantValue(&result);
121 return ret; 291 return ret;
122 } 292 }
123 293
124 void GetAllPropertyNames(PP_Var var, 294 void GetAllPropertyNames(PP_Var var,
125 uint32_t* property_count, 295 uint32_t* property_count,
126 PP_Var** properties, 296 PP_Var** properties,
127 PP_Var* exception) { 297 PP_Var* exception) {
128 if (exception && exception->type != PP_VarType_Void) 298 TryCatch try_catch(exception);
299 if (try_catch.HasException())
129 return; 300 return;
130 301
131 // TODO(darin) 302 // TODO(darin): Implement this method!
303 try_catch.SetException(kUnableToGetAllPropertiesException);
132 } 304 }
133 305
134 void SetProperty(PP_Var var, 306 void SetProperty(PP_Var var,
135 PP_Var name, 307 PP_Var name,
136 PP_Var value, 308 PP_Var value,
137 PP_Var* exception) { 309 PP_Var* exception) {
138 if (exception && exception->type != PP_VarType_Void) 310 TryCatch try_catch(exception);
311 if (try_catch.HasException())
139 return; 312 return;
140 313
141 NPObject* object = GetNPObject(var); 314 NPObject* object = GetNPObject(var);
142 if (!object) { 315 if (!object) {
143 // TODO(darin): raise exception 316 try_catch.SetException(kInvalidObjectException);
144 return; 317 return;
145 } 318 }
146 319
147 NPIdentifier identifier = PPVarToNPIdentifier(name); 320 NPIdentifier identifier = PPVarToNPIdentifier(name);
148 if (!identifier) { 321 if (!identifier) {
149 // TODO(darin): raise exception 322 try_catch.SetException(kInvalidPropertyException);
150 return; 323 return;
151 } 324 }
152 325
153 NPVariant variant = PPVarToNPVariantNoCopy(value); 326 NPVariant variant = PPVarToNPVariantNoCopy(value);
154 WebBindings::setProperty(NULL, object, identifier, &variant); 327 if (!WebBindings::setProperty(NULL, object, identifier, &variant)) {
328 if (!try_catch.HasException())
329 try_catch.SetException(kUnableToSetPropertyException);
330 }
155 } 331 }
156 332
157 void RemoveProperty(PP_Var var, 333 void RemoveProperty(PP_Var var,
158 PP_Var name, 334 PP_Var name,
159 PP_Var* exception) { 335 PP_Var* exception) {
160 if (exception && exception->type != PP_VarType_Void) 336 TryCatch try_catch(exception);
337 if (try_catch.HasException())
161 return; 338 return;
162 339
163 NPObject* object = GetNPObject(var); 340 NPObject* object = GetNPObject(var);
164 if (!object) { 341 if (!object) {
165 // TODO(darin): raise exception 342 try_catch.SetException(kInvalidObjectException);
166 return; 343 return;
167 } 344 }
168 345
169 NPIdentifier identifier = PPVarToNPIdentifier(name); 346 NPIdentifier identifier = PPVarToNPIdentifier(name);
170 if (!identifier) { 347 if (!identifier) {
171 // TODO(darin): raise exception 348 try_catch.SetException(kInvalidPropertyException);
172 return; 349 return;
173 } 350 }
174 351
175 WebBindings::removeProperty(NULL, object, identifier); 352 if (!WebBindings::removeProperty(NULL, object, identifier)) {
353 if (!try_catch.HasException())
354 try_catch.SetException(kUnableToRemovePropertyException);
355 }
176 } 356 }
177 357
178 PP_Var Call(PP_Var var, 358 PP_Var Call(PP_Var var,
179 PP_Var method_name, 359 PP_Var method_name,
180 int32_t argc, 360 int32_t argc,
181 PP_Var* argv, 361 PP_Var* argv,
182 PP_Var* exception) { 362 PP_Var* exception) {
183 if (exception && exception->type != PP_VarType_Void) 363 TryCatch try_catch(exception);
364 if (try_catch.HasException())
184 return PP_MakeVoid(); 365 return PP_MakeVoid();
185 366
186 NPObject* object = GetNPObject(var); 367 NPObject* object = GetNPObject(var);
187 if (!object) { 368 if (!object) {
188 // TODO(darin): raise exception 369 try_catch.SetException(kInvalidObjectException);
189 return PP_MakeVoid(); 370 return PP_MakeVoid();
190 } 371 }
191 372
192 NPIdentifier identifier; 373 NPIdentifier identifier;
193 if (method_name.type == PP_VarType_Void) { 374 if (method_name.type == PP_VarType_Void) {
194 identifier = NULL; 375 identifier = NULL;
195 } else { 376 } else {
196 identifier = PPVarToNPIdentifier(method_name); 377 identifier = PPVarToNPIdentifier(method_name);
197 if (!identifier) { 378 if (!identifier) {
198 // TODO(darin): raise exception 379 try_catch.SetException(kInvalidPropertyException);
199 return PP_MakeVoid(); 380 return PP_MakeVoid();
200 } 381 }
201 } 382 }
202 383
203 scoped_array<NPVariant> args; 384 scoped_array<NPVariant> args;
204 if (argc) { 385 if (argc) {
205 args.reset(new NPVariant[argc]); 386 args.reset(new NPVariant[argc]);
206 for (int32_t i = 0; i < argc; ++i) 387 for (int32_t i = 0; i < argc; ++i)
207 args[i] = PPVarToNPVariantNoCopy(argv[i]); 388 args[i] = PPVarToNPVariantNoCopy(argv[i]);
208 } 389 }
209 390
210 bool ok; 391 bool ok;
211 392
212 NPVariant result; 393 NPVariant result;
213 if (identifier) { 394 if (identifier) {
214 ok = WebBindings::invoke(NULL, object, identifier, args.get(), argc, 395 ok = WebBindings::invoke(NULL, object, identifier, args.get(), argc,
215 &result); 396 &result);
216 } else { 397 } else {
217 ok = WebBindings::invokeDefault(NULL, object, args.get(), argc, &result); 398 ok = WebBindings::invokeDefault(NULL, object, args.get(), argc, &result);
218 } 399 }
219 400
220 if (!ok) { 401 if (!ok) {
221 // TODO(darin): raise exception 402 // An exception may have been raised.
403 if (!try_catch.HasException())
404 try_catch.SetException(kUnableToCallMethodException);
222 return PP_MakeVoid(); 405 return PP_MakeVoid();
223 } 406 }
224 407
225 PP_Var ret = NPVariantToPPVar(&result); 408 PP_Var ret = NPVariantToPPVar(&result);
226 WebBindings::releaseVariantValue(&result); 409 WebBindings::releaseVariantValue(&result);
227 return ret; 410 return ret;
228 } 411 }
229 412
230 PP_Var Construct(PP_Var var, 413 PP_Var Construct(PP_Var var,
231 int32_t argc, 414 int32_t argc,
232 PP_Var* argv, 415 PP_Var* argv,
233 PP_Var* exception) { 416 PP_Var* exception) {
234 if (exception && exception->type != PP_VarType_Void) 417 TryCatch try_catch(exception);
418 if (try_catch.HasException())
235 return PP_MakeVoid(); 419 return PP_MakeVoid();
236 420
237 NPObject* object = GetNPObject(var); 421 NPObject* object = GetNPObject(var);
238 if (!object) { 422 if (!object) {
239 // TODO(darin): raise exception 423 try_catch.SetException(kInvalidObjectException);
240 return PP_MakeVoid(); 424 return PP_MakeVoid();
241 } 425 }
242 426
243 scoped_array<NPVariant> args; 427 scoped_array<NPVariant> args;
244 if (argc) { 428 if (argc) {
245 args.reset(new NPVariant[argc]); 429 args.reset(new NPVariant[argc]);
246 for (int32_t i = 0; i < argc; ++i) 430 for (int32_t i = 0; i < argc; ++i)
247 args[i] = PPVarToNPVariantNoCopy(argv[i]); 431 args[i] = PPVarToNPVariantNoCopy(argv[i]);
248 } 432 }
249 433
250 NPVariant result; 434 NPVariant result;
251 if (!WebBindings::construct(NULL, object, args.get(), argc, &result)) { 435 if (!WebBindings::construct(NULL, object, args.get(), argc, &result)) {
252 // TODO(darin): raise exception 436 // An exception may have been raised.
437 if (!try_catch.HasException())
438 try_catch.SetException(kUnableToConstructException);
253 return PP_MakeVoid(); 439 return PP_MakeVoid();
254 } 440 }
255 441
256 PP_Var ret = NPVariantToPPVar(&result); 442 PP_Var ret = NPVariantToPPVar(&result);
257 WebBindings::releaseVariantValue(&result); 443 WebBindings::releaseVariantValue(&result);
258 return ret; 444 return ret;
259 } 445 }
260 446
261 PP_Var CreateObject(const PPP_Class* object_class, 447 PP_Var CreateObject(const PPP_Class* object_class,
262 void* object_data) { 448 void* object_data) {
263 return PP_MakeVoid(); // TODO(darin) 449 return PP_MakeVoid(); // TODO(darin): Implement this method!
264 } 450 }
265 451
266 const PPB_Var var_interface = { 452 const PPB_Var var_interface = {
267 &AddRef, 453 &AddRef,
268 &Release, 454 &Release,
269 &VarFromUtf8, 455 &VarFromUtf8,
270 &VarToUtf8, 456 &VarToUtf8,
271 &HasProperty, 457 &HasProperty,
272 &GetProperty, 458 &GetProperty,
273 &GetAllPropertyNames, 459 &GetAllPropertyNames,
(...skipping 11 matching lines...) Expand all
285 } 471 }
286 472
287 PP_Var NPObjectToPPVar(NPObject* object) { 473 PP_Var NPObjectToPPVar(NPObject* object) {
288 PP_Var ret; 474 PP_Var ret;
289 ret.type = PP_VarType_Object; 475 ret.type = PP_VarType_Object;
290 ret.value.as_id = reinterpret_cast<intptr_t>(object); 476 ret.value.as_id = reinterpret_cast<intptr_t>(object);
291 WebBindings::retainObject(object); 477 WebBindings::retainObject(object);
292 return ret; 478 return ret;
293 } 479 }
294 480
295 PP_Var NPVariantToPPVar(NPVariant* variant) {
296 switch (variant->type) {
297 case NPVariantType_Void:
298 return PP_MakeVoid();
299 case NPVariantType_Null:
300 return PP_MakeNull();
301 case NPVariantType_Bool:
302 return PP_MakeBool(NPVARIANT_TO_BOOLEAN(*variant));
303 case NPVariantType_Int32:
304 return PP_MakeInt32(NPVARIANT_TO_INT32(*variant));
305 case NPVariantType_Double:
306 return PP_MakeDouble(NPVARIANT_TO_DOUBLE(*variant));
307 case NPVariantType_String:
308 return VarFromUtf8(NPVARIANT_TO_STRING(*variant).UTF8Characters,
309 NPVARIANT_TO_STRING(*variant).UTF8Length);
310 case NPVariantType_Object:
311 return NPObjectToPPVar(NPVARIANT_TO_OBJECT(*variant));
312 }
313 NOTREACHED();
314 return PP_MakeVoid();
315 }
316
317 NPVariant PPVarToNPVariant(PP_Var var) {
318 NPVariant ret;
319 switch (var.type) {
320 case PP_VarType_Void:
321 VOID_TO_NPVARIANT(ret);
322 break;
323 case PP_VarType_Null:
324 NULL_TO_NPVARIANT(ret);
325 break;
326 case PP_VarType_Bool:
327 BOOLEAN_TO_NPVARIANT(var.value.as_bool, ret);
328 break;
329 case PP_VarType_Int32:
330 INT32_TO_NPVARIANT(var.value.as_int, ret);
331 break;
332 case PP_VarType_Double:
333 DOUBLE_TO_NPVARIANT(var.value.as_double, ret);
334 break;
335 case PP_VarType_String: {
336 const std::string& value = GetStringUnchecked(var)->value();
337 STRINGN_TO_NPVARIANT(base::strdup(value.c_str()), value.size(), ret);
338 break;
339 }
340 case PP_VarType_Object: {
341 NPObject* object = GetNPObjectUnchecked(var);
342 OBJECT_TO_NPVARIANT(WebBindings::retainObject(object), ret);
343 break;
344 }
345 }
346 return ret;
347 }
348
349 NPVariant PPVarToNPVariantNoCopy(PP_Var var) {
350 NPVariant ret;
351 switch (var.type) {
352 case PP_VarType_Void:
353 VOID_TO_NPVARIANT(ret);
354 break;
355 case PP_VarType_Null:
356 NULL_TO_NPVARIANT(ret);
357 break;
358 case PP_VarType_Bool:
359 BOOLEAN_TO_NPVARIANT(var.value.as_bool, ret);
360 break;
361 case PP_VarType_Int32:
362 INT32_TO_NPVARIANT(var.value.as_int, ret);
363 break;
364 case PP_VarType_Double:
365 DOUBLE_TO_NPVARIANT(var.value.as_double, ret);
366 break;
367 case PP_VarType_String: {
368 const std::string& value = GetStringUnchecked(var)->value();
369 STRINGN_TO_NPVARIANT(value.c_str(), value.size(), ret);
370 break;
371 }
372 case PP_VarType_Object: {
373 OBJECT_TO_NPVARIANT(GetNPObjectUnchecked(var), ret);
374 break;
375 }
376 }
377 return ret;
378 }
379
380 NPIdentifier PPVarToNPIdentifier(PP_Var var) {
381 switch (var.type) {
382 case PP_VarType_String:
383 return WebBindings::getStringIdentifier(
384 GetStringUnchecked(var)->value().c_str());
385 case PP_VarType_Int32:
386 return WebBindings::getIntIdentifier(var.value.as_int);
387 default:
388 return NULL;
389 }
390 }
391
392 } // namespace pepper 481 } // namespace pepper
OLDNEW
« no previous file with comments | « webkit/glue/plugins/pepper_var.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698