| Index: webkit/plugins/ppapi/plugin_object.cc
|
| ===================================================================
|
| --- webkit/plugins/ppapi/plugin_object.cc (revision 213561)
|
| +++ webkit/plugins/ppapi/plugin_object.cc (working copy)
|
| @@ -1,360 +0,0 @@
|
| -// Copyright (c) 2011 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/plugin_object.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "ppapi/c/dev/ppb_var_deprecated.h"
|
| -#include "ppapi/c/dev/ppp_class_deprecated.h"
|
| -#include "ppapi/c/pp_resource.h"
|
| -#include "ppapi/c/pp_var.h"
|
| -#include "ppapi/shared_impl/ppapi_globals.h"
|
| -#include "ppapi/shared_impl/resource_tracker.h"
|
| -#include "ppapi/shared_impl/var.h"
|
| -#include "ppapi/shared_impl/var_tracker.h"
|
| -#include "third_party/WebKit/public/web/WebBindings.h"
|
| -#include "third_party/npapi/bindings/npapi.h"
|
| -#include "third_party/npapi/bindings/npruntime.h"
|
| -#include "webkit/plugins/ppapi/npapi_glue.h"
|
| -#include "webkit/plugins/ppapi/plugin_module.h"
|
| -#include "webkit/plugins/ppapi/ppapi_plugin_instance_impl.h"
|
| -
|
| -using ppapi::PpapiGlobals;
|
| -using ppapi::StringVar;
|
| -using ppapi::Var;
|
| -using WebKit::WebBindings;
|
| -
|
| -namespace webkit {
|
| -namespace ppapi {
|
| -
|
| -namespace {
|
| -
|
| -const char kInvalidValueException[] = "Error: Invalid value";
|
| -
|
| -// NPObject implementation in terms of PPP_Class_Deprecated --------------------
|
| -
|
| -NPObject* WrapperClass_Allocate(NPP npp, NPClass* unused) {
|
| - return PluginObject::AllocateObjectWrapper();
|
| -}
|
| -
|
| -void WrapperClass_Deallocate(NPObject* np_object) {
|
| - PluginObject* plugin_object = PluginObject::FromNPObject(np_object);
|
| - if (!plugin_object)
|
| - return;
|
| - plugin_object->ppp_class()->Deallocate(plugin_object->ppp_class_data());
|
| - delete plugin_object;
|
| -}
|
| -
|
| -void WrapperClass_Invalidate(NPObject* object) {
|
| -}
|
| -
|
| -bool WrapperClass_HasMethod(NPObject* object, NPIdentifier method_name) {
|
| - NPObjectAccessorWithIdentifier accessor(object, method_name, false);
|
| - if (!accessor.is_valid())
|
| - return false;
|
| -
|
| - PPResultAndExceptionToNPResult result_converter(
|
| - accessor.object()->GetNPObject(), NULL);
|
| - bool rv = accessor.object()->ppp_class()->HasMethod(
|
| - accessor.object()->ppp_class_data(), accessor.identifier(),
|
| - result_converter.exception());
|
| - result_converter.CheckExceptionForNoResult();
|
| - return rv;
|
| -}
|
| -
|
| -bool WrapperClass_Invoke(NPObject* object, NPIdentifier method_name,
|
| - const NPVariant* argv, uint32_t argc,
|
| - NPVariant* result) {
|
| - NPObjectAccessorWithIdentifier accessor(object, method_name, false);
|
| - if (!accessor.is_valid())
|
| - return false;
|
| -
|
| - PPResultAndExceptionToNPResult result_converter(
|
| - accessor.object()->GetNPObject(), result);
|
| - PPVarArrayFromNPVariantArray args(accessor.object()->instance(),
|
| - argc, argv);
|
| -
|
| - // For the OOP plugin case we need to grab a reference on the plugin module
|
| - // object to ensure that it is not destroyed courtsey an incoming
|
| - // ExecuteScript call which destroys the plugin module and in turn the
|
| - // dispatcher.
|
| - scoped_refptr<webkit::ppapi::PluginModule> ref(
|
| - accessor.object()->instance()->module());
|
| -
|
| - return result_converter.SetResult(accessor.object()->ppp_class()->Call(
|
| - accessor.object()->ppp_class_data(), accessor.identifier(),
|
| - argc, args.array(), result_converter.exception()));
|
| -}
|
| -
|
| -bool WrapperClass_InvokeDefault(NPObject* np_object, const NPVariant* argv,
|
| - uint32_t argc, NPVariant* result) {
|
| - PluginObject* obj = PluginObject::FromNPObject(np_object);
|
| - if (!obj)
|
| - return false;
|
| -
|
| - PPVarArrayFromNPVariantArray args(obj->instance(), argc, argv);
|
| - PPResultAndExceptionToNPResult result_converter(obj->GetNPObject(), result);
|
| -
|
| - // For the OOP plugin case we need to grab a reference on the plugin module
|
| - // object to ensure that it is not destroyed courtsey an incoming
|
| - // ExecuteScript call which destroys the plugin module and in turn the
|
| - // dispatcher.
|
| - scoped_refptr<webkit::ppapi::PluginModule> ref(
|
| - obj->instance()->module());
|
| -
|
| - result_converter.SetResult(obj->ppp_class()->Call(
|
| - obj->ppp_class_data(), PP_MakeUndefined(), argc, args.array(),
|
| - result_converter.exception()));
|
| - return result_converter.success();
|
| -}
|
| -
|
| -bool WrapperClass_HasProperty(NPObject* object, NPIdentifier property_name) {
|
| - NPObjectAccessorWithIdentifier accessor(object, property_name, true);
|
| - if (!accessor.is_valid())
|
| - return false;
|
| -
|
| - PPResultAndExceptionToNPResult result_converter(
|
| - accessor.object()->GetNPObject(), NULL);
|
| - bool rv = accessor.object()->ppp_class()->HasProperty(
|
| - accessor.object()->ppp_class_data(), accessor.identifier(),
|
| - result_converter.exception());
|
| - result_converter.CheckExceptionForNoResult();
|
| - return rv;
|
| -}
|
| -
|
| -bool WrapperClass_GetProperty(NPObject* object, NPIdentifier property_name,
|
| - NPVariant* result) {
|
| - NPObjectAccessorWithIdentifier accessor(object, property_name, true);
|
| - if (!accessor.is_valid())
|
| - return false;
|
| -
|
| - PPResultAndExceptionToNPResult result_converter(
|
| - accessor.object()->GetNPObject(), result);
|
| - return result_converter.SetResult(accessor.object()->ppp_class()->GetProperty(
|
| - accessor.object()->ppp_class_data(), accessor.identifier(),
|
| - result_converter.exception()));
|
| -}
|
| -
|
| -bool WrapperClass_SetProperty(NPObject* object, NPIdentifier property_name,
|
| - const NPVariant* value) {
|
| - NPObjectAccessorWithIdentifier accessor(object, property_name, true);
|
| - if (!accessor.is_valid())
|
| - return false;
|
| -
|
| - PPResultAndExceptionToNPResult result_converter(
|
| - accessor.object()->GetNPObject(), NULL);
|
| - PP_Var value_var = NPVariantToPPVar(accessor.object()->instance(), value);
|
| - accessor.object()->ppp_class()->SetProperty(
|
| - accessor.object()->ppp_class_data(), accessor.identifier(), value_var,
|
| - result_converter.exception());
|
| - PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(value_var);
|
| - return result_converter.CheckExceptionForNoResult();
|
| -}
|
| -
|
| -bool WrapperClass_RemoveProperty(NPObject* object, NPIdentifier property_name) {
|
| - NPObjectAccessorWithIdentifier accessor(object, property_name, true);
|
| - if (!accessor.is_valid())
|
| - return false;
|
| -
|
| - PPResultAndExceptionToNPResult result_converter(
|
| - accessor.object()->GetNPObject(), NULL);
|
| - accessor.object()->ppp_class()->RemoveProperty(
|
| - accessor.object()->ppp_class_data(), accessor.identifier(),
|
| - result_converter.exception());
|
| - return result_converter.CheckExceptionForNoResult();
|
| -}
|
| -
|
| -bool WrapperClass_Enumerate(NPObject* object, NPIdentifier** values,
|
| - uint32_t* count) {
|
| - *values = NULL;
|
| - *count = 0;
|
| - PluginObject* obj = PluginObject::FromNPObject(object);
|
| - if (!obj)
|
| - return false;
|
| -
|
| - uint32_t property_count = 0;
|
| - PP_Var* properties = NULL; // Must be freed!
|
| - PPResultAndExceptionToNPResult result_converter(obj->GetNPObject(), NULL);
|
| - obj->ppp_class()->GetAllPropertyNames(obj->ppp_class_data(),
|
| - &property_count, &properties,
|
| - result_converter.exception());
|
| -
|
| - // Convert the array of PP_Var to an array of NPIdentifiers. If any
|
| - // conversions fail, we will set the exception.
|
| - if (!result_converter.has_exception()) {
|
| - if (property_count > 0) {
|
| - *values = static_cast<NPIdentifier*>(
|
| - malloc(sizeof(NPIdentifier) * property_count));
|
| - *count = 0; // Will be the number of items successfully converted.
|
| - for (uint32_t i = 0; i < property_count; ++i) {
|
| - if (!((*values)[i] = PPVarToNPIdentifier(properties[i]))) {
|
| - // Throw an exception for the failed convertion.
|
| - *result_converter.exception() =
|
| - StringVar::StringToPPVar(kInvalidValueException);
|
| - break;
|
| - }
|
| - (*count)++;
|
| - }
|
| -
|
| - if (result_converter.has_exception()) {
|
| - // We don't actually have to free the identifiers we converted since
|
| - // all identifiers leak anyway :( .
|
| - free(*values);
|
| - *values = NULL;
|
| - *count = 0;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // This will actually throw the exception, either from GetAllPropertyNames,
|
| - // or if anything was set during the conversion process.
|
| - result_converter.CheckExceptionForNoResult();
|
| -
|
| - // Release the PP_Var that the plugin allocated. On success, they will all
|
| - // be converted to NPVariants, and on failure, we want them to just go away.
|
| - ::ppapi::VarTracker* var_tracker = PpapiGlobals::Get()->GetVarTracker();
|
| - for (uint32_t i = 0; i < property_count; ++i)
|
| - var_tracker->ReleaseVar(properties[i]);
|
| - free(properties);
|
| - return result_converter.success();
|
| -}
|
| -
|
| -bool WrapperClass_Construct(NPObject* object, const NPVariant* argv,
|
| - uint32_t argc, NPVariant* result) {
|
| - PluginObject* obj = PluginObject::FromNPObject(object);
|
| - if (!obj)
|
| - return false;
|
| -
|
| - PPVarArrayFromNPVariantArray args(obj->instance(), argc, argv);
|
| - PPResultAndExceptionToNPResult result_converter(obj->GetNPObject(), result);
|
| - return result_converter.SetResult(obj->ppp_class()->Construct(
|
| - obj->ppp_class_data(), argc, args.array(),
|
| - result_converter.exception()));
|
| -}
|
| -
|
| -const NPClass wrapper_class = {
|
| - NP_CLASS_STRUCT_VERSION,
|
| - WrapperClass_Allocate,
|
| - WrapperClass_Deallocate,
|
| - WrapperClass_Invalidate,
|
| - WrapperClass_HasMethod,
|
| - WrapperClass_Invoke,
|
| - WrapperClass_InvokeDefault,
|
| - WrapperClass_HasProperty,
|
| - WrapperClass_GetProperty,
|
| - WrapperClass_SetProperty,
|
| - WrapperClass_RemoveProperty,
|
| - WrapperClass_Enumerate,
|
| - WrapperClass_Construct
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -// PluginObject ----------------------------------------------------------------
|
| -
|
| -struct PluginObject::NPObjectWrapper : public NPObject {
|
| - // Points to the var object that owns this wrapper. This value may be NULL
|
| - // if there is no var owning this wrapper. This can happen if the plugin
|
| - // releases all references to the var, but a reference to the underlying
|
| - // NPObject is still held by script on the page.
|
| - PluginObject* obj;
|
| -};
|
| -
|
| -PluginObject::PluginObject(PluginInstanceImpl* instance,
|
| - NPObjectWrapper* object_wrapper,
|
| - const PPP_Class_Deprecated* ppp_class,
|
| - void* ppp_class_data)
|
| - : instance_(instance),
|
| - object_wrapper_(object_wrapper),
|
| - ppp_class_(ppp_class),
|
| - ppp_class_data_(ppp_class_data) {
|
| - // Make the object wrapper refer back to this class so our NPObject
|
| - // implementation can call back into the Pepper layer.
|
| - object_wrapper_->obj = this;
|
| - instance_->AddPluginObject(this);
|
| -}
|
| -
|
| -PluginObject::~PluginObject() {
|
| - // The wrapper we made for this NPObject may still have a reference to it
|
| - // from JavaScript, so we clear out its ObjectVar back pointer which will
|
| - // cause all calls "up" to the plugin to become NOPs. Our ObjectVar base
|
| - // class will release our reference to the object, which may or may not
|
| - // delete the NPObject.
|
| - DCHECK(object_wrapper_->obj == this);
|
| - object_wrapper_->obj = NULL;
|
| - instance_->RemovePluginObject(this);
|
| -}
|
| -
|
| -PP_Var PluginObject::Create(PluginInstanceImpl* instance,
|
| - const PPP_Class_Deprecated* ppp_class,
|
| - void* ppp_class_data) {
|
| - // This will internally end up calling our AllocateObjectWrapper via the
|
| - // WrapperClass_Allocated function which will have created an object wrapper
|
| - // appropriate for this class (derived from NPObject).
|
| - NPObjectWrapper* wrapper = static_cast<NPObjectWrapper*>(
|
| - WebBindings::createObject(instance->instanceNPP(),
|
| - const_cast<NPClass*>(&wrapper_class)));
|
| -
|
| - // This object will register itself both with the NPObject and with the
|
| - // PluginModule. The NPObject will normally handle its lifetime, and it
|
| - // will get deleted in the destroy method. It may also get deleted when the
|
| - // plugin module is deallocated.
|
| - new PluginObject(instance, wrapper, ppp_class, ppp_class_data);
|
| -
|
| - // We can just use a normal ObjectVar to refer to this object from the
|
| - // plugin. It will hold a ref to the underlying NPObject which will in turn
|
| - // hold our pluginObject.
|
| - PP_Var obj_var(NPObjectToPPVar(instance, wrapper));
|
| -
|
| - // Note that the ObjectVar constructor incremented the reference count, and so
|
| - // did WebBindings::createObject above. Now that the PP_Var has taken
|
| - // ownership, we need to release to balance out the createObject reference
|
| - // count bump.
|
| - WebBindings::releaseObject(wrapper);
|
| - return obj_var;
|
| -}
|
| -
|
| -NPObject* PluginObject::GetNPObject() const {
|
| - return object_wrapper_;
|
| -}
|
| -
|
| -// static
|
| -bool PluginObject::IsInstanceOf(NPObject* np_object,
|
| - const PPP_Class_Deprecated* ppp_class,
|
| - void** ppp_class_data) {
|
| - // Validate that this object is implemented by our wrapper class before
|
| - // trying to get the PluginObject.
|
| - if (np_object->_class != &wrapper_class)
|
| - return false;
|
| -
|
| - PluginObject* plugin_object = FromNPObject(np_object);
|
| - if (!plugin_object)
|
| - return false; // Object is no longer alive.
|
| -
|
| - if (plugin_object->ppp_class() != ppp_class)
|
| - return false;
|
| - if (ppp_class_data)
|
| - *ppp_class_data = plugin_object->ppp_class_data();
|
| - return true;
|
| -}
|
| -
|
| -// static
|
| -PluginObject* PluginObject::FromNPObject(NPObject* object) {
|
| - return static_cast<NPObjectWrapper*>(object)->obj;
|
| -}
|
| -
|
| -// static
|
| -NPObject* PluginObject::AllocateObjectWrapper() {
|
| - NPObjectWrapper* wrapper = new NPObjectWrapper;
|
| - memset(wrapper, 0, sizeof(NPObjectWrapper));
|
| - return wrapper;
|
| -}
|
| -
|
| -} // namespace ppapi
|
| -} // namespace webkit
|
| -
|
|
|