OLD | NEW |
---|---|
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; |
dmichael (off chromium)
2014/08/21 22:24:25
nit: It kind of looks like the size out-param in R
raymes
2014/08/25 01:40:01
Done.
| |
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); | |
dmichael (off chromium)
2014/08/21 22:24:25
nit: I think scoped_name might be clearer (scoped_
raymes
2014/08/25 01:40:01
Done.
| |
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(); |
dmichael (off chromium)
2014/08/21 22:24:25
I think you have to check container() to be fully
raymes
2014/08/25 01:40:01
Done.
| |
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 v8::Handle<v8::Value> result = frame->callFunctionEvenIfScriptDisabled( |
286 if (!PPVarToNPVariantNoCopy(argv[i], &args[i])) { | 254 function.As<v8::Function>(), recv, argc, converted_args.get()); |
dmichael (off chromium)
2014/08/21 22:24:25
I assume you checked that this matches existing be
raymes
2014/08/25 01:40:01
The existing behavior was implemented in quite a d
| |
287 // This argument was invalid, throw an exception & give up. | 255 ScopedPPVar result_var = try_catch.FromV8(result); |
288 accessor->SetException(kInvalidValueException); | 256 |
289 return PP_MakeUndefined(); | 257 if (try_catch.HasException()) |
290 } | 258 return PP_MakeUndefined(); |
291 } | 259 |
292 } | 260 return result_var.Release(); |
293 | |
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 } | 261 } |
319 | 262 |
320 PP_Var CallDeprecated(PP_Var var, | 263 PP_Var CallDeprecated(PP_Var var, |
321 PP_Var method_name, | 264 PP_Var method_name, |
322 uint32_t argc, | 265 uint32_t argc, |
323 PP_Var* argv, | 266 PP_Var* argv, |
324 PP_Var* exception) { | 267 PP_Var* exception) { |
325 ObjectAccessorTryCatch accessor(var, exception); | 268 ObjectAccessor accessor(var); |
326 if (accessor.has_exception()) | 269 if (accessor.instance() && accessor.instance()->IsProcessingUserGesture()) { |
327 return PP_MakeUndefined(); | 270 blink::WebScopedUserGesture user_gesture( |
328 PepperPluginInstanceImpl* plugin = accessor.GetPluginInstance(); | 271 accessor.instance()->CurrentUserGestureToken()); |
329 if (plugin && plugin->IsProcessingUserGesture()) { | 272 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 } | 273 } |
334 return InternalCallDeprecated(&accessor, method_name, argc, argv, exception); | 274 return CallDeprecatedInternal(var, method_name, argc, argv, exception); |
335 } | 275 } |
336 | 276 |
337 PP_Var Construct(PP_Var var, uint32_t argc, PP_Var* argv, PP_Var* exception) { | 277 PP_Var Construct(PP_Var var, uint32_t argc, PP_Var* argv, PP_Var* exception) { |
338 ObjectAccessorTryCatch accessor(var, exception); | 278 // Deprecated. |
339 if (accessor.has_exception()) | 279 NOTREACHED(); |
340 return PP_MakeUndefined(); | 280 return PP_MakeUndefined(); |
dmichael (off chromium)
2014/08/21 22:24:25
Are you sure this is OK to eliminate?
raymes
2014/08/25 01:40:01
Yep - I verified with Xing last week:
"[In VarPri
| |
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 } | 281 } |
366 | 282 |
367 bool IsInstanceOfDeprecated(PP_Var var, | 283 bool IsInstanceOfDeprecated(PP_Var var, |
368 const PPP_Class_Deprecated* ppp_class, | 284 const PPP_Class_Deprecated* ppp_class, |
369 void** ppp_class_data) { | 285 void** ppp_class_data) { |
370 scoped_refptr<NPObjectVar> object(NPObjectVar::FromPPVar(var)); | 286 scoped_refptr<V8ObjectVar> object(V8ObjectVar::FromPPVar(var)); |
371 if (!object.get()) | 287 if (!object.get()) |
372 return false; // Not an object at all. | 288 return false; // Not an object at all. |
373 | 289 |
374 return PluginObject::IsInstanceOf( | 290 v8::HandleScope handle_scope(object->instance()->GetIsolate()); |
375 object->np_object(), ppp_class, ppp_class_data); | 291 v8::Context::Scope context_scope(object->instance()->GetContext()); |
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 Loading... | |
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 |
OLD | NEW |