diff options
Diffstat (limited to 'chrome/common/child_process_host.cc')
-rw-r--r-- | chrome/common/child_process_host.cc | 231 |
1 files changed, 0 insertions, 231 deletions
diff --git a/chrome/common/child_process_host.cc b/chrome/common/child_process_host.cc deleted file mode 100644 index 8fa711b..0000000 --- a/chrome/common/child_process_host.cc +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright (c) 2010 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 "chrome/common/child_process_host.h" - -#include "base/command_line.h" -#include "base/file_path.h" -#include "base/metrics/histogram.h" -#include "base/path_service.h" -#include "base/third_party/dynamic_annotations/dynamic_annotations.h" -#include "chrome/common/child_process_info.h" -#include "content/common/child_process_messages.h" -#include "content/common/content_paths.h" -#include "content/common/content_switches.h" -#include "ipc/ipc_logging.h" - -#if defined(OS_LINUX) -#include "base/linux_util.h" -#endif // OS_LINUX - -ChildProcessHost::ChildProcessHost() - : ALLOW_THIS_IN_INITIALIZER_LIST(listener_(this)), - opening_channel_(false) { -} - -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; - - child_path = CommandLine::ForCurrentProcess()->GetSwitchValuePath( - switches::kBrowserSubprocessPath); - if (!child_path.empty()) - return child_path; - -#if defined(OS_LINUX) - // Use /proc/self/exe rather than our known binary path so updates - // can't swap out the binary from underneath us. - // When running under Valgrind, forking /proc/self/exe ends up forking the - // Valgrind executable, which then crashes. However, it's almost safe to - // assume that the updates won't happen while testing with Valgrind tools. - if (allow_self && !RunningOnValgrind()) - return FilePath("/proc/self/exe"); -#endif - - // On most platforms, the child executable is the same as the current - // executable. - PathService::Get(content::CHILD_PROCESS_EXE, &child_path); - return child_path; -} - -#if defined(OS_WIN) -// static -void ChildProcessHost::PreCacheFont(LOGFONT font) { - // If a child process is running in a sandbox, GetTextMetrics() - // can sometimes fail. If a font has not been loaded - // previously, GetTextMetrics() will try to load the font - // from the font file. However, the sandboxed process does - // not have permissions to access any font files and - // the call fails. So we make the browser pre-load the - // font for us by using a dummy call to GetTextMetrics of - // the same font. - - // Maintain a circular queue for the fonts and DCs to be cached. - // font_index maintains next available location in the queue. - static const int kFontCacheSize = 32; - static HFONT fonts[kFontCacheSize] = {0}; - static HDC hdcs[kFontCacheSize] = {0}; - static size_t font_index = 0; - - UMA_HISTOGRAM_COUNTS_100("Memory.CachedFontAndDC", - fonts[kFontCacheSize-1] ? kFontCacheSize : static_cast<int>(font_index)); - - HDC hdc = GetDC(NULL); - HFONT font_handle = CreateFontIndirect(&font); - DCHECK(NULL != font_handle); - - HGDIOBJ old_font = SelectObject(hdc, font_handle); - DCHECK(NULL != old_font); - - TEXTMETRIC tm; - BOOL ret = GetTextMetrics(hdc, &tm); - DCHECK(ret); - - if (fonts[font_index] || hdcs[font_index]) { - // We already have too many fonts, we will delete one and take it's place. - DeleteObject(fonts[font_index]); - ReleaseDC(NULL, hdcs[font_index]); - } - - fonts[font_index] = font_handle; - hdcs[font_index] = hdc; - font_index = (font_index + 1) % kFontCacheSize; -} -#endif // OS_WIN - - -bool ChildProcessHost::CreateChannel() { - channel_id_ = ChildProcessInfo::GenerateRandomChannelID(this); - channel_.reset(new IPC::Channel( - channel_id_, IPC::Channel::MODE_SERVER, &listener_)); - 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(); - Send(new ChildProcessMsg_SetIPCLoggingEnabled(enabled)); -#endif - - Send(new ChildProcessMsg_AskBeforeShutdown()); - - opening_channel_ = true; - - return true; -} - -void ChildProcessHost::InstanceCreated() { - Notify(NotificationType::CHILD_INSTANCE_CREATED); -} - -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; - return false; - } - return channel_->Send(message); -} - -void ChildProcessHost::OnChildDied() { - delete this; -} - -void ChildProcessHost::ShutdownStarted() { -} - -void ChildProcessHost::Notify(NotificationType type) { -} - -ChildProcessHost::ListenerHook::ListenerHook(ChildProcessHost* host) - : host_(host) { -} - -bool ChildProcessHost::ListenerHook::OnMessageReceived( - const IPC::Message& msg) { -#ifdef IPC_MESSAGE_LOG_ENABLED - IPC::Logging* logger = IPC::Logging::GetInstance(); - if (msg.type() == IPC_LOGGING_ID) { - logger->OnReceivedLoggingMessage(msg); - return true; - } - - if (logger->Enabled()) - logger->OnPreDispatchMessage(msg); -#endif - - bool handled = false; - for (size_t i = 0; i < host_->filters_.size(); ++i) { - if (host_->filters_[i]->OnMessageReceived(msg)) { - handled = true; - break; - } - } - - if (!handled && msg.type() == ChildProcessHostMsg_ShutdownRequest::ID) { - if (host_->CanShutdown()) - host_->Send(new ChildProcessMsg_Shutdown()); - handled = true; - } - - if (!handled) - handled = host_->OnMessageReceived(msg); - -#ifdef IPC_MESSAGE_LOG_ENABLED - if (logger->Enabled()) - logger->OnPostDispatchMessage(msg, host_->channel_id_); -#endif - return handled; -} - -void ChildProcessHost::ListenerHook::OnChannelConnected(int32 peer_pid) { - host_->opening_channel_ = false; - 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() { - Send(new ChildProcessMsg_Shutdown()); -} |