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

Side by Side Diff: content/renderer/pepper/ppb_var_deprecated_impl.cc

Issue 459553003: Replace NPObject usage in ppapi with gin (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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) 2012 The Chromium Authors. All rights reserved. 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 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 "content/renderer/pepper/ppb_var_deprecated_impl.h" 5 #include "content/renderer/pepper/ppb_var_deprecated_impl.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "content/renderer/pepper/host_globals.h" 9 #include "content/renderer/pepper/host_globals.h"
10 #include "content/renderer/pepper/npapi_glue.h" 10 #include "content/renderer/pepper/message_channel.h"
11 #include "content/renderer/pepper/npobject_var.h"
12 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" 11 #include "content/renderer/pepper/pepper_plugin_instance_impl.h"
12 #include "content/renderer/pepper/pepper_try_catch.h"
13 #include "content/renderer/pepper/plugin_module.h" 13 #include "content/renderer/pepper/plugin_module.h"
14 #include "content/renderer/pepper/plugin_object.h" 14 #include "content/renderer/pepper/plugin_object.h"
15 #include "content/renderer/pepper/v8object_var.h"
15 #include "ppapi/c/dev/ppb_var_deprecated.h" 16 #include "ppapi/c/dev/ppb_var_deprecated.h"
16 #include "ppapi/c/ppb_var.h" 17 #include "ppapi/c/ppb_var.h"
17 #include "ppapi/c/pp_var.h"
18 #include "ppapi/shared_impl/ppb_var_shared.h" 18 #include "ppapi/shared_impl/ppb_var_shared.h"
19 #include "third_party/WebKit/public/web/WebBindings.h" 19 #include "third_party/WebKit/public/web/WebDocument.h"
20 #include "third_party/WebKit/public/web/WebElement.h"
21 #include "third_party/WebKit/public/web/WebLocalFrame.h"
22 #include "third_party/WebKit/public/web/WebPluginContainer.h"
20 #include "third_party/WebKit/public/web/WebScopedUserGesture.h" 23 #include "third_party/WebKit/public/web/WebScopedUserGesture.h"
21 24
22 using ppapi::NPObjectVar; 25 using ppapi::V8ObjectVar;
23 using ppapi::PpapiGlobals; 26 using ppapi::PpapiGlobals;
27 using ppapi::ScopedPPVar;
28 using ppapi::ScopedPPVarArray;
24 using ppapi::StringVar; 29 using ppapi::StringVar;
25 using ppapi::Var; 30 using ppapi::Var;
26 using blink::WebBindings;
27 31
28 namespace content { 32 namespace content {
29 33
30 namespace { 34 namespace {
31 35
36 const char kInvalidIdentifierException[] = "Error: Invalid identifier.";
32 const char kInvalidObjectException[] = "Error: Invalid object"; 37 const char kInvalidObjectException[] = "Error: Invalid object";
33 const char kInvalidPropertyException[] = "Error: Invalid property";
34 const char kInvalidValueException[] = "Error: Invalid value";
35 const char kUnableToGetPropertyException[] = "Error: Unable to get property";
36 const char kUnableToSetPropertyException[] = "Error: Unable to set property";
37 const char kUnableToRemovePropertyException[] =
38 "Error: Unable to remove property";
39 const char kUnableToGetAllPropertiesException[] =
40 "Error: Unable to get all properties";
41 const char kUnableToCallMethodException[] = "Error: Unable to call method"; 38 const char kUnableToCallMethodException[] = "Error: Unable to call method";
42 const char kUnableToConstructException[] = "Error: Unable to construct"; 39
43 40 class ObjectAccessor {
44 // --------------------------------------------------------------------------- 41 public:
45 // Utilities 42 ObjectAccessor(PP_Var var)
46 43 : object_var_(V8ObjectVar::FromPPVar(var)),
47 // Converts the given PP_Var to an NPVariant, returning true on success. 44 instance_(object_var_ ? object_var_->instance() : NULL) {
48 // False means that the given variant is invalid. In this case, the result 45 }
49 // NPVariant will be set to a void one. 46
50 // 47 // Check if the object is valid. If it isn't, set an exception and return
51 // The contents of the PP_Var will NOT be copied, so you need to ensure that 48 // false.
52 // the PP_Var remains valid while the resultant NPVariant is in use. 49 bool IsValid(PP_Var* exception) {
53 bool PPVarToNPVariantNoCopy(PP_Var var, NPVariant* result) { 50 // If we already have an exception, then the call is invalid according to
54 switch (var.type) { 51 // the unittests.
55 case PP_VARTYPE_UNDEFINED: 52 if (exception && exception->type != PP_VARTYPE_UNDEFINED)
56 VOID_TO_NPVARIANT(*result);
57 break;
58 case PP_VARTYPE_NULL:
59 NULL_TO_NPVARIANT(*result);
60 break;
61 case PP_VARTYPE_BOOL:
62 BOOLEAN_TO_NPVARIANT(var.value.as_bool, *result);
63 break;
64 case PP_VARTYPE_INT32:
65 INT32_TO_NPVARIANT(var.value.as_int, *result);
66 break;
67 case PP_VARTYPE_DOUBLE:
68 DOUBLE_TO_NPVARIANT(var.value.as_double, *result);
69 break;
70 case PP_VARTYPE_STRING: {
71 StringVar* string = StringVar::FromPPVar(var);
72 if (!string) {
73 VOID_TO_NPVARIANT(*result);
74 return false;
75 }
76 const std::string& value = string->value();
77 STRINGN_TO_NPVARIANT(value.c_str(), value.size(), *result);
78 break;
79 }
80 case PP_VARTYPE_OBJECT: {
81 scoped_refptr<NPObjectVar> object(NPObjectVar::FromPPVar(var));
82 if (!object.get()) {
83 VOID_TO_NPVARIANT(*result);
84 return false;
85 }
86 OBJECT_TO_NPVARIANT(object->np_object(), *result);
87 break;
88 }
89 default:
90 VOID_TO_NPVARIANT(*result);
91 return false; 53 return false;
92 } 54 if (instance_)
93 return true; 55 return true;
94 } 56 if (exception)
95 57 *exception = ppapi::StringVar::StringToPPVar(kInvalidObjectException);
96 // ObjectAccessorTryCatch ------------------------------------------------------ 58 return false;
97 59 }
98 // Automatically sets up a TryCatch for accessing the object identified by the 60 // Lazily grab the object so that the handle is created in the current handle
99 // given PP_Var. The module from the object will be used for the exception 61 // scope.
100 // strings generated by the TryCatch. 62 v8::Handle<v8::Object> GetObject() { return object_var_->GetHandle(); }
101 // 63 PepperPluginInstanceImpl* instance() { return instance_; }
102 // This will automatically retrieve the ObjectVar from the object and throw 64
103 // an exception if it's invalid. At the end of construction, if there is no 65 private:
104 // exception, you know that there is no previously set exception, that the 66 V8ObjectVar* object_var_;
105 // object passed in is valid and ready to use (via the object() getter), and 67 PepperPluginInstanceImpl* instance_;
106 // that the TryCatch's pp_module() getter is also set up properly and ready to
107 // use.
108 class ObjectAccessorTryCatch : public TryCatch {
109 public:
110 ObjectAccessorTryCatch(PP_Var object, PP_Var* exception)
111 : TryCatch(exception), object_(NPObjectVar::FromPPVar(object)) {
112 if (!object_.get()) {
113 SetException(kInvalidObjectException);
114 }
115 }
116
117 NPObjectVar* object() { return object_.get(); }
118
119 PepperPluginInstanceImpl* GetPluginInstance() {
120 return HostGlobals::Get()->GetInstance(object()->pp_instance());
121 }
122
123 protected:
124 scoped_refptr<NPObjectVar> object_;
125
126 DISALLOW_COPY_AND_ASSIGN(ObjectAccessorTryCatch);
127 }; 68 };
128 69
129 // ObjectAccessiorWithIdentifierTryCatch --------------------------------------- 70 bool IsValidIdentifer(PP_Var identifier, PP_Var* exception) {
130 71 if (identifier.type == PP_VARTYPE_INT32 ||
131 // Automatically sets up a TryCatch for accessing the identifier on the given 72 identifier.type == PP_VARTYPE_STRING) {
132 // object. This just extends ObjectAccessorTryCatch to additionally convert 73 return true;
133 // the given identifier to an NPIdentifier and validate it, throwing an 74 }
134 // exception if it's invalid. 75 if (exception)
135 // 76 *exception = ppapi::StringVar::StringToPPVar(kInvalidIdentifierException);
136 // At the end of construction, if there is no exception, you know that there is 77 return false;
137 // no previously set exception, that the object passed in is valid and ready to
138 // use (via the object() getter), that the identifier is valid and ready to
139 // use (via the identifier() getter), and that the TryCatch's pp_module() getter
140 // is also set up properly and ready to use.
141 class ObjectAccessorWithIdentifierTryCatch : public ObjectAccessorTryCatch {
142 public:
143 ObjectAccessorWithIdentifierTryCatch(PP_Var object,
144 PP_Var identifier,
145 PP_Var* exception)
146 : ObjectAccessorTryCatch(object, exception), identifier_(0) {
147 if (!has_exception()) {
148 identifier_ = PPVarToNPIdentifier(identifier);
149 if (!identifier_)
150 SetException(kInvalidPropertyException);
151 }
152 }
153
154 NPIdentifier identifier() const { return identifier_; }
155
156 private:
157 NPIdentifier identifier_;
158
159 DISALLOW_COPY_AND_ASSIGN(ObjectAccessorWithIdentifierTryCatch);
160 };
161
162 PP_Bool HasProperty(PP_Var var, PP_Var name, PP_Var* exception) {
163 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception);
164 if (accessor.has_exception())
165 return PP_FALSE;
166 return PP_FromBool(WebBindings::hasProperty(
167 NULL, accessor.object()->np_object(), accessor.identifier()));
168 } 78 }
169 79
170 bool HasPropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { 80 bool HasPropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) {
171 return PP_ToBool(HasProperty(var, name, exception)); 81 ObjectAccessor accessor(var);
82 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception))
83 return false;
84
85 PepperTryCatchVar try_catch(accessor.instance(), true, exception);
86 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name);
87 if (try_catch.HasException())
88 return false;
89
90 bool result = accessor.GetObject()->Has(v8_name);
91 if (try_catch.HasException())
92 return false;
93 return result;
172 } 94 }
173 95
174 bool HasMethodDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { 96 bool HasMethodDeprecated(PP_Var var, PP_Var name, PP_Var* exception) {
175 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); 97 ObjectAccessor accessor(var);
176 if (accessor.has_exception()) 98 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception))
177 return false; 99 return false;
178 return WebBindings::hasMethod( 100
179 NULL, accessor.object()->np_object(), accessor.identifier()); 101 PepperTryCatchVar try_catch(accessor.instance(), true, exception);
102 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name);
103 if (try_catch.HasException())
104 return false;
105
106 bool result = accessor.GetObject()->Has(v8_name) &&
107 accessor.GetObject()->Get(v8_name)->IsFunction();
108 if (try_catch.HasException())
109 return false;
110 return result;
180 } 111 }
181 112
182 PP_Var GetProperty(PP_Var var, PP_Var name, PP_Var* exception) { 113 PP_Var GetProperty(PP_Var var, PP_Var name, PP_Var* exception) {
183 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); 114 ObjectAccessor accessor(var);
184 if (accessor.has_exception()) 115 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception))
185 return PP_MakeUndefined(); 116 return PP_MakeUndefined();
186 117
187 NPVariant result; 118 PepperTryCatchVar try_catch(accessor.instance(), true, exception);
188 if (!WebBindings::getProperty(NULL, 119 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name);
189 accessor.object()->np_object(), 120 if (try_catch.HasException())
190 accessor.identifier(), 121 return PP_MakeUndefined();
191 &result)) { 122
192 // An exception may have been raised. 123 ScopedPPVar result_var = try_catch.FromV8(accessor.GetObject()->Get(v8_name));
193 accessor.SetException(kUnableToGetPropertyException); 124 if (try_catch.HasException())
194 return PP_MakeUndefined(); 125 return PP_MakeUndefined();
195 } 126
196 127 return result_var.Release();
197 PP_Var ret = NPVariantToPPVar(accessor.GetPluginInstance(), &result);
198 WebBindings::releaseVariantValue(&result);
199 return ret;
200 } 128 }
201 129
202 void EnumerateProperties(PP_Var var, 130 void EnumerateProperties(PP_Var var,
203 uint32_t* property_count, 131 uint32_t* property_count,
204 PP_Var** properties, 132 PP_Var** properties,
205 PP_Var* exception) { 133 PP_Var* exception) {
134 ObjectAccessor accessor(var);
135 if (!accessor.IsValid(exception))
136 return;
137
138 PepperTryCatchVar try_catch(accessor.instance(), true, exception);
139
206 *properties = NULL; 140 *properties = NULL;
207 *property_count = 0; 141 *property_count = 0;
208 142
209 ObjectAccessorTryCatch accessor(var, exception); 143 v8::Local<v8::Array> identifiers = accessor.GetObject()->GetPropertyNames();
210 if (accessor.has_exception()) 144 if (try_catch.HasException())
211 return; 145 return;
212 146 ScopedPPVarArray identifier_vars(identifiers->Length());
213 NPIdentifier* identifiers = NULL; 147 for (uint32_t i = 0; i < identifiers->Length(); ++i) {
214 uint32_t count = 0; 148 ScopedPPVar var = try_catch.FromV8(identifiers->Get(i));
215 if (!WebBindings::enumerate( 149 if (try_catch.HasException())
216 NULL, accessor.object()->np_object(), &identifiers, &count)) { 150 return;
217 accessor.SetException(kUnableToGetAllPropertiesException); 151 identifier_vars.Set(i, var.get());
218 return; 152 }
219 } 153
220 154 size_t size;
221 if (count == 0) 155 *properties = identifier_vars.Release(
222 return; 156 ScopedPPVarArray::PassPPBMemoryAllocatedArray(),
223 157 &size);
224 *property_count = count; 158 *property_count = size;
225 *properties = static_cast<PP_Var*>(malloc(sizeof(PP_Var) * count));
226 for (uint32_t i = 0; i < count; ++i) {
227 (*properties)[i] = NPIdentifierToPPVar(identifiers[i]);
228 }
229 free(identifiers);
230 } 159 }
231 160
232 void SetPropertyDeprecated(PP_Var var, 161 void SetPropertyDeprecated(PP_Var var,
233 PP_Var name, 162 PP_Var name,
234 PP_Var value, 163 PP_Var value,
235 PP_Var* exception) { 164 PP_Var* exception) {
236 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); 165 ObjectAccessor accessor(var);
237 if (accessor.has_exception()) 166 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception))
238 return; 167 return;
239 168
240 NPVariant variant; 169 PepperTryCatchVar try_catch(accessor.instance(), true, exception);
241 if (!PPVarToNPVariantNoCopy(value, &variant)) { 170 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name);
242 accessor.SetException(kInvalidValueException); 171 v8::Handle<v8::Value> v8_value = try_catch.ToV8(value);
243 return; 172
244 } 173 if (try_catch.HasException())
245 if (!WebBindings::setProperty(NULL, 174 return;
246 accessor.object()->np_object(), 175
247 accessor.identifier(), 176 accessor.GetObject()->Set(v8_name, v8_value);
248 &variant)) 177 try_catch.HasException(); // Ensure an exception gets set if one occured.
249 accessor.SetException(kUnableToSetPropertyException);
250 } 178 }
251 179
252 void DeletePropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { 180 void DeletePropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) {
253 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); 181 ObjectAccessor accessor(var);
254 if (accessor.has_exception()) 182 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception))
255 return; 183 return;
256 184
257 if (!WebBindings::removeProperty( 185 PepperTryCatchVar try_catch(accessor.instance(), true, exception);
258 NULL, accessor.object()->np_object(), accessor.identifier())) 186 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name);
259 accessor.SetException(kUnableToRemovePropertyException); 187
260 } 188 if (try_catch.HasException())
261 189 return;
262 PP_Var InternalCallDeprecated(ObjectAccessorTryCatch* accessor, 190
191 accessor.GetObject()->Delete(v8_name);
192 try_catch.HasException(); // Ensure an exception gets set if one occured.
193 }
194
195 PP_Var CallDeprecatedInternal(PP_Var var,
263 PP_Var method_name, 196 PP_Var method_name,
264 uint32_t argc, 197 uint32_t argc,
265 PP_Var* argv, 198 PP_Var* argv,
266 PP_Var* exception) { 199 PP_Var* exception) {
267 NPIdentifier identifier; 200 ObjectAccessor accessor(var);
201 if (!accessor.IsValid(exception))
202 return PP_MakeUndefined();
203
204 // If the method name is undefined, set it to the empty string to trigger
205 // calling |var| as a function.
206 ScopedPPVar scoped_method(method_name);
268 if (method_name.type == PP_VARTYPE_UNDEFINED) { 207 if (method_name.type == PP_VARTYPE_UNDEFINED) {
269 identifier = NULL; 208 scoped_method = ScopedPPVar(ScopedPPVar::PassRef(),
270 } else if (method_name.type == PP_VARTYPE_STRING) { 209 StringVar::StringToPPVar(""));
271 // Specifically allow only string functions to be called. 210 }
272 identifier = PPVarToNPIdentifier(method_name); 211
273 if (!identifier) { 212 PepperTryCatchVar try_catch(accessor.instance(), true, exception);
274 accessor->SetException(kInvalidPropertyException); 213 v8::Handle<v8::Value> v8_method_name = try_catch.ToV8(scoped_method.get());
214 if (try_catch.HasException())
215 return PP_MakeUndefined();
216
217 if (!v8_method_name->IsString()) {
218 try_catch.SetException(kUnableToCallMethodException);
219 return PP_MakeUndefined();
220 }
221
222 v8::Handle<v8::Object> function = accessor.GetObject();
223 v8::Handle<v8::Object> recv =
224 accessor.instance()->GetContext()->Global();
225 if (v8_method_name.As<v8::String>()->Length() != 0) {
226 function = function->Get(v8_method_name)->ToObject();
227 recv = accessor.GetObject();
228 }
229
230 if (try_catch.HasException())
231 return PP_MakeUndefined();
232
233 if (!function->IsFunction()) {
234 try_catch.SetException(kUnableToCallMethodException);
235 return PP_MakeUndefined();
236 }
237
238 scoped_ptr<v8::Handle<v8::Value>[] > converted_args(
239 new v8::Handle<v8::Value>[argc]);
240 for (uint32_t i = 0; i < argc; ++i) {
241 converted_args[i] = try_catch.ToV8(argv[i]);
242 if (try_catch.HasException())
275 return PP_MakeUndefined(); 243 return PP_MakeUndefined();
276 } 244 }
277 } else { 245
278 accessor->SetException(kInvalidPropertyException); 246 blink::WebLocalFrame* frame =
279 return PP_MakeUndefined(); 247 accessor.instance()->container()->element().document().frame();
280 } 248 if (!frame) {
281 249 try_catch.SetException("No frame to execute script in.");
282 scoped_ptr<NPVariant[]> args; 250 return PP_MakeUndefined();
283 if (argc) { 251 }
284 args.reset(new NPVariant[argc]); 252
285 for (uint32_t i = 0; i < argc; ++i) { 253 // TODO(raymes): Is this the right way to do this?
286 if (!PPVarToNPVariantNoCopy(argv[i], &args[i])) { 254 v8::Handle<v8::Value> result = frame->callFunctionEvenIfScriptDisabled(
287 // This argument was invalid, throw an exception & give up. 255 function.As<v8::Function>(), recv, argc, converted_args.get());
raymes 2014/08/11 06:49:03 jochen: is this the appropriate way to execute a f
288 accessor->SetException(kInvalidValueException); 256 ScopedPPVar result_var = try_catch.FromV8(result);
289 return PP_MakeUndefined(); 257
290 } 258 if (try_catch.HasException())
291 } 259 return PP_MakeUndefined();
292 } 260
293 261 return result_var.Release();
294 bool ok;
295
296 NPVariant result;
297 if (identifier) {
298 ok = WebBindings::invoke(NULL,
299 accessor->object()->np_object(),
300 identifier,
301 args.get(),
302 argc,
303 &result);
304 } else {
305 ok = WebBindings::invokeDefault(
306 NULL, accessor->object()->np_object(), args.get(), argc, &result);
307 }
308
309 if (!ok) {
310 // An exception may have been raised.
311 accessor->SetException(kUnableToCallMethodException);
312 return PP_MakeUndefined();
313 }
314
315 PP_Var ret = NPVariantToPPVar(accessor->GetPluginInstance(), &result);
316 WebBindings::releaseVariantValue(&result);
317 return ret;
318 } 262 }
319 263
320 PP_Var CallDeprecated(PP_Var var, 264 PP_Var CallDeprecated(PP_Var var,
321 PP_Var method_name, 265 PP_Var method_name,
322 uint32_t argc, 266 uint32_t argc,
323 PP_Var* argv, 267 PP_Var* argv,
324 PP_Var* exception) { 268 PP_Var* exception) {
325 ObjectAccessorTryCatch accessor(var, exception); 269 ObjectAccessor accessor(var);
326 if (accessor.has_exception()) 270 if (accessor.instance() && accessor.instance()->IsProcessingUserGesture()) {
327 return PP_MakeUndefined(); 271 blink::WebScopedUserGesture user_gesture(
328 PepperPluginInstanceImpl* plugin = accessor.GetPluginInstance(); 272 accessor.instance()->CurrentUserGestureToken());
329 if (plugin && plugin->IsProcessingUserGesture()) { 273 return CallDeprecatedInternal(var, method_name, argc, argv, exception);
330 blink::WebScopedUserGesture user_gesture(plugin->CurrentUserGestureToken());
331 return InternalCallDeprecated(
332 &accessor, method_name, argc, argv, exception);
333 } 274 }
334 return InternalCallDeprecated(&accessor, method_name, argc, argv, exception); 275 return CallDeprecatedInternal(var, method_name, argc, argv, exception);
335 } 276 }
336 277
337 PP_Var Construct(PP_Var var, uint32_t argc, PP_Var* argv, PP_Var* exception) { 278 PP_Var Construct(PP_Var var, uint32_t argc, PP_Var* argv, PP_Var* exception) {
338 ObjectAccessorTryCatch accessor(var, exception); 279 // Deprecated.
339 if (accessor.has_exception()) 280 NOTREACHED();
340 return PP_MakeUndefined(); 281 return PP_MakeUndefined();
341
342 scoped_ptr<NPVariant[]> args;
343 if (argc) {
344 args.reset(new NPVariant[argc]);
345 for (uint32_t i = 0; i < argc; ++i) {
346 if (!PPVarToNPVariantNoCopy(argv[i], &args[i])) {
347 // This argument was invalid, throw an exception & give up.
348 accessor.SetException(kInvalidValueException);
349 return PP_MakeUndefined();
350 }
351 }
352 }
353
354 NPVariant result;
355 if (!WebBindings::construct(
356 NULL, accessor.object()->np_object(), args.get(), argc, &result)) {
357 // An exception may have been raised.
358 accessor.SetException(kUnableToConstructException);
359 return PP_MakeUndefined();
360 }
361
362 PP_Var ret = NPVariantToPPVar(accessor.GetPluginInstance(), &result);
363 WebBindings::releaseVariantValue(&result);
364 return ret;
365 } 282 }
366 283
367 bool IsInstanceOfDeprecated(PP_Var var, 284 bool IsInstanceOfDeprecated(PP_Var var,
368 const PPP_Class_Deprecated* ppp_class, 285 const PPP_Class_Deprecated* ppp_class,
369 void** ppp_class_data) { 286 void** ppp_class_data) {
370 scoped_refptr<NPObjectVar> object(NPObjectVar::FromPPVar(var)); 287 scoped_refptr<V8ObjectVar> object(V8ObjectVar::FromPPVar(var));
371 if (!object.get()) 288 if (!object.get())
372 return false; // Not an object at all. 289 return false; // Not an object at all.
373 290
374 return PluginObject::IsInstanceOf( 291 PepperTryCatchVar try_catch(object->instance(), false, NULL);
375 object->np_object(), ppp_class, ppp_class_data); 292 PluginObject* plugin_object = PluginObject::FromV8Object(
293 object->instance()->GetIsolate(), object->GetHandle());
294 if (plugin_object && plugin_object->ppp_class() == ppp_class) {
295 if (ppp_class_data)
296 *ppp_class_data = plugin_object->ppp_class_data();
297 return true;
298 }
299
300 return false;
376 } 301 }
377 302
378 PP_Var CreateObjectDeprecated(PP_Instance pp_instance, 303 PP_Var CreateObjectDeprecated(PP_Instance pp_instance,
379 const PPP_Class_Deprecated* ppp_class, 304 const PPP_Class_Deprecated* ppp_class,
380 void* ppp_class_data) { 305 void* ppp_class_data) {
381 PepperPluginInstanceImpl* instance = 306 PepperPluginInstanceImpl* instance =
382 HostGlobals::Get()->GetInstance(pp_instance); 307 HostGlobals::Get()->GetInstance(pp_instance);
383 if (!instance) { 308 if (!instance) {
384 DLOG(ERROR) << "Create object passed an invalid instance."; 309 DLOG(ERROR) << "Create object passed an invalid instance.";
385 return PP_MakeNull(); 310 return PP_MakeNull();
(...skipping 29 matching lines...) Expand all
415 &CallDeprecated, 340 &CallDeprecated,
416 &Construct, 341 &Construct,
417 &IsInstanceOfDeprecated, 342 &IsInstanceOfDeprecated,
418 &CreateObjectDeprecated, 343 &CreateObjectDeprecated,
419 &CreateObjectWithModuleDeprecated, }; 344 &CreateObjectWithModuleDeprecated, };
420 345
421 return &var_deprecated_interface; 346 return &var_deprecated_interface;
422 } 347 }
423 348
424 } // namespace content 349 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698