Index: content/child/npapi/npobject_stub.cc |
diff --git a/content/child/npapi/npobject_stub.cc b/content/child/npapi/npobject_stub.cc |
deleted file mode 100644 |
index a8f512809eb5f637dddf874fc8dccbeb604f8ed2..0000000000000000000000000000000000000000 |
--- a/content/child/npapi/npobject_stub.cc |
+++ /dev/null |
@@ -1,424 +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_stub.h" |
- |
-#include "build/build_config.h" |
-#include "content/child/npapi/np_channel_base.h" |
-#include "content/child/npapi/npobject_util.h" |
-#include "content/child/plugin_messages.h" |
-#include "content/public/common/content_client.h" |
-#include "content/public/common/content_switches.h" |
-#include "third_party/WebKit/public/web/WebBindings.h" |
-#include "third_party/npapi/bindings/npapi.h" |
-#include "third_party/npapi/bindings/npruntime.h" |
- |
-#if defined(OS_WIN) |
-#include "base/command_line.h" |
-#include "content/common/plugin_constants_win.h" |
-#endif |
- |
-using blink::WebBindings; |
- |
-namespace content { |
- |
-NPObjectStub::NPObjectStub( |
- NPObject* npobject, |
- NPChannelBase* channel, |
- int route_id, |
- int render_view_id, |
- const GURL& page_url) |
- : npobject_(npobject), |
- channel_(channel), |
- route_id_(route_id), |
- render_view_id_(render_view_id), |
- page_url_(page_url) { |
- channel_->AddMappingForNPObjectStub(route_id, npobject); |
- channel_->AddRoute(route_id, this, this); |
- |
- // We retain the object just as PluginHost does if everything was in-process. |
- WebBindings::retainObject(npobject_); |
-} |
- |
-NPObjectStub::~NPObjectStub() { |
- channel_->RemoveRoute(route_id_); |
- DCHECK(!npobject_); |
-} |
- |
-void NPObjectStub::DeleteSoon() { |
- if (npobject_) { |
- channel_->RemoveMappingForNPObjectStub(route_id_, npobject_); |
- |
- // We need to NULL npobject_ prior to calling releaseObject() to avoid |
- // problems with re-entrancy. See http://crbug.com/94179#c17 for more |
- // details on how this can happen. |
- NPObject* npobject = npobject_; |
- npobject_ = NULL; |
- |
- WebBindings::releaseObject(npobject); |
- |
- base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
- } |
-} |
- |
-bool NPObjectStub::Send(IPC::Message* msg) { |
- return channel_->Send(msg); |
-} |
- |
-NPObject* NPObjectStub::GetUnderlyingNPObject() { |
- return npobject_; |
-} |
- |
-IPC::Listener* NPObjectStub::GetChannelListener() { |
- return static_cast<IPC::Listener*>(this); |
-} |
- |
-bool NPObjectStub::OnMessageReceived(const IPC::Message& msg) { |
- GetContentClient()->SetActiveURL(page_url_); |
- if (!npobject_) { |
- if (msg.is_sync()) { |
- // The object could be garbage because the frame has gone away, so |
- // just send an error reply to the caller. |
- IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); |
- reply->set_reply_error(); |
- Send(reply); |
- } |
- |
- return true; |
- } |
- |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(NPObjectStub, msg) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(NPObjectMsg_Release, OnRelease); |
- IPC_MESSAGE_HANDLER(NPObjectMsg_HasMethod, OnHasMethod); |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(NPObjectMsg_Invoke, OnInvoke); |
- IPC_MESSAGE_HANDLER(NPObjectMsg_HasProperty, OnHasProperty); |
- IPC_MESSAGE_HANDLER(NPObjectMsg_GetProperty, OnGetProperty); |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(NPObjectMsg_SetProperty, OnSetProperty); |
- IPC_MESSAGE_HANDLER(NPObjectMsg_RemoveProperty, OnRemoveProperty); |
- IPC_MESSAGE_HANDLER(NPObjectMsg_Invalidate, OnInvalidate); |
- IPC_MESSAGE_HANDLER(NPObjectMsg_Enumeration, OnEnumeration); |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(NPObjectMsg_Construct, OnConstruct); |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(NPObjectMsg_Evaluate, OnEvaluate); |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- DCHECK(handled); |
- return handled; |
-} |
- |
-void NPObjectStub::OnChannelError() { |
- DeleteSoon(); |
-} |
- |
-void NPObjectStub::OnRelease(IPC::Message* reply_msg) { |
- Send(reply_msg); |
- DeleteSoon(); |
-} |
- |
-void NPObjectStub::OnHasMethod(const NPIdentifier_Param& name, |
- bool* result) { |
- NPIdentifier id = CreateNPIdentifier(name); |
- // If we're in the plugin process, then the stub is holding onto an NPObject |
- // from the plugin, so all function calls on it need to go through the |
- // functions in NPClass. If we're in the renderer process, then we just call |
- // the NPN_ functions. |
- if (IsPluginProcess()) { |
- if (npobject_->_class->hasMethod) { |
- *result = npobject_->_class->hasMethod(npobject_, id); |
- } else { |
- *result = false; |
- } |
- } else { |
- *result = WebBindings::hasMethod(0, npobject_, id); |
- } |
-} |
- |
-void NPObjectStub::OnInvoke(bool is_default, |
- const NPIdentifier_Param& method, |
- const std::vector<NPVariant_Param>& args, |
- IPC::Message* reply_msg) { |
- bool return_value = false; |
- NPVariant_Param result_param; |
- NPVariant result_var; |
- |
- VOID_TO_NPVARIANT(result_var); |
- result_param.type = NPVARIANT_PARAM_VOID; |
- |
- int arg_count = static_cast<int>(args.size()); |
- NPVariant* args_var = new NPVariant[arg_count]; |
- for (int i = 0; i < arg_count; ++i) { |
- if (!CreateNPVariant(args[i], |
- channel_.get(), |
- &(args_var[i]), |
- render_view_id_, |
- page_url_)) { |
- NPObjectMsg_Invoke::WriteReplyParams( |
- reply_msg, result_param, return_value); |
- channel_->Send(reply_msg); |
- delete[] args_var; |
- return; |
- } |
- } |
- |
- if (is_default) { |
- if (IsPluginProcess()) { |
- if (npobject_->_class->invokeDefault) { |
- return_value = npobject_->_class->invokeDefault( |
- npobject_, args_var, arg_count, &result_var); |
- } else { |
- return_value = false; |
- } |
- } else { |
- return_value = WebBindings::invokeDefault( |
- 0, npobject_, args_var, arg_count, &result_var); |
- } |
- } else { |
- NPIdentifier id = CreateNPIdentifier(method); |
- if (IsPluginProcess()) { |
- if (npobject_->_class->invoke) { |
- return_value = npobject_->_class->invoke( |
- npobject_, id, args_var, arg_count, &result_var); |
- } else { |
- return_value = false; |
- } |
- } else { |
- return_value = WebBindings::invoke( |
- 0, npobject_, id, args_var, arg_count, &result_var); |
- } |
- } |
- |
- for (int i = 0; i < arg_count; ++i) |
- WebBindings::releaseVariantValue(&(args_var[i])); |
- |
- delete[] args_var; |
- |
- CreateNPVariantParam(result_var, |
- channel_.get(), |
- &result_param, |
- true, |
- render_view_id_, |
- page_url_); |
- NPObjectMsg_Invoke::WriteReplyParams(reply_msg, result_param, return_value); |
- channel_->Send(reply_msg); |
-} |
- |
-void NPObjectStub::OnHasProperty(const NPIdentifier_Param& name, |
- bool* result) { |
- NPIdentifier id = CreateNPIdentifier(name); |
- if (IsPluginProcess()) { |
- if (npobject_->_class->hasProperty) { |
- *result = npobject_->_class->hasProperty(npobject_, id); |
- } else { |
- *result = false; |
- } |
- } else { |
- *result = WebBindings::hasProperty(0, npobject_, id); |
- } |
-} |
- |
-void NPObjectStub::OnGetProperty(const NPIdentifier_Param& name, |
- NPVariant_Param* property, |
- bool* result) { |
- NPVariant result_var; |
- VOID_TO_NPVARIANT(result_var); |
- NPIdentifier id = CreateNPIdentifier(name); |
- |
- if (IsPluginProcess()) { |
- if (npobject_->_class->getProperty) { |
- *result = npobject_->_class->getProperty(npobject_, id, &result_var); |
- } else { |
- *result = false; |
- } |
- } else { |
- *result = WebBindings::getProperty(0, npobject_, id, &result_var); |
- } |
- |
- CreateNPVariantParam( |
- result_var, channel_.get(), property, true, render_view_id_, page_url_); |
-} |
- |
-void NPObjectStub::OnSetProperty(const NPIdentifier_Param& name, |
- const NPVariant_Param& property, |
- IPC::Message* reply_msg) { |
- bool result = false; |
- NPIdentifier id = CreateNPIdentifier(name); |
- NPVariant property_var; |
- if (!CreateNPVariant(property, |
- channel_.get(), |
- &property_var, |
- render_view_id_, |
- page_url_)) { |
- NPObjectMsg_SetProperty::WriteReplyParams(reply_msg, result); |
- channel_->Send(reply_msg); |
- return; |
- } |
- |
- if (IsPluginProcess()) { |
- if (npobject_->_class->setProperty) { |
-#if defined(OS_WIN) |
- static base::FilePath plugin_path = |
- base::CommandLine::ForCurrentProcess()->GetSwitchValuePath( |
- switches::kPluginPath); |
- static std::wstring filename = base::ToLowerASCII( |
- plugin_path.BaseName().value()); |
- static NPIdentifier fullscreen = |
- WebBindings::getStringIdentifier("fullScreen"); |
- if (filename == kNewWMPPlugin && id == fullscreen) { |
- // Workaround for bug 15985, which is if Flash causes WMP to go |
- // full screen a deadlock can occur when WMP calls SetFocus. |
- NPObjectMsg_SetProperty::WriteReplyParams(reply_msg, true); |
- Send(reply_msg); |
- reply_msg = NULL; |
- } |
-#endif |
- result = npobject_->_class->setProperty(npobject_, id, &property_var); |
- } else { |
- result = false; |
- } |
- } else { |
- result = WebBindings::setProperty(0, npobject_, id, &property_var); |
- } |
- |
- WebBindings::releaseVariantValue(&property_var); |
- |
- if (reply_msg) { |
- NPObjectMsg_SetProperty::WriteReplyParams(reply_msg, result); |
- Send(reply_msg); |
- } |
-} |
- |
-void NPObjectStub::OnRemoveProperty(const NPIdentifier_Param& name, |
- bool* result) { |
- NPIdentifier id = CreateNPIdentifier(name); |
- if (IsPluginProcess()) { |
- if (npobject_->_class->removeProperty) { |
- *result = npobject_->_class->removeProperty(npobject_, id); |
- } else { |
- *result = false; |
- } |
- } else { |
- *result = WebBindings::removeProperty(0, npobject_, id); |
- } |
-} |
- |
-void NPObjectStub::OnInvalidate() { |
- if (!IsPluginProcess()) { |
- NOTREACHED() << "Should only be called on NPObjects in the plugin"; |
- return; |
- } |
- |
- if (!npobject_->_class->invalidate) |
- return; |
- |
- npobject_->_class->invalidate(npobject_); |
-} |
- |
-void NPObjectStub::OnEnumeration(std::vector<NPIdentifier_Param>* value, |
- bool* result) { |
- NPIdentifier* value_np = NULL; |
- unsigned int count = 0; |
- if (!IsPluginProcess()) { |
- *result = WebBindings::enumerate(0, npobject_, &value_np, &count); |
- } else { |
- if (npobject_->_class->structVersion < NP_CLASS_STRUCT_VERSION_ENUM || |
- !npobject_->_class->enumerate) { |
- *result = false; |
- return; |
- } |
- |
- *result = npobject_->_class->enumerate(npobject_, &value_np, &count); |
- } |
- |
- if (!*result) |
- return; |
- |
- for (unsigned int i = 0; i < count; ++i) { |
- NPIdentifier_Param param; |
- CreateNPIdentifierParam(value_np[i], ¶m); |
- value->push_back(param); |
- } |
- |
- free(value_np); |
-} |
- |
-void NPObjectStub::OnConstruct(const std::vector<NPVariant_Param>& args, |
- IPC::Message* reply_msg) { |
- bool return_value = false; |
- NPVariant_Param result_param; |
- NPVariant result_var; |
- |
- VOID_TO_NPVARIANT(result_var); |
- |
- int arg_count = static_cast<int>(args.size()); |
- NPVariant* args_var = new NPVariant[arg_count]; |
- for (int i = 0; i < arg_count; ++i) { |
- if (!CreateNPVariant(args[i], |
- channel_.get(), |
- &(args_var[i]), |
- render_view_id_, |
- page_url_)) { |
- NPObjectMsg_Invoke::WriteReplyParams( |
- reply_msg, result_param, return_value); |
- channel_->Send(reply_msg); |
- delete[] args_var; |
- return; |
- } |
- } |
- |
- if (IsPluginProcess()) { |
- if (npobject_->_class->structVersion >= NP_CLASS_STRUCT_VERSION_CTOR && |
- npobject_->_class->construct) { |
- return_value = npobject_->_class->construct( |
- npobject_, args_var, arg_count, &result_var); |
- } else { |
- return_value = false; |
- } |
- } else { |
- return_value = WebBindings::construct( |
- 0, npobject_, args_var, arg_count, &result_var); |
- } |
- |
- for (int i = 0; i < arg_count; ++i) |
- WebBindings::releaseVariantValue(&(args_var[i])); |
- |
- delete[] args_var; |
- |
- CreateNPVariantParam(result_var, |
- channel_.get(), |
- &result_param, |
- true, |
- render_view_id_, |
- page_url_); |
- NPObjectMsg_Invoke::WriteReplyParams(reply_msg, result_param, return_value); |
- channel_->Send(reply_msg); |
-} |
- |
-void NPObjectStub::OnEvaluate(const std::string& script, |
- bool popups_allowed, |
- IPC::Message* reply_msg) { |
- if (IsPluginProcess()) { |
- NOTREACHED() << "Should only be called on NPObjects in the renderer"; |
- return; |
- } |
- |
- NPVariant result_var; |
- NPString script_string; |
- script_string.UTF8Characters = script.c_str(); |
- script_string.UTF8Length = static_cast<unsigned int>(script.length()); |
- |
- bool return_value = WebBindings::evaluateHelper(0, popups_allowed, npobject_, |
- &script_string, &result_var); |
- |
- NPVariant_Param result_param; |
- CreateNPVariantParam(result_var, |
- channel_.get(), |
- &result_param, |
- true, |
- render_view_id_, |
- page_url_); |
- NPObjectMsg_Evaluate::WriteReplyParams(reply_msg, result_param, return_value); |
- channel_->Send(reply_msg); |
-} |
- |
-} // namespace content |