| Index: content/child/npapi/npobject_proxy.cc
|
| diff --git a/content/child/npapi/npobject_proxy.cc b/content/child/npapi/npobject_proxy.cc
|
| deleted file mode 100644
|
| index 45dc68d665e1d793f59e601412e08d8cd057dbe8..0000000000000000000000000000000000000000
|
| --- a/content/child/npapi/npobject_proxy.cc
|
| +++ /dev/null
|
| @@ -1,509 +0,0 @@
|
| -// Copyright 2013 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 "content/child/npapi/npobject_proxy.h"
|
| -
|
| -#include "content/child/npapi/np_channel_base.h"
|
| -#include "content/child/npapi/npobject_util.h"
|
| -#include "content/child/plugin_messages.h"
|
| -#include "third_party/WebKit/public/web/WebBindings.h"
|
| -
|
| -#if defined(ENABLE_PLUGINS)
|
| -#include "content/child/npapi/plugin_instance.h"
|
| -#endif
|
| -
|
| -using blink::WebBindings;
|
| -
|
| -namespace content {
|
| -
|
| -struct NPObjectWrapper {
|
| - NPObject object;
|
| - NPObjectProxy* proxy;
|
| -};
|
| -
|
| -NPClass NPObjectProxy::npclass_proxy_ = {
|
| - NP_CLASS_STRUCT_VERSION,
|
| - NPObjectProxy::NPAllocate,
|
| - NPObjectProxy::NPDeallocate,
|
| - NPObjectProxy::NPPInvalidate,
|
| - NPObjectProxy::NPHasMethod,
|
| - NPObjectProxy::NPInvoke,
|
| - NPObjectProxy::NPInvokeDefault,
|
| - NPObjectProxy::NPHasProperty,
|
| - NPObjectProxy::NPGetProperty,
|
| - NPObjectProxy::NPSetProperty,
|
| - NPObjectProxy::NPRemoveProperty,
|
| - NPObjectProxy::NPNEnumerate,
|
| - NPObjectProxy::NPNConstruct
|
| -};
|
| -
|
| -NPObjectProxy* NPObjectProxy::GetProxy(NPObject* object) {
|
| - NPObjectProxy* proxy = NULL;
|
| -
|
| - // Wrapper exists only for NPObjects that we had created.
|
| - if (&npclass_proxy_ == object->_class) {
|
| - NPObjectWrapper* wrapper = reinterpret_cast<NPObjectWrapper*>(object);
|
| - proxy = wrapper->proxy;
|
| - }
|
| -
|
| - return proxy;
|
| -}
|
| -
|
| -NPObject* NPObjectProxy::GetUnderlyingNPObject() {
|
| - return NULL;
|
| -}
|
| -
|
| -IPC::Listener* NPObjectProxy::GetChannelListener() {
|
| - return static_cast<IPC::Listener*>(this);
|
| -}
|
| -
|
| -NPObjectProxy::NPObjectProxy(
|
| - NPChannelBase* channel,
|
| - int route_id,
|
| - int render_view_id,
|
| - const GURL& page_url)
|
| - : channel_(channel),
|
| - route_id_(route_id),
|
| - render_view_id_(render_view_id),
|
| - page_url_(page_url) {
|
| - channel_->AddRoute(route_id, this, this);
|
| -}
|
| -
|
| -NPObjectProxy::~NPObjectProxy() {
|
| - if (channel_.get()) {
|
| - // This NPObjectProxy instance is now invalid and should not be reused for
|
| - // requests initiated by plugins. We may receive requests for the
|
| - // same NPObject in the context of the outgoing NPObjectMsg_Release call.
|
| - // We should be creating new NPObjectProxy instances to wrap these
|
| - // NPObjects.
|
| - channel_->RemoveMappingForNPObjectProxy(route_id_);
|
| - channel_->RemoveRoute(route_id_);
|
| - Send(new NPObjectMsg_Release(route_id_));
|
| - }
|
| -}
|
| -
|
| -NPObject* NPObjectProxy::Create(NPChannelBase* channel,
|
| - int route_id,
|
| - int render_view_id,
|
| - const GURL& page_url,
|
| - NPP owner) {
|
| - NPObjectWrapper* obj = reinterpret_cast<NPObjectWrapper*>(
|
| - WebBindings::createObject(owner, &npclass_proxy_));
|
| - obj->proxy = new NPObjectProxy(channel, route_id, render_view_id, page_url);
|
| - channel->AddMappingForNPObjectProxy(route_id, &obj->object);
|
| - return reinterpret_cast<NPObject*>(obj);
|
| -}
|
| -
|
| -bool NPObjectProxy::Send(IPC::Message* msg) {
|
| - if (channel_.get())
|
| - return channel_->Send(msg);
|
| -
|
| - delete msg;
|
| - return false;
|
| -}
|
| -
|
| -NPObject* NPObjectProxy::NPAllocate(NPP, NPClass*) {
|
| - return reinterpret_cast<NPObject*>(new NPObjectWrapper);
|
| -}
|
| -
|
| -void NPObjectProxy::NPDeallocate(NPObject* npObj) {
|
| - NPObjectWrapper* obj = reinterpret_cast<NPObjectWrapper*>(npObj);
|
| - delete obj->proxy;
|
| - delete obj;
|
| -}
|
| -
|
| -bool NPObjectProxy::OnMessageReceived(const IPC::Message& msg) {
|
| - NOTREACHED();
|
| - return false;
|
| -}
|
| -
|
| -void NPObjectProxy::OnChannelError() {
|
| - // Release our ref count of the plugin channel object, as it addrefs the
|
| - // process.
|
| - channel_ = NULL;
|
| -}
|
| -
|
| -bool NPObjectProxy::NPHasMethod(NPObject *obj,
|
| - NPIdentifier name) {
|
| - if (obj == NULL)
|
| - return false;
|
| -
|
| - bool result = false;
|
| - NPObjectProxy* proxy = GetProxy(obj);
|
| -
|
| - if (!proxy) {
|
| - return obj->_class->hasMethod(obj, name);
|
| - }
|
| -
|
| - NPIdentifier_Param name_param;
|
| - CreateNPIdentifierParam(name, &name_param);
|
| -
|
| - proxy->Send(new NPObjectMsg_HasMethod(proxy->route_id(), name_param,
|
| - &result));
|
| - return result;
|
| -}
|
| -
|
| -bool NPObjectProxy::NPInvoke(NPObject *obj,
|
| - NPIdentifier name,
|
| - const NPVariant *args,
|
| - uint32_t arg_count,
|
| - NPVariant *result) {
|
| - return NPInvokePrivate(0, obj, false, name, args, arg_count, result);
|
| -}
|
| -
|
| -bool NPObjectProxy::NPInvokeDefault(NPObject *npobj,
|
| - const NPVariant *args,
|
| - uint32_t arg_count,
|
| - NPVariant *result) {
|
| - return NPInvokePrivate(0, npobj, true, 0, args, arg_count, result);
|
| -}
|
| -
|
| -bool NPObjectProxy::NPInvokePrivate(NPP npp,
|
| - NPObject *obj,
|
| - bool is_default,
|
| - NPIdentifier name,
|
| - const NPVariant *args,
|
| - uint32_t arg_count,
|
| - NPVariant *np_result) {
|
| - if (obj == NULL)
|
| - return false;
|
| -
|
| - NPObjectProxy* proxy = GetProxy(obj);
|
| - if (!proxy) {
|
| - if (is_default) {
|
| - return obj->_class->invokeDefault(obj, args, arg_count, np_result);
|
| - } else {
|
| - return obj->_class->invoke(obj, name, args, arg_count, np_result);
|
| - }
|
| - }
|
| -
|
| - bool result = false;
|
| - int render_view_id = proxy->render_view_id_;
|
| - NPIdentifier_Param name_param;
|
| - if (is_default) {
|
| - // The data won't actually get used, but set it so we don't send random
|
| - // data.
|
| - name_param.identifier = NULL;
|
| - } else {
|
| - CreateNPIdentifierParam(name, &name_param);
|
| - }
|
| -
|
| - // Note: This instance can get destroyed in the context of
|
| - // Send so addref the channel in this scope.
|
| - scoped_refptr<NPChannelBase> channel_copy = proxy->channel_;
|
| - std::vector<NPVariant_Param> args_param;
|
| - for (unsigned int i = 0; i < arg_count; ++i) {
|
| - NPVariant_Param param;
|
| - CreateNPVariantParam(args[i],
|
| - channel_copy.get(),
|
| - ¶m,
|
| - false,
|
| - render_view_id,
|
| - proxy->page_url_);
|
| - args_param.push_back(param);
|
| - }
|
| -
|
| - NPVariant_Param param_result;
|
| - NPObjectMsg_Invoke* msg = new NPObjectMsg_Invoke(
|
| - proxy->route_id_, is_default, name_param, args_param, ¶m_result,
|
| - &result);
|
| -
|
| - // If we're in the plugin process and this invoke leads to a dialog box, the
|
| - // plugin will hang the window hierarchy unless we pump the window message
|
| - // queue while waiting for a reply. We need to do this to simulate what
|
| - // happens when everything runs in-process (while calling MessageBox window
|
| - // messages are pumped).
|
| - if (IsPluginProcess() && proxy->channel()) {
|
| - msg->set_pump_messages_event(
|
| - proxy->channel()->GetModalDialogEvent(render_view_id));
|
| - }
|
| -
|
| - GURL page_url = proxy->page_url_;
|
| - proxy->Send(msg);
|
| -
|
| - // Send may delete proxy.
|
| - proxy = NULL;
|
| -
|
| - if (!result)
|
| - return false;
|
| -
|
| - CreateNPVariant(
|
| - param_result, channel_copy.get(), np_result, render_view_id, page_url);
|
| - return true;
|
| -}
|
| -
|
| -bool NPObjectProxy::NPHasProperty(NPObject *obj,
|
| - NPIdentifier name) {
|
| - if (obj == NULL)
|
| - return false;
|
| -
|
| - bool result = false;
|
| - NPObjectProxy* proxy = GetProxy(obj);
|
| - if (!proxy) {
|
| - return obj->_class->hasProperty(obj, name);
|
| - }
|
| -
|
| - NPIdentifier_Param name_param;
|
| - CreateNPIdentifierParam(name, &name_param);
|
| -
|
| - NPVariant_Param param;
|
| - proxy->Send(new NPObjectMsg_HasProperty(
|
| - proxy->route_id(), name_param, &result));
|
| -
|
| - // Send may delete proxy.
|
| - proxy = NULL;
|
| -
|
| - return result;
|
| -}
|
| -
|
| -bool NPObjectProxy::NPGetProperty(NPObject *obj,
|
| - NPIdentifier name,
|
| - NPVariant *np_result) {
|
| - // Please refer to http://code.google.com/p/chromium/issues/detail?id=2556,
|
| - // which was a crash in the XStandard plugin during plugin shutdown. The
|
| - // crash occured because the plugin requests the plugin script object,
|
| - // which fails. The plugin does not check the result of the operation and
|
| - // invokes NPN_GetProperty on a NULL object which lead to the crash. If
|
| - // we observe similar crashes in other methods in the future, these null
|
| - // checks may have to be replicated in the other methods in this class.
|
| - if (obj == NULL)
|
| - return false;
|
| -
|
| - NPObjectProxy* proxy = GetProxy(obj);
|
| - if (!proxy) {
|
| - return obj->_class->getProperty(obj, name, np_result);
|
| - }
|
| -
|
| - bool result = false;
|
| - int render_view_id = proxy->render_view_id_;
|
| - NPIdentifier_Param name_param;
|
| - CreateNPIdentifierParam(name, &name_param);
|
| -
|
| - NPVariant_Param param;
|
| - scoped_refptr<NPChannelBase> channel(proxy->channel_);
|
| -
|
| - GURL page_url = proxy->page_url_;
|
| - proxy->Send(new NPObjectMsg_GetProperty(
|
| - proxy->route_id(), name_param, ¶m, &result));
|
| - // Send may delete proxy.
|
| - proxy = NULL;
|
| - if (!result)
|
| - return false;
|
| -
|
| - CreateNPVariant(
|
| - param, channel.get(), np_result, render_view_id, page_url);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool NPObjectProxy::NPSetProperty(NPObject *obj,
|
| - NPIdentifier name,
|
| - const NPVariant *value) {
|
| - if (obj == NULL)
|
| - return false;
|
| -
|
| - NPObjectProxy* proxy = GetProxy(obj);
|
| - if (!proxy) {
|
| - return obj->_class->setProperty(obj, name, value);
|
| - }
|
| -
|
| - bool result = false;
|
| - int render_view_id = proxy->render_view_id_;
|
| - NPIdentifier_Param name_param;
|
| - CreateNPIdentifierParam(name, &name_param);
|
| -
|
| - NPVariant_Param value_param;
|
| - CreateNPVariantParam(
|
| - *value, proxy->channel(), &value_param, false, render_view_id,
|
| - proxy->page_url_);
|
| -
|
| - proxy->Send(new NPObjectMsg_SetProperty(
|
| - proxy->route_id(), name_param, value_param, &result));
|
| - // Send may delete proxy.
|
| - proxy = NULL;
|
| -
|
| - return result;
|
| -}
|
| -
|
| -bool NPObjectProxy::NPRemoveProperty(NPObject *obj,
|
| - NPIdentifier name) {
|
| - if (obj == NULL)
|
| - return false;
|
| -
|
| - bool result = false;
|
| - NPObjectProxy* proxy = GetProxy(obj);
|
| - if (!proxy) {
|
| - return obj->_class->removeProperty(obj, name);
|
| - }
|
| -
|
| - NPIdentifier_Param name_param;
|
| - CreateNPIdentifierParam(name, &name_param);
|
| -
|
| - NPVariant_Param param;
|
| - proxy->Send(new NPObjectMsg_RemoveProperty(
|
| - proxy->route_id(), name_param, &result));
|
| - // Send may delete proxy.
|
| - proxy = NULL;
|
| -
|
| - return result;
|
| -}
|
| -
|
| -void NPObjectProxy::NPPInvalidate(NPObject *obj) {
|
| - if (obj == NULL)
|
| - return;
|
| -
|
| - NPObjectProxy* proxy = GetProxy(obj);
|
| - if (!proxy) {
|
| - obj->_class->invalidate(obj);
|
| - return;
|
| - }
|
| -
|
| - proxy->Send(new NPObjectMsg_Invalidate(proxy->route_id()));
|
| - // Send may delete proxy.
|
| - proxy = NULL;
|
| -}
|
| -
|
| -bool NPObjectProxy::NPNEnumerate(NPObject *obj,
|
| - NPIdentifier **value,
|
| - uint32_t *count) {
|
| - if (obj == NULL)
|
| - return false;
|
| -
|
| - bool result = false;
|
| - NPObjectProxy* proxy = GetProxy(obj);
|
| - if (!proxy) {
|
| - if (obj->_class->structVersion >= NP_CLASS_STRUCT_VERSION_ENUM) {
|
| - return obj->_class->enumerate(obj, value, count);
|
| - } else {
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - std::vector<NPIdentifier_Param> value_param;
|
| - proxy->Send(new NPObjectMsg_Enumeration(
|
| - proxy->route_id(), &value_param, &result));
|
| - // Send may delete proxy.
|
| - proxy = NULL;
|
| -
|
| - if (!result)
|
| - return false;
|
| -
|
| - *count = static_cast<unsigned int>(value_param.size());
|
| - *value = static_cast<NPIdentifier *>(malloc(sizeof(NPIdentifier) * *count));
|
| - for (unsigned int i = 0; i < *count; ++i)
|
| - (*value)[i] = CreateNPIdentifier(value_param[i]);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool NPObjectProxy::NPNConstruct(NPObject *obj,
|
| - const NPVariant *args,
|
| - uint32_t arg_count,
|
| - NPVariant *np_result) {
|
| - if (obj == NULL)
|
| - return false;
|
| -
|
| - NPObjectProxy* proxy = GetProxy(obj);
|
| - if (!proxy) {
|
| - if (obj->_class->structVersion >= NP_CLASS_STRUCT_VERSION_CTOR) {
|
| - return obj->_class->construct(obj, args, arg_count, np_result);
|
| - } else {
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - bool result = false;
|
| - int render_view_id = proxy->render_view_id_;
|
| -
|
| - // Note: This instance can get destroyed in the context of
|
| - // Send so addref the channel in this scope.
|
| - scoped_refptr<NPChannelBase> channel_copy = proxy->channel_;
|
| - std::vector<NPVariant_Param> args_param;
|
| - for (unsigned int i = 0; i < arg_count; ++i) {
|
| - NPVariant_Param param;
|
| - CreateNPVariantParam(args[i],
|
| - channel_copy.get(),
|
| - ¶m,
|
| - false,
|
| - render_view_id,
|
| - proxy->page_url_);
|
| - args_param.push_back(param);
|
| - }
|
| -
|
| - NPVariant_Param param_result;
|
| - NPObjectMsg_Construct* msg = new NPObjectMsg_Construct(
|
| - proxy->route_id_, args_param, ¶m_result, &result);
|
| -
|
| - // See comment in NPObjectProxy::NPInvokePrivate.
|
| - if (IsPluginProcess() && proxy->channel()) {
|
| - msg->set_pump_messages_event(
|
| - proxy->channel()->GetModalDialogEvent(proxy->render_view_id_));
|
| - }
|
| -
|
| - GURL page_url = proxy->page_url_;
|
| - proxy->Send(msg);
|
| -
|
| - // Send may delete proxy.
|
| - proxy = NULL;
|
| -
|
| - if (!result)
|
| - return false;
|
| -
|
| - CreateNPVariant(
|
| - param_result, channel_copy.get(), np_result, render_view_id, page_url);
|
| - return true;
|
| -}
|
| -
|
| -bool NPObjectProxy::NPNEvaluate(NPP npp,
|
| - NPObject *obj,
|
| - NPString *script,
|
| - NPVariant *result_var) {
|
| - NPObjectProxy* proxy = GetProxy(obj);
|
| - if (!proxy) {
|
| - return false;
|
| - }
|
| -
|
| - bool result = false;
|
| - int render_view_id = proxy->render_view_id_;
|
| - bool popups_allowed = false;
|
| -
|
| -#if defined(ENABLE_PLUGINS)
|
| - if (npp) {
|
| - PluginInstance* plugin_instance =
|
| - reinterpret_cast<PluginInstance*>(npp->ndata);
|
| - if (plugin_instance)
|
| - popups_allowed = plugin_instance->popups_allowed();
|
| - }
|
| -#endif
|
| -
|
| - NPVariant_Param result_param;
|
| - std::string script_str = std::string(
|
| - script->UTF8Characters, script->UTF8Length);
|
| -
|
| - NPObjectMsg_Evaluate* msg = new NPObjectMsg_Evaluate(proxy->route_id(),
|
| - script_str,
|
| - popups_allowed,
|
| - &result_param,
|
| - &result);
|
| -
|
| - // See comment in NPObjectProxy::NPInvokePrivate.
|
| - if (IsPluginProcess() && proxy->channel()) {
|
| - msg->set_pump_messages_event(
|
| - proxy->channel()->GetModalDialogEvent(render_view_id));
|
| - }
|
| - scoped_refptr<NPChannelBase> channel(proxy->channel_);
|
| -
|
| - GURL page_url = proxy->page_url_;
|
| - proxy->Send(msg);
|
| - // Send may delete proxy.
|
| - proxy = NULL;
|
| - if (!result)
|
| - return false;
|
| -
|
| - CreateNPVariant(
|
| - result_param, channel.get(), result_var, render_view_id, page_url);
|
| - return true;
|
| -}
|
| -
|
| -} // namespace content
|
|
|