| Index: content/common/child_process_host.cc
|
| ===================================================================
|
| --- content/common/child_process_host.cc (revision 112597)
|
| +++ content/common/child_process_host.cc (working copy)
|
| @@ -17,6 +17,7 @@
|
| #include "base/stringprintf.h"
|
| #include "base/third_party/dynamic_annotations/dynamic_annotations.h"
|
| #include "content/common/child_process_messages.h"
|
| +#include "content/public/common/child_process_host_delegate.h"
|
| #include "content/public/common/content_paths.h"
|
| #include "content/public/common/content_switches.h"
|
| #include "ipc/ipc_logging.h"
|
| @@ -73,8 +74,9 @@
|
| } // namespace
|
| #endif // OS_MACOSX
|
|
|
| -ChildProcessHost::ChildProcessHost()
|
| - : ALLOW_THIS_IN_INITIALIZER_LIST(listener_(this)),
|
| +ChildProcessHost::ChildProcessHost(content::ChildProcessHostDelegate* delegate)
|
| + : delegate_(delegate),
|
| + peer_handle_(base::kNullProcessHandle),
|
| opening_channel_(false) {
|
| #if defined(OS_WIN)
|
| AddFilter(new FontCacheDispatcher());
|
| @@ -86,7 +88,8 @@
|
| filters_[i]->OnChannelClosing();
|
| filters_[i]->OnFilterRemoved();
|
| }
|
| - listener_.Shutdown();
|
| +
|
| + base::CloseProcessHandle(peer_handle_);
|
| }
|
|
|
| void ChildProcessHost::AddFilter(IPC::ChannelProxy::MessageFilter* filter) {
|
| @@ -147,7 +150,7 @@
|
| bool ChildProcessHost::CreateChannel() {
|
| channel_id_ = GenerateRandomChannelID(this);
|
| channel_.reset(new IPC::Channel(
|
| - channel_id_, IPC::Channel::MODE_SERVER, &listener_));
|
| + channel_id_, IPC::Channel::MODE_SERVER, this));
|
| if (!channel_->Connect())
|
| return false;
|
|
|
| @@ -167,16 +170,6 @@
|
| return true;
|
| }
|
|
|
| -bool ChildProcessHost::OnMessageReceived(const IPC::Message& msg) {
|
| - return false;
|
| -}
|
| -
|
| -void ChildProcessHost::OnChannelConnected(int32 peer_pid) {
|
| -}
|
| -
|
| -void ChildProcessHost::OnChannelError() {
|
| -}
|
| -
|
| bool ChildProcessHost::Send(IPC::Message* message) {
|
| if (!channel_.get()) {
|
| delete message;
|
| @@ -185,7 +178,7 @@
|
| return channel_->Send(message);
|
| }
|
|
|
| -void ChildProcessHost::OnAllocateSharedMemory(
|
| +void ChildProcessHost::AllocateSharedMemory(
|
| uint32 buffer_size, base::ProcessHandle child_process_handle,
|
| base::SharedMemoryHandle* shared_memory_handle) {
|
| base::SharedMemory shared_buf;
|
| @@ -215,35 +208,7 @@
|
| return base::subtle::NoBarrier_AtomicIncrement(&last_unique_child_id, 1);
|
| }
|
|
|
| -
|
| -void ChildProcessHost::OnChildDied() {
|
| - delete this;
|
| -}
|
| -
|
| -void ChildProcessHost::OnChildDisconnected() {
|
| - OnChildDied();
|
| -}
|
| -
|
| -void ChildProcessHost::ShutdownStarted() {
|
| -}
|
| -
|
| -ChildProcessHost::ListenerHook::ListenerHook(ChildProcessHost* host)
|
| - : host_(host), peer_handle_(base::kNullProcessHandle) {
|
| -}
|
| -
|
| -ChildProcessHost::ListenerHook::~ListenerHook() {
|
| - base::CloseProcessHandle(peer_handle_);
|
| -}
|
| -
|
| -void ChildProcessHost::ListenerHook::Shutdown() {
|
| - host_ = NULL;
|
| -}
|
| -
|
| -bool ChildProcessHost::ListenerHook::OnMessageReceived(
|
| - const IPC::Message& msg) {
|
| - if (!host_)
|
| - return true;
|
| -
|
| +bool ChildProcessHost::OnMessageReceived(const IPC::Message& msg) {
|
| #ifdef IPC_MESSAGE_LOG_ENABLED
|
| IPC::Logging* logger = IPC::Logging::GetInstance();
|
| if (msg.type() == IPC_LOGGING_ID) {
|
| @@ -256,72 +221,62 @@
|
| #endif
|
|
|
| bool handled = false;
|
| - for (size_t i = 0; i < host_->filters_.size(); ++i) {
|
| - if (host_->filters_[i]->OnMessageReceived(msg)) {
|
| + for (size_t i = 0; i < filters_.size(); ++i) {
|
| + if (filters_[i]->OnMessageReceived(msg)) {
|
| handled = true;
|
| break;
|
| }
|
| }
|
|
|
| if (!handled) {
|
| - bool msg_is_good = false;
|
| handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP_EX(ListenerHook, msg, msg_is_good)
|
| + IPC_BEGIN_MESSAGE_MAP(ChildProcessHost, msg)
|
| IPC_MESSAGE_HANDLER(ChildProcessHostMsg_ShutdownRequest,
|
| OnShutdownRequest)
|
| IPC_MESSAGE_HANDLER(ChildProcessHostMsg_SyncAllocateSharedMemory,
|
| OnAllocateSharedMemory)
|
| IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP_EX()
|
| + IPC_END_MESSAGE_MAP()
|
|
|
| if (!handled)
|
| - handled = host_->OnMessageReceived(msg);
|
| + handled = delegate_->OnMessageReceived(msg);
|
| }
|
|
|
| #ifdef IPC_MESSAGE_LOG_ENABLED
|
| if (logger->Enabled())
|
| - logger->OnPostDispatchMessage(msg, host_->channel_id_);
|
| + logger->OnPostDispatchMessage(msg, channel_id_);
|
| #endif
|
| return handled;
|
| }
|
|
|
| -void ChildProcessHost::ListenerHook::OnChannelConnected(int32 peer_pid) {
|
| - if (!host_)
|
| - return;
|
| +void ChildProcessHost::OnChannelConnected(int32 peer_pid) {
|
| if (!base::OpenProcessHandle(peer_pid, &peer_handle_)) {
|
| NOTREACHED();
|
| }
|
| - host_->opening_channel_ = false;
|
| - host_->OnChannelConnected(peer_pid);
|
| - for (size_t i = 0; i < host_->filters_.size(); ++i)
|
| - host_->filters_[i]->OnChannelConnected(peer_pid);
|
| + opening_channel_ = false;
|
| + delegate_->OnChannelConnected(peer_pid);
|
| + for (size_t i = 0; i < filters_.size(); ++i)
|
| + filters_[i]->OnChannelConnected(peer_pid);
|
| }
|
|
|
| -void ChildProcessHost::ListenerHook::OnChannelError() {
|
| - if (!host_)
|
| - return;
|
| - host_->opening_channel_ = false;
|
| - host_->OnChannelError();
|
| +void ChildProcessHost::OnChannelError() {
|
| + opening_channel_ = false;
|
| + delegate_->OnChannelError();
|
|
|
| - for (size_t i = 0; i < host_->filters_.size(); ++i)
|
| - host_->filters_[i]->OnChannelError();
|
| + for (size_t i = 0; i < filters_.size(); ++i)
|
| + filters_[i]->OnChannelError();
|
|
|
| // This will delete host_, which will also destroy this!
|
| - host_->OnChildDisconnected();
|
| + delegate_->OnChildDisconnected();
|
| }
|
|
|
| -bool ChildProcessHost::ListenerHook::Send(IPC::Message* message) {
|
| - return host_->Send(message);
|
| -}
|
| -
|
| -void ChildProcessHost::ListenerHook::OnAllocateSharedMemory(
|
| +void ChildProcessHost::OnAllocateSharedMemory(
|
| uint32 buffer_size,
|
| base::SharedMemoryHandle* handle) {
|
| - ChildProcessHost::OnAllocateSharedMemory(
|
| - buffer_size, peer_handle_, handle);
|
| + AllocateSharedMemory(buffer_size, peer_handle_, handle);
|
| }
|
|
|
| -void ChildProcessHost::ListenerHook::OnShutdownRequest() {
|
| - if (host_->CanShutdown())
|
| - host_->Send(new ChildProcessMsg_Shutdown());
|
| +void ChildProcessHost::OnShutdownRequest() {
|
| + if (delegate_->CanShutdown())
|
| + Send(new ChildProcessMsg_Shutdown());
|
| }
|
|
|