| Index: chrome/common/child_process_host.cc
|
| ===================================================================
|
| --- chrome/common/child_process_host.cc (revision 69229)
|
| +++ chrome/common/child_process_host.cc (working copy)
|
| @@ -13,7 +13,6 @@
|
| #include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/plugin_messages.h"
|
| #include "ipc/ipc_logging.h"
|
| -#include "ipc/ipc_message.h"
|
|
|
| #if defined(OS_LINUX)
|
| #include "base/linux_util.h"
|
| @@ -25,8 +24,19 @@
|
| }
|
|
|
| ChildProcessHost::~ChildProcessHost() {
|
| + for (size_t i = 0; i < filters_.size(); ++i) {
|
| + filters_[i]->OnChannelClosing();
|
| + filters_[i]->OnFilterRemoved();
|
| + }
|
| }
|
|
|
| +void ChildProcessHost::AddFilter(IPC::ChannelProxy::MessageFilter* filter) {
|
| + filters_.push_back(filter);
|
| +
|
| + if (channel_.get())
|
| + filter->OnFilterAdded(channel_.get());
|
| +}
|
| +
|
| // static
|
| FilePath ChildProcessHost::GetChildPath(bool allow_self) {
|
| FilePath child_path;
|
| @@ -109,13 +119,16 @@
|
| if (!channel_->Connect())
|
| return false;
|
|
|
| + for (size_t i = 0; i < filters_.size(); ++i)
|
| + filters_[i]->OnFilterAdded(channel_.get());
|
| +
|
| // Make sure these messages get sent first.
|
| #if defined(IPC_MESSAGE_LOG_ENABLED)
|
| bool enabled = IPC::Logging::GetInstance()->Enabled();
|
| - SendOnChannel(new PluginProcessMsg_SetIPCLoggingEnabled(enabled));
|
| + Send(new PluginProcessMsg_SetIPCLoggingEnabled(enabled));
|
| #endif
|
|
|
| - SendOnChannel(new PluginProcessMsg_AskBeforeShutdown());
|
| + Send(new PluginProcessMsg_AskBeforeShutdown());
|
|
|
| opening_channel_ = true;
|
|
|
| @@ -126,22 +139,18 @@
|
| Notify(NotificationType::CHILD_INSTANCE_CREATED);
|
| }
|
|
|
| -bool ChildProcessHost::SendOnChannel(IPC::Message* msg) {
|
| +bool ChildProcessHost::Send(IPC::Message* message) {
|
| if (!channel_.get()) {
|
| - delete msg;
|
| + delete message;
|
| return false;
|
| }
|
| - return channel_->Send(msg);
|
| + return channel_->Send(message);
|
| }
|
|
|
| void ChildProcessHost::OnChildDied() {
|
| delete this;
|
| }
|
|
|
| -bool ChildProcessHost::InterceptMessageFromChild(const IPC::Message& msg) {
|
| - return false;
|
| -}
|
| -
|
| ChildProcessHost::ListenerHook::ListenerHook(ChildProcessHost* host)
|
| : host_(host) {
|
| }
|
| @@ -159,17 +168,22 @@
|
| logger->OnPreDispatchMessage(msg);
|
| #endif
|
|
|
| - bool handled = host_->InterceptMessageFromChild(msg);
|
| + if (msg.type() == PluginProcessHostMsg_ShutdownRequest::ID &&
|
| + host_->CanShutdown()) {
|
| + host_->Send(new PluginProcessMsg_Shutdown());
|
| + }
|
|
|
| - if (!handled) {
|
| - if (msg.type() == PluginProcessHostMsg_ShutdownRequest::ID) {
|
| - if (host_->CanShutdown())
|
| - host_->SendOnChannel(new PluginProcessMsg_Shutdown());
|
| - } else {
|
| - host_->OnMessageReceived(msg);
|
| + bool handled = false;
|
| + for (size_t i = 0; i < host_->filters_.size(); ++i) {
|
| + if (host_->filters_[i]->OnMessageReceived(msg)) {
|
| + handled = true;
|
| + break;
|
| }
|
| }
|
|
|
| + if (!handled)
|
| + host_->OnMessageReceived(msg);
|
| +
|
| #ifdef IPC_MESSAGE_LOG_ENABLED
|
| if (logger->Enabled())
|
| logger->OnPostDispatchMessage(msg, host_->channel_id_);
|
| @@ -181,16 +195,22 @@
|
| host_->OnChannelConnected(peer_pid);
|
| // Notify in the main loop of the connection.
|
| host_->Notify(NotificationType::CHILD_PROCESS_HOST_CONNECTED);
|
| +
|
| + for (size_t i = 0; i < host_->filters_.size(); ++i)
|
| + host_->filters_[i]->OnChannelConnected(peer_pid);
|
| }
|
|
|
| void ChildProcessHost::ListenerHook::OnChannelError() {
|
| host_->opening_channel_ = false;
|
| host_->OnChannelError();
|
|
|
| + for (size_t i = 0; i < host_->filters_.size(); ++i)
|
| + host_->filters_[i]->OnChannelError();
|
| +
|
| // This will delete host_, which will also destroy this!
|
| host_->OnChildDied();
|
| }
|
|
|
| void ChildProcessHost::ForceShutdown() {
|
| - SendOnChannel(new PluginProcessMsg_Shutdown());
|
| + Send(new PluginProcessMsg_Shutdown());
|
| }
|
|
|