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/common.h" | 9 #include "content/renderer/pepper/common.h" |
10 #include "content/renderer/pepper/host_globals.h" | 10 #include "content/renderer/pepper/host_globals.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
102 // | 102 // |
103 // This will automatically retrieve the ObjectVar from the object and throw | 103 // This will automatically retrieve the ObjectVar from the object and throw |
104 // an exception if it's invalid. At the end of construction, if there is no | 104 // an exception if it's invalid. At the end of construction, if there is no |
105 // exception, you know that there is no previously set exception, that the | 105 // exception, you know that there is no previously set exception, that the |
106 // object passed in is valid and ready to use (via the object() getter), and | 106 // object passed in is valid and ready to use (via the object() getter), and |
107 // that the TryCatch's pp_module() getter is also set up properly and ready to | 107 // that the TryCatch's pp_module() getter is also set up properly and ready to |
108 // use. | 108 // use. |
109 class ObjectAccessorTryCatch : public TryCatch { | 109 class ObjectAccessorTryCatch : public TryCatch { |
110 public: | 110 public: |
111 ObjectAccessorTryCatch(PP_Var object, PP_Var* exception) | 111 ObjectAccessorTryCatch(PP_Var object, PP_Var* exception) |
112 : TryCatch(exception), | 112 : TryCatch(exception), object_(NPObjectVar::FromPPVar(object)) { |
113 object_(NPObjectVar::FromPPVar(object)) { | |
114 if (!object_.get()) { | 113 if (!object_.get()) { |
115 SetException(kInvalidObjectException); | 114 SetException(kInvalidObjectException); |
116 } | 115 } |
117 } | 116 } |
118 | 117 |
119 NPObjectVar* object() { return object_.get(); } | 118 NPObjectVar* object() { return object_.get(); } |
120 | 119 |
121 PepperPluginInstanceImpl* GetPluginInstance() { | 120 PepperPluginInstanceImpl* GetPluginInstance() { |
122 return HostGlobals::Get()->GetInstance(object()->pp_instance()); | 121 return HostGlobals::Get()->GetInstance(object()->pp_instance()); |
123 } | 122 } |
(...skipping 14 matching lines...) Expand all Loading... | |
138 // At the end of construction, if there is no exception, you know that there is | 137 // At the end of construction, if there is no exception, you know that there is |
139 // no previously set exception, that the object passed in is valid and ready to | 138 // no previously set exception, that the object passed in is valid and ready to |
140 // use (via the object() getter), that the identifier is valid and ready to | 139 // use (via the object() getter), that the identifier is valid and ready to |
141 // use (via the identifier() getter), and that the TryCatch's pp_module() getter | 140 // use (via the identifier() getter), and that the TryCatch's pp_module() getter |
142 // is also set up properly and ready to use. | 141 // is also set up properly and ready to use. |
143 class ObjectAccessorWithIdentifierTryCatch : public ObjectAccessorTryCatch { | 142 class ObjectAccessorWithIdentifierTryCatch : public ObjectAccessorTryCatch { |
144 public: | 143 public: |
145 ObjectAccessorWithIdentifierTryCatch(PP_Var object, | 144 ObjectAccessorWithIdentifierTryCatch(PP_Var object, |
146 PP_Var identifier, | 145 PP_Var identifier, |
147 PP_Var* exception) | 146 PP_Var* exception) |
148 : ObjectAccessorTryCatch(object, exception), | 147 : ObjectAccessorTryCatch(object, exception), identifier_(0) { |
149 identifier_(0) { | |
150 if (!has_exception()) { | 148 if (!has_exception()) { |
151 identifier_ = PPVarToNPIdentifier(identifier); | 149 identifier_ = PPVarToNPIdentifier(identifier); |
152 if (!identifier_) | 150 if (!identifier_) |
153 SetException(kInvalidPropertyException); | 151 SetException(kInvalidPropertyException); |
154 } | 152 } |
155 } | 153 } |
156 | 154 |
157 NPIdentifier identifier() const { return identifier_; } | 155 NPIdentifier identifier() const { return identifier_; } |
158 | 156 |
159 private: | 157 private: |
160 NPIdentifier identifier_; | 158 NPIdentifier identifier_; |
161 | 159 |
162 DISALLOW_COPY_AND_ASSIGN(ObjectAccessorWithIdentifierTryCatch); | 160 DISALLOW_COPY_AND_ASSIGN(ObjectAccessorWithIdentifierTryCatch); |
163 }; | 161 }; |
164 | 162 |
165 PP_Bool HasProperty(PP_Var var, | 163 PP_Bool HasProperty(PP_Var var, PP_Var name, PP_Var* exception) { |
166 PP_Var name, | |
167 PP_Var* exception) { | |
168 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); | 164 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); |
169 if (accessor.has_exception()) | 165 if (accessor.has_exception()) |
170 return PP_FALSE; | 166 return PP_FALSE; |
171 return BoolToPPBool(WebBindings::hasProperty(NULL, | 167 return BoolToPPBool(WebBindings::hasProperty( |
172 accessor.object()->np_object(), | 168 NULL, accessor.object()->np_object(), accessor.identifier())); |
173 accessor.identifier())); | |
174 } | 169 } |
175 | 170 |
176 bool HasPropertyDeprecated(PP_Var var, | 171 bool HasPropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { |
177 PP_Var name, | |
178 PP_Var* exception) { | |
179 return PPBoolToBool(HasProperty(var, name, exception)); | 172 return PPBoolToBool(HasProperty(var, name, exception)); |
180 } | 173 } |
181 | 174 |
182 bool HasMethodDeprecated(PP_Var var, | 175 bool HasMethodDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { |
183 PP_Var name, | |
184 PP_Var* exception) { | |
185 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); | 176 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); |
186 if (accessor.has_exception()) | 177 if (accessor.has_exception()) |
187 return false; | 178 return false; |
188 return WebBindings::hasMethod(NULL, accessor.object()->np_object(), | 179 return WebBindings::hasMethod( |
189 accessor.identifier()); | 180 NULL, accessor.object()->np_object(), accessor.identifier()); |
190 } | 181 } |
191 | 182 |
192 PP_Var GetProperty(PP_Var var, | 183 PP_Var GetProperty(PP_Var var, PP_Var name, PP_Var* exception) { |
193 PP_Var name, | |
194 PP_Var* exception) { | |
195 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); | 184 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); |
196 if (accessor.has_exception()) | 185 if (accessor.has_exception()) |
197 return PP_MakeUndefined(); | 186 return PP_MakeUndefined(); |
198 | 187 |
199 NPVariant result; | 188 NPVariant result; |
200 if (!WebBindings::getProperty(NULL, accessor.object()->np_object(), | 189 if (!WebBindings::getProperty(NULL, |
201 accessor.identifier(), &result)) { | 190 accessor.object()->np_object(), |
191 accessor.identifier(), | |
192 &result)) { | |
202 // An exception may have been raised. | 193 // An exception may have been raised. |
203 accessor.SetException(kUnableToGetPropertyException); | 194 accessor.SetException(kUnableToGetPropertyException); |
204 return PP_MakeUndefined(); | 195 return PP_MakeUndefined(); |
205 } | 196 } |
206 | 197 |
207 PP_Var ret = NPVariantToPPVar(accessor.GetPluginInstance(), &result); | 198 PP_Var ret = NPVariantToPPVar(accessor.GetPluginInstance(), &result); |
208 WebBindings::releaseVariantValue(&result); | 199 WebBindings::releaseVariantValue(&result); |
209 return ret; | 200 return ret; |
210 } | 201 } |
211 | 202 |
212 void EnumerateProperties(PP_Var var, | 203 void EnumerateProperties(PP_Var var, |
213 uint32_t* property_count, | 204 uint32_t* property_count, |
214 PP_Var** properties, | 205 PP_Var** properties, |
215 PP_Var* exception) { | 206 PP_Var* exception) { |
216 *properties = NULL; | 207 *properties = NULL; |
217 *property_count = 0; | 208 *property_count = 0; |
218 | 209 |
219 ObjectAccessorTryCatch accessor(var, exception); | 210 ObjectAccessorTryCatch accessor(var, exception); |
220 if (accessor.has_exception()) | 211 if (accessor.has_exception()) |
221 return; | 212 return; |
222 | 213 |
223 NPIdentifier* identifiers = NULL; | 214 NPIdentifier* identifiers = NULL; |
224 uint32_t count = 0; | 215 uint32_t count = 0; |
225 if (!WebBindings::enumerate(NULL, accessor.object()->np_object(), | 216 if (!WebBindings::enumerate( |
226 &identifiers, &count)) { | 217 NULL, accessor.object()->np_object(), &identifiers, &count)) { |
227 accessor.SetException(kUnableToGetAllPropertiesException); | 218 accessor.SetException(kUnableToGetAllPropertiesException); |
228 return; | 219 return; |
229 } | 220 } |
230 | 221 |
231 if (count == 0) | 222 if (count == 0) |
232 return; | 223 return; |
233 | 224 |
234 *property_count = count; | 225 *property_count = count; |
235 *properties = static_cast<PP_Var*>(malloc(sizeof(PP_Var) * count)); | 226 *properties = static_cast<PP_Var*>(malloc(sizeof(PP_Var) * count)); |
236 for (uint32_t i = 0; i < count; ++i) { | 227 for (uint32_t i = 0; i < count; ++i) { |
237 (*properties)[i] = NPIdentifierToPPVar(identifiers[i]); | 228 (*properties)[i] = NPIdentifierToPPVar(identifiers[i]); |
238 } | 229 } |
239 free(identifiers); | 230 free(identifiers); |
240 } | 231 } |
241 | 232 |
242 void SetPropertyDeprecated(PP_Var var, | 233 void SetPropertyDeprecated(PP_Var var, |
243 PP_Var name, | 234 PP_Var name, |
244 PP_Var value, | 235 PP_Var value, |
245 PP_Var* exception) { | 236 PP_Var* exception) { |
246 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); | 237 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); |
247 if (accessor.has_exception()) | 238 if (accessor.has_exception()) |
248 return; | 239 return; |
249 | 240 |
250 NPVariant variant; | 241 NPVariant variant; |
251 if (!PPVarToNPVariantNoCopy(value, &variant)) { | 242 if (!PPVarToNPVariantNoCopy(value, &variant)) { |
252 accessor.SetException(kInvalidValueException); | 243 accessor.SetException(kInvalidValueException); |
253 return; | 244 return; |
254 } | 245 } |
255 if (!WebBindings::setProperty(NULL, accessor.object()->np_object(), | 246 if (!WebBindings::setProperty(NULL, |
256 accessor.identifier(), &variant)) | 247 accessor.object()->np_object(), |
248 accessor.identifier(), | |
249 &variant)) | |
257 accessor.SetException(kUnableToSetPropertyException); | 250 accessor.SetException(kUnableToSetPropertyException); |
258 } | 251 } |
259 | 252 |
260 void DeletePropertyDeprecated(PP_Var var, | 253 void DeletePropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { |
261 PP_Var name, | |
262 PP_Var* exception) { | |
263 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); | 254 ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); |
264 if (accessor.has_exception()) | 255 if (accessor.has_exception()) |
265 return; | 256 return; |
266 | 257 |
267 if (!WebBindings::removeProperty(NULL, accessor.object()->np_object(), | 258 if (!WebBindings::removeProperty( |
268 accessor.identifier())) | 259 NULL, accessor.object()->np_object(), accessor.identifier())) |
269 accessor.SetException(kUnableToRemovePropertyException); | 260 accessor.SetException(kUnableToRemovePropertyException); |
270 } | 261 } |
271 | 262 |
272 PP_Var InternalCallDeprecated(ObjectAccessorTryCatch* accessor, | 263 PP_Var InternalCallDeprecated(ObjectAccessorTryCatch* accessor, |
273 PP_Var method_name, | 264 PP_Var method_name, |
274 uint32_t argc, | 265 uint32_t argc, |
275 PP_Var* argv, | 266 PP_Var* argv, |
276 PP_Var* exception) { | 267 PP_Var* exception) { |
277 NPIdentifier identifier; | 268 NPIdentifier identifier; |
278 if (method_name.type == PP_VARTYPE_UNDEFINED) { | 269 if (method_name.type == PP_VARTYPE_UNDEFINED) { |
(...skipping 19 matching lines...) Expand all Loading... | |
298 accessor->SetException(kInvalidValueException); | 289 accessor->SetException(kInvalidValueException); |
299 return PP_MakeUndefined(); | 290 return PP_MakeUndefined(); |
300 } | 291 } |
301 } | 292 } |
302 } | 293 } |
303 | 294 |
304 bool ok; | 295 bool ok; |
305 | 296 |
306 NPVariant result; | 297 NPVariant result; |
307 if (identifier) { | 298 if (identifier) { |
308 ok = WebBindings::invoke(NULL, accessor->object()->np_object(), | 299 ok = WebBindings::invoke(NULL, |
309 identifier, args.get(), argc, &result); | 300 accessor->object()->np_object(), |
301 identifier, | |
302 args.get(), | |
303 argc, | |
304 &result); | |
310 } else { | 305 } else { |
311 ok = WebBindings::invokeDefault(NULL, accessor->object()->np_object(), | 306 ok = WebBindings::invokeDefault( |
312 args.get(), argc, &result); | 307 NULL, accessor->object()->np_object(), args.get(), argc, &result); |
313 } | 308 } |
314 | 309 |
315 if (!ok) { | 310 if (!ok) { |
316 // An exception may have been raised. | 311 // An exception may have been raised. |
317 accessor->SetException(kUnableToCallMethodException); | 312 accessor->SetException(kUnableToCallMethodException); |
318 return PP_MakeUndefined(); | 313 return PP_MakeUndefined(); |
319 } | 314 } |
320 | 315 |
321 PP_Var ret = NPVariantToPPVar(accessor->GetPluginInstance(), &result); | 316 PP_Var ret = NPVariantToPPVar(accessor->GetPluginInstance(), &result); |
322 WebBindings::releaseVariantValue(&result); | 317 WebBindings::releaseVariantValue(&result); |
323 return ret; | 318 return ret; |
324 } | 319 } |
325 | 320 |
326 PP_Var CallDeprecated(PP_Var var, | 321 PP_Var CallDeprecated(PP_Var var, |
327 PP_Var method_name, | 322 PP_Var method_name, |
328 uint32_t argc, | 323 uint32_t argc, |
329 PP_Var* argv, | 324 PP_Var* argv, |
330 PP_Var* exception) { | 325 PP_Var* exception) { |
331 ObjectAccessorTryCatch accessor(var, exception); | 326 ObjectAccessorTryCatch accessor(var, exception); |
332 if (accessor.has_exception()) | 327 if (accessor.has_exception()) |
333 return PP_MakeUndefined(); | 328 return PP_MakeUndefined(); |
334 PepperPluginInstanceImpl* plugin = accessor.GetPluginInstance(); | 329 PepperPluginInstanceImpl* plugin = accessor.GetPluginInstance(); |
335 if (plugin && plugin->IsProcessingUserGesture()) { | 330 if (plugin && plugin->IsProcessingUserGesture()) { |
336 blink::WebScopedUserGesture user_gesture( | 331 blink::WebScopedUserGesture user_gesture(plugin->CurrentUserGestureToken()); |
337 plugin->CurrentUserGestureToken()); | 332 return InternalCallDeprecated( |
338 return InternalCallDeprecated(&accessor, method_name, argc, argv, | 333 &accessor, method_name, argc, argv, exception); |
339 exception); | |
340 } | 334 } |
341 return InternalCallDeprecated(&accessor, method_name, argc, argv, exception); | 335 return InternalCallDeprecated(&accessor, method_name, argc, argv, exception); |
342 } | 336 } |
343 | 337 |
344 PP_Var Construct(PP_Var var, | 338 PP_Var Construct(PP_Var var, uint32_t argc, PP_Var* argv, PP_Var* exception) { |
345 uint32_t argc, | |
346 PP_Var* argv, | |
347 PP_Var* exception) { | |
348 ObjectAccessorTryCatch accessor(var, exception); | 339 ObjectAccessorTryCatch accessor(var, exception); |
349 if (accessor.has_exception()) | 340 if (accessor.has_exception()) |
350 return PP_MakeUndefined(); | 341 return PP_MakeUndefined(); |
351 | 342 |
352 scoped_ptr<NPVariant[]> args; | 343 scoped_ptr<NPVariant[]> args; |
353 if (argc) { | 344 if (argc) { |
354 args.reset(new NPVariant[argc]); | 345 args.reset(new NPVariant[argc]); |
355 for (uint32_t i = 0; i < argc; ++i) { | 346 for (uint32_t i = 0; i < argc; ++i) { |
356 if (!PPVarToNPVariantNoCopy(argv[i], &args[i])) { | 347 if (!PPVarToNPVariantNoCopy(argv[i], &args[i])) { |
357 // This argument was invalid, throw an exception & give up. | 348 // This argument was invalid, throw an exception & give up. |
358 accessor.SetException(kInvalidValueException); | 349 accessor.SetException(kInvalidValueException); |
359 return PP_MakeUndefined(); | 350 return PP_MakeUndefined(); |
360 } | 351 } |
361 } | 352 } |
362 } | 353 } |
363 | 354 |
364 NPVariant result; | 355 NPVariant result; |
365 if (!WebBindings::construct(NULL, accessor.object()->np_object(), | 356 if (!WebBindings::construct( |
366 args.get(), argc, &result)) { | 357 NULL, accessor.object()->np_object(), args.get(), argc, &result)) { |
367 // An exception may have been raised. | 358 // An exception may have been raised. |
368 accessor.SetException(kUnableToConstructException); | 359 accessor.SetException(kUnableToConstructException); |
369 return PP_MakeUndefined(); | 360 return PP_MakeUndefined(); |
370 } | 361 } |
371 | 362 |
372 PP_Var ret = NPVariantToPPVar(accessor.GetPluginInstance(), &result); | 363 PP_Var ret = NPVariantToPPVar(accessor.GetPluginInstance(), &result); |
373 WebBindings::releaseVariantValue(&result); | 364 WebBindings::releaseVariantValue(&result); |
374 return ret; | 365 return ret; |
375 } | 366 } |
376 | 367 |
377 bool IsInstanceOfDeprecated(PP_Var var, | 368 bool IsInstanceOfDeprecated(PP_Var var, |
378 const PPP_Class_Deprecated* ppp_class, | 369 const PPP_Class_Deprecated* ppp_class, |
379 void** ppp_class_data) { | 370 void** ppp_class_data) { |
380 scoped_refptr<NPObjectVar> object(NPObjectVar::FromPPVar(var)); | 371 scoped_refptr<NPObjectVar> object(NPObjectVar::FromPPVar(var)); |
381 if (!object.get()) | 372 if (!object.get()) |
382 return false; // Not an object at all. | 373 return false; // Not an object at all. |
383 | 374 |
384 return PluginObject::IsInstanceOf(object->np_object(), | 375 return PluginObject::IsInstanceOf( |
385 ppp_class, ppp_class_data); | 376 object->np_object(), ppp_class, ppp_class_data); |
386 } | 377 } |
387 | 378 |
388 PP_Var CreateObjectDeprecated(PP_Instance pp_instance, | 379 PP_Var CreateObjectDeprecated(PP_Instance pp_instance, |
389 const PPP_Class_Deprecated* ppp_class, | 380 const PPP_Class_Deprecated* ppp_class, |
390 void* ppp_class_data) { | 381 void* ppp_class_data) { |
391 PepperPluginInstanceImpl* instance = | 382 PepperPluginInstanceImpl* instance = |
392 HostGlobals::Get()->GetInstance(pp_instance); | 383 HostGlobals::Get()->GetInstance(pp_instance); |
393 if (!instance) { | 384 if (!instance) { |
394 DLOG(ERROR) << "Create object passed an invalid instance."; | 385 DLOG(ERROR) << "Create object passed an invalid instance."; |
395 return PP_MakeNull(); | 386 return PP_MakeNull(); |
396 } | 387 } |
397 return PluginObject::Create(instance, ppp_class, ppp_class_data); | 388 return PluginObject::Create(instance, ppp_class, ppp_class_data); |
398 } | 389 } |
399 | 390 |
400 PP_Var CreateObjectWithModuleDeprecated(PP_Module pp_module, | 391 PP_Var CreateObjectWithModuleDeprecated(PP_Module pp_module, |
401 const PPP_Class_Deprecated* ppp_class, | 392 const PPP_Class_Deprecated* ppp_class, |
402 void* ppp_class_data) { | 393 void* ppp_class_data) { |
403 PluginModule* module = HostGlobals::Get()->GetModule(pp_module); | 394 PluginModule* module = HostGlobals::Get()->GetModule(pp_module); |
404 if (!module) | 395 if (!module) |
405 return PP_MakeNull(); | 396 return PP_MakeNull(); |
406 return PluginObject::Create(module->GetSomeInstance(), | 397 return PluginObject::Create( |
407 ppp_class, ppp_class_data); | 398 module->GetSomeInstance(), ppp_class, ppp_class_data); |
408 } | 399 } |
409 | 400 |
410 } // namespace | 401 } // namespace |
411 | 402 |
412 // static | 403 // static |
413 const PPB_Var_Deprecated* PPB_Var_Deprecated_Impl::GetVarDeprecatedInterface() { | 404 const PPB_Var_Deprecated* PPB_Var_Deprecated_Impl::GetVarDeprecatedInterface() { |
414 static const PPB_Var_Deprecated var_deprecated_interface = { | 405 static const PPB_Var_Deprecated var_deprecated_interface = { |
415 ppapi::PPB_Var_Shared::GetVarInterface1_0()->AddRef, | 406 ppapi::PPB_Var_Shared::GetVarInterface1_0()->AddRef, |
416 ppapi::PPB_Var_Shared::GetVarInterface1_0()->Release, | 407 ppapi::PPB_Var_Shared::GetVarInterface1_0()->Release, |
417 ppapi::PPB_Var_Shared::GetVarInterface1_0()->VarFromUtf8, | 408 ppapi::PPB_Var_Shared::GetVarInterface1_0()->VarFromUtf8, |
418 ppapi::PPB_Var_Shared::GetVarInterface1_0()->VarToUtf8, | 409 ppapi::PPB_Var_Shared::GetVarInterface1_0()->VarToUtf8, |
419 &HasPropertyDeprecated, | 410 &HasPropertyDeprecated, |
420 &HasMethodDeprecated, | 411 &HasMethodDeprecated, |
421 &GetProperty, | 412 &GetProperty, |
422 &EnumerateProperties, | 413 &EnumerateProperties, |
423 &SetPropertyDeprecated, | 414 &SetPropertyDeprecated, |
424 &DeletePropertyDeprecated, | 415 &DeletePropertyDeprecated, |
425 &CallDeprecated, | 416 &CallDeprecated, |
426 &Construct, | 417 &Construct, |
427 &IsInstanceOfDeprecated, | 418 &IsInstanceOfDeprecated, |
428 &CreateObjectDeprecated, | 419 &CreateObjectDeprecated, |
429 &CreateObjectWithModuleDeprecated, | 420 &CreateObjectWithModuleDeprecated, }; |
bbudge
2014/04/07 17:02:17
I guess initializers don't end with the closing br
| |
430 }; | |
431 | 421 |
432 return &var_deprecated_interface; | 422 return &var_deprecated_interface; |
433 } | 423 } |
434 | 424 |
435 } // namespace content | 425 } // namespace content |
436 | |
OLD | NEW |