Index: webkit/plugins/ppapi/ppb_var_deprecated_impl.cc |
=================================================================== |
--- webkit/plugins/ppapi/ppb_var_deprecated_impl.cc (revision 213561) |
+++ webkit/plugins/ppapi/ppb_var_deprecated_impl.cc (working copy) |
@@ -1,437 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "webkit/plugins/ppapi/ppb_var_deprecated_impl.h" |
- |
-#include <limits> |
- |
-#include "ppapi/c/dev/ppb_var_deprecated.h" |
-#include "ppapi/c/ppb_var.h" |
-#include "ppapi/c/pp_var.h" |
-#include "ppapi/shared_impl/ppb_var_shared.h" |
-#include "third_party/WebKit/public/web/WebBindings.h" |
-#include "third_party/WebKit/public/web/WebScopedUserGesture.h" |
-#include "webkit/plugins/ppapi/common.h" |
-#include "webkit/plugins/ppapi/host_globals.h" |
-#include "webkit/plugins/ppapi/npapi_glue.h" |
-#include "webkit/plugins/ppapi/npobject_var.h" |
-#include "webkit/plugins/ppapi/plugin_module.h" |
-#include "webkit/plugins/ppapi/plugin_object.h" |
-#include "webkit/plugins/ppapi/ppapi_plugin_instance_impl.h" |
- |
-using ppapi::NPObjectVar; |
-using ppapi::PpapiGlobals; |
-using ppapi::StringVar; |
-using ppapi::Var; |
-using WebKit::WebBindings; |
- |
-namespace webkit { |
-namespace ppapi { |
- |
-namespace { |
- |
-const char kInvalidObjectException[] = "Error: Invalid object"; |
-const char kInvalidPropertyException[] = "Error: Invalid property"; |
-const char kInvalidValueException[] = "Error: Invalid value"; |
-const char kUnableToGetPropertyException[] = "Error: Unable to get property"; |
-const char kUnableToSetPropertyException[] = "Error: Unable to set property"; |
-const char kUnableToRemovePropertyException[] = |
- "Error: Unable to remove property"; |
-const char kUnableToGetAllPropertiesException[] = |
- "Error: Unable to get all properties"; |
-const char kUnableToCallMethodException[] = "Error: Unable to call method"; |
-const char kUnableToConstructException[] = "Error: Unable to construct"; |
- |
-// --------------------------------------------------------------------------- |
-// Utilities |
- |
-// Converts the given PP_Var to an NPVariant, returning true on success. |
-// False means that the given variant is invalid. In this case, the result |
-// NPVariant will be set to a void one. |
-// |
-// The contents of the PP_Var will NOT be copied, so you need to ensure that |
-// the PP_Var remains valid while the resultant NPVariant is in use. |
-bool PPVarToNPVariantNoCopy(PP_Var var, NPVariant* result) { |
- switch (var.type) { |
- case PP_VARTYPE_UNDEFINED: |
- VOID_TO_NPVARIANT(*result); |
- break; |
- case PP_VARTYPE_NULL: |
- NULL_TO_NPVARIANT(*result); |
- break; |
- case PP_VARTYPE_BOOL: |
- BOOLEAN_TO_NPVARIANT(var.value.as_bool, *result); |
- break; |
- case PP_VARTYPE_INT32: |
- INT32_TO_NPVARIANT(var.value.as_int, *result); |
- break; |
- case PP_VARTYPE_DOUBLE: |
- DOUBLE_TO_NPVARIANT(var.value.as_double, *result); |
- break; |
- case PP_VARTYPE_STRING: { |
- StringVar* string = StringVar::FromPPVar(var); |
- if (!string) { |
- VOID_TO_NPVARIANT(*result); |
- return false; |
- } |
- const std::string& value = string->value(); |
- STRINGN_TO_NPVARIANT(value.c_str(), value.size(), *result); |
- break; |
- } |
- case PP_VARTYPE_OBJECT: { |
- scoped_refptr<NPObjectVar> object(NPObjectVar::FromPPVar(var)); |
- if (!object.get()) { |
- VOID_TO_NPVARIANT(*result); |
- return false; |
- } |
- OBJECT_TO_NPVARIANT(object->np_object(), *result); |
- break; |
- } |
- default: |
- VOID_TO_NPVARIANT(*result); |
- return false; |
- } |
- return true; |
-} |
- |
-// ObjectAccessorTryCatch ------------------------------------------------------ |
- |
-// Automatically sets up a TryCatch for accessing the object identified by the |
-// given PP_Var. The module from the object will be used for the exception |
-// strings generated by the TryCatch. |
-// |
-// This will automatically retrieve the ObjectVar from the object and throw |
-// an exception if it's invalid. At the end of construction, if there is no |
-// exception, you know that there is no previously set exception, that the |
-// object passed in is valid and ready to use (via the object() getter), and |
-// that the TryCatch's pp_module() getter is also set up properly and ready to |
-// use. |
-class ObjectAccessorTryCatch : public TryCatch { |
- public: |
- ObjectAccessorTryCatch(PP_Var object, PP_Var* exception) |
- : TryCatch(exception), |
- object_(NPObjectVar::FromPPVar(object)) { |
- if (!object_.get()) { |
- SetException(kInvalidObjectException); |
- } |
- } |
- |
- NPObjectVar* object() { return object_.get(); } |
- |
- PluginInstanceImpl* GetPluginInstance() { |
- return HostGlobals::Get()->GetInstance(object()->pp_instance()); |
- } |
- |
- protected: |
- scoped_refptr<NPObjectVar> object_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ObjectAccessorTryCatch); |
-}; |
- |
-// ObjectAccessiorWithIdentifierTryCatch --------------------------------------- |
- |
-// Automatically sets up a TryCatch for accessing the identifier on the given |
-// object. This just extends ObjectAccessorTryCatch to additionally convert |
-// the given identifier to an NPIdentifier and validate it, throwing an |
-// exception if it's invalid. |
-// |
-// At the end of construction, if there is no exception, you know that there is |
-// no previously set exception, that the object passed in is valid and ready to |
-// use (via the object() getter), that the identifier is valid and ready to |
-// use (via the identifier() getter), and that the TryCatch's pp_module() getter |
-// is also set up properly and ready to use. |
-class ObjectAccessorWithIdentifierTryCatch : public ObjectAccessorTryCatch { |
- public: |
- ObjectAccessorWithIdentifierTryCatch(PP_Var object, |
- PP_Var identifier, |
- PP_Var* exception) |
- : ObjectAccessorTryCatch(object, exception), |
- identifier_(0) { |
- if (!has_exception()) { |
- identifier_ = PPVarToNPIdentifier(identifier); |
- if (!identifier_) |
- SetException(kInvalidPropertyException); |
- } |
- } |
- |
- NPIdentifier identifier() const { return identifier_; } |
- |
- private: |
- NPIdentifier identifier_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ObjectAccessorWithIdentifierTryCatch); |
-}; |
- |
-PP_Bool HasProperty(PP_Var var, |
- PP_Var name, |
- PP_Var* exception) { |
- ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); |
- if (accessor.has_exception()) |
- return PP_FALSE; |
- return BoolToPPBool(WebBindings::hasProperty(NULL, |
- accessor.object()->np_object(), |
- accessor.identifier())); |
-} |
- |
-bool HasPropertyDeprecated(PP_Var var, |
- PP_Var name, |
- PP_Var* exception) { |
- return PPBoolToBool(HasProperty(var, name, exception)); |
-} |
- |
-bool HasMethodDeprecated(PP_Var var, |
- PP_Var name, |
- PP_Var* exception) { |
- ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); |
- if (accessor.has_exception()) |
- return false; |
- return WebBindings::hasMethod(NULL, accessor.object()->np_object(), |
- accessor.identifier()); |
-} |
- |
-PP_Var GetProperty(PP_Var var, |
- PP_Var name, |
- PP_Var* exception) { |
- ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); |
- if (accessor.has_exception()) |
- return PP_MakeUndefined(); |
- |
- NPVariant result; |
- if (!WebBindings::getProperty(NULL, accessor.object()->np_object(), |
- accessor.identifier(), &result)) { |
- // An exception may have been raised. |
- accessor.SetException(kUnableToGetPropertyException); |
- return PP_MakeUndefined(); |
- } |
- |
- PP_Var ret = NPVariantToPPVar(accessor.GetPluginInstance(), &result); |
- WebBindings::releaseVariantValue(&result); |
- return ret; |
-} |
- |
-void EnumerateProperties(PP_Var var, |
- uint32_t* property_count, |
- PP_Var** properties, |
- PP_Var* exception) { |
- *properties = NULL; |
- *property_count = 0; |
- |
- ObjectAccessorTryCatch accessor(var, exception); |
- if (accessor.has_exception()) |
- return; |
- |
- NPIdentifier* identifiers = NULL; |
- uint32_t count = 0; |
- if (!WebBindings::enumerate(NULL, accessor.object()->np_object(), |
- &identifiers, &count)) { |
- accessor.SetException(kUnableToGetAllPropertiesException); |
- return; |
- } |
- |
- if (count == 0) |
- return; |
- |
- *property_count = count; |
- *properties = static_cast<PP_Var*>(malloc(sizeof(PP_Var) * count)); |
- for (uint32_t i = 0; i < count; ++i) { |
- (*properties)[i] = NPIdentifierToPPVar(identifiers[i]); |
- } |
- free(identifiers); |
-} |
- |
-void SetPropertyDeprecated(PP_Var var, |
- PP_Var name, |
- PP_Var value, |
- PP_Var* exception) { |
- ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); |
- if (accessor.has_exception()) |
- return; |
- |
- NPVariant variant; |
- if (!PPVarToNPVariantNoCopy(value, &variant)) { |
- accessor.SetException(kInvalidValueException); |
- return; |
- } |
- if (!WebBindings::setProperty(NULL, accessor.object()->np_object(), |
- accessor.identifier(), &variant)) |
- accessor.SetException(kUnableToSetPropertyException); |
-} |
- |
-void DeletePropertyDeprecated(PP_Var var, |
- PP_Var name, |
- PP_Var* exception) { |
- ObjectAccessorWithIdentifierTryCatch accessor(var, name, exception); |
- if (accessor.has_exception()) |
- return; |
- |
- if (!WebBindings::removeProperty(NULL, accessor.object()->np_object(), |
- accessor.identifier())) |
- accessor.SetException(kUnableToRemovePropertyException); |
-} |
- |
-PP_Var InternalCallDeprecated(ObjectAccessorTryCatch* accessor, |
- PP_Var method_name, |
- uint32_t argc, |
- PP_Var* argv, |
- PP_Var* exception) { |
- NPIdentifier identifier; |
- if (method_name.type == PP_VARTYPE_UNDEFINED) { |
- identifier = NULL; |
- } else if (method_name.type == PP_VARTYPE_STRING) { |
- // Specifically allow only string functions to be called. |
- identifier = PPVarToNPIdentifier(method_name); |
- if (!identifier) { |
- accessor->SetException(kInvalidPropertyException); |
- return PP_MakeUndefined(); |
- } |
- } else { |
- accessor->SetException(kInvalidPropertyException); |
- return PP_MakeUndefined(); |
- } |
- |
- scoped_ptr<NPVariant[]> args; |
- if (argc) { |
- args.reset(new NPVariant[argc]); |
- for (uint32_t i = 0; i < argc; ++i) { |
- if (!PPVarToNPVariantNoCopy(argv[i], &args[i])) { |
- // This argument was invalid, throw an exception & give up. |
- accessor->SetException(kInvalidValueException); |
- return PP_MakeUndefined(); |
- } |
- } |
- } |
- |
- bool ok; |
- |
- NPVariant result; |
- if (identifier) { |
- ok = WebBindings::invoke(NULL, accessor->object()->np_object(), |
- identifier, args.get(), argc, &result); |
- } else { |
- ok = WebBindings::invokeDefault(NULL, accessor->object()->np_object(), |
- args.get(), argc, &result); |
- } |
- |
- if (!ok) { |
- // An exception may have been raised. |
- accessor->SetException(kUnableToCallMethodException); |
- return PP_MakeUndefined(); |
- } |
- |
- PP_Var ret = NPVariantToPPVar(accessor->GetPluginInstance(), &result); |
- WebBindings::releaseVariantValue(&result); |
- return ret; |
-} |
- |
-PP_Var CallDeprecated(PP_Var var, |
- PP_Var method_name, |
- uint32_t argc, |
- PP_Var* argv, |
- PP_Var* exception) { |
- ObjectAccessorTryCatch accessor(var, exception); |
- if (accessor.has_exception()) |
- return PP_MakeUndefined(); |
- PluginInstanceImpl* plugin = accessor.GetPluginInstance(); |
- if (plugin && plugin->IsProcessingUserGesture()) { |
- WebKit::WebScopedUserGesture user_gesture( |
- plugin->CurrentUserGestureToken()); |
- return InternalCallDeprecated(&accessor, method_name, argc, argv, |
- exception); |
- } |
- return InternalCallDeprecated(&accessor, method_name, argc, argv, exception); |
-} |
- |
-PP_Var Construct(PP_Var var, |
- uint32_t argc, |
- PP_Var* argv, |
- PP_Var* exception) { |
- ObjectAccessorTryCatch accessor(var, exception); |
- if (accessor.has_exception()) |
- return PP_MakeUndefined(); |
- |
- scoped_ptr<NPVariant[]> args; |
- if (argc) { |
- args.reset(new NPVariant[argc]); |
- for (uint32_t i = 0; i < argc; ++i) { |
- if (!PPVarToNPVariantNoCopy(argv[i], &args[i])) { |
- // This argument was invalid, throw an exception & give up. |
- accessor.SetException(kInvalidValueException); |
- return PP_MakeUndefined(); |
- } |
- } |
- } |
- |
- NPVariant result; |
- if (!WebBindings::construct(NULL, accessor.object()->np_object(), |
- args.get(), argc, &result)) { |
- // An exception may have been raised. |
- accessor.SetException(kUnableToConstructException); |
- return PP_MakeUndefined(); |
- } |
- |
- PP_Var ret = NPVariantToPPVar(accessor.GetPluginInstance(), &result); |
- WebBindings::releaseVariantValue(&result); |
- return ret; |
-} |
- |
-bool IsInstanceOfDeprecated(PP_Var var, |
- const PPP_Class_Deprecated* ppp_class, |
- void** ppp_class_data) { |
- scoped_refptr<NPObjectVar> object(NPObjectVar::FromPPVar(var)); |
- if (!object.get()) |
- return false; // Not an object at all. |
- |
- return PluginObject::IsInstanceOf(object->np_object(), |
- ppp_class, ppp_class_data); |
-} |
- |
-PP_Var CreateObjectDeprecated(PP_Instance pp_instance, |
- const PPP_Class_Deprecated* ppp_class, |
- void* ppp_class_data) { |
- PluginInstanceImpl* instance = HostGlobals::Get()->GetInstance(pp_instance); |
- if (!instance) { |
- DLOG(ERROR) << "Create object passed an invalid instance."; |
- return PP_MakeNull(); |
- } |
- return PluginObject::Create(instance, ppp_class, ppp_class_data); |
-} |
- |
-PP_Var CreateObjectWithModuleDeprecated(PP_Module pp_module, |
- const PPP_Class_Deprecated* ppp_class, |
- void* ppp_class_data) { |
- PluginModule* module = HostGlobals::Get()->GetModule(pp_module); |
- if (!module) |
- return PP_MakeNull(); |
- return PluginObject::Create(module->GetSomeInstance(), |
- ppp_class, ppp_class_data); |
-} |
- |
-} // namespace |
- |
-// static |
-const PPB_Var_Deprecated* PPB_Var_Deprecated_Impl::GetVarDeprecatedInterface() { |
- static const PPB_Var_Deprecated var_deprecated_interface = { |
- ::ppapi::PPB_Var_Shared::GetVarInterface1_0()->AddRef, |
- ::ppapi::PPB_Var_Shared::GetVarInterface1_0()->Release, |
- ::ppapi::PPB_Var_Shared::GetVarInterface1_0()->VarFromUtf8, |
- ::ppapi::PPB_Var_Shared::GetVarInterface1_0()->VarToUtf8, |
- &HasPropertyDeprecated, |
- &HasMethodDeprecated, |
- &GetProperty, |
- &EnumerateProperties, |
- &SetPropertyDeprecated, |
- &DeletePropertyDeprecated, |
- &CallDeprecated, |
- &Construct, |
- &IsInstanceOfDeprecated, |
- &CreateObjectDeprecated, |
- &CreateObjectWithModuleDeprecated, |
- }; |
- |
- return &var_deprecated_interface; |
-} |
- |
-} // namespace ppapi |
-} // namespace webkit |
- |