summaryrefslogtreecommitdiffstats
path: root/content/browser
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser')
-rw-r--r--content/browser/browser_child_process_host.cc141
-rw-r--r--content/browser/browser_child_process_host.h137
-rw-r--r--content/browser/browser_process_sub_thread.cc2
-rw-r--r--content/browser/content_ipc_logging.cc5
-rw-r--r--content/browser/debugger/worker_devtools_manager.cc19
-rw-r--r--content/browser/debugger/worker_devtools_manager.h1
-rw-r--r--content/browser/gpu/gpu_process_host.cc27
-rw-r--r--content/browser/gpu/gpu_process_host.h26
-rw-r--r--content/browser/plugin_process_host.cc35
-rw-r--r--content/browser/plugin_process_host.h23
-rw-r--r--content/browser/plugin_process_host_mac.cc8
-rw-r--r--content/browser/plugin_service_impl.cc42
-rw-r--r--content/browser/ppapi_plugin_process_host.cc30
-rw-r--r--content/browser/ppapi_plugin_process_host.h33
-rw-r--r--content/browser/profiler_controller_impl.cc19
-rw-r--r--content/browser/renderer_host/gpu_message_filter.cc1
-rw-r--r--content/browser/renderer_host/render_widget_host_view_win.cc11
-rw-r--r--content/browser/utility_process_host.cc14
-rw-r--r--content/browser/utility_process_host.h17
-rw-r--r--content/browser/worker_host/worker_process_host.cc65
-rw-r--r--content/browser/worker_host/worker_process_host.h33
-rw-r--r--content/browser/worker_host/worker_service_impl.cc77
22 files changed, 376 insertions, 390 deletions
diff --git a/content/browser/browser_child_process_host.cc b/content/browser/browser_child_process_host.cc
index fee30a2..9bd3b21 100644
--- a/content/browser/browser_child_process_host.cc
+++ b/content/browser/browser_child_process_host.cc
@@ -20,7 +20,6 @@
#include "content/common/child_process_host_impl.h"
#include "content/common/plugin_messages.h"
#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/browser_child_process_host_delegate.h"
#include "content/public/browser/child_process_data.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/notification_service.h"
@@ -34,48 +33,31 @@
#include "base/bind.h"
#endif
-using content::BrowserChildProcessHostDelegate;
using content::BrowserThread;
-using content::ChildProcessData;
using content::ChildProcessHost;
using content::ChildProcessHostImpl;
namespace {
-static base::LazyInstance<BrowserChildProcessHost::BrowserChildProcessList>
- g_child_process_list = LAZY_INSTANCE_INITIALIZER;
+typedef std::list<BrowserChildProcessHost*> BrowserChildProcessList;
+static base::LazyInstance<BrowserChildProcessList> g_child_process_list =
+ LAZY_INSTANCE_INITIALIZER;
// Helper functions since the child process related notifications happen on the
// UI thread.
void ChildNotificationHelper(int notification_type,
- const ChildProcessData& data) {
+ const content::ChildProcessData& data) {
content::NotificationService::current()->
Notify(notification_type, content::NotificationService::AllSources(),
- content::Details<const ChildProcessData>(&data));
+ content::Details<const content::ChildProcessData>(&data));
}
} // namespace
-namespace content {
-
-BrowserChildProcessHost* BrowserChildProcessHost::Create(
- ProcessType type,
- BrowserChildProcessHostDelegate* delegate) {
- return new ::BrowserChildProcessHost(type, delegate);
-}
-
-} // namespace content
-
-BrowserChildProcessHost::BrowserChildProcessList*
- BrowserChildProcessHost::GetIterator() {
- return g_child_process_list.Pointer();
-}
-
BrowserChildProcessHost::BrowserChildProcessHost(
- content::ProcessType type,
- BrowserChildProcessHostDelegate* delegate)
+ content::ProcessType type)
: data_(type),
- delegate_(delegate),
+ ALLOW_THIS_IN_INITIALIZER_LIST(client_(this)),
#if !defined(OS_WIN)
ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)),
#endif
@@ -95,7 +77,6 @@ BrowserChildProcessHost::~BrowserChildProcessHost() {
// static
void BrowserChildProcessHost::TerminateAll() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
// Make a copy since the BrowserChildProcessHost dtor mutates the original
// list.
BrowserChildProcessList copy = g_child_process_list.Get();
@@ -110,10 +91,9 @@ void BrowserChildProcessHost::Launch(
const base::environment_vector& environ,
#endif
CommandLine* cmd_line) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
content::GetContentClient()->browser()->AppendExtraCommandLineSwitches(
- cmd_line, data_.id);
+ cmd_line, data().id);
child_process_.reset(new ChildProcessLauncher(
#if defined(OS_WIN)
@@ -121,24 +101,13 @@ void BrowserChildProcessHost::Launch(
#elif defined(OS_POSIX)
use_zygote,
environ,
- child_process_host_->TakeClientFileDescriptor(),
+ child_process_host()->TakeClientFileDescriptor(),
#endif
cmd_line,
- this));
+ &client_));
}
-const ChildProcessData& BrowserChildProcessHost::GetData() const {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- return data_;
-}
-
-ChildProcessHost* BrowserChildProcessHost::GetHost() const {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- return child_process_host_.get();
-}
-
-base::ProcessHandle BrowserChildProcessHost::GetHandle() const {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+base::ProcessHandle BrowserChildProcessHost::GetChildProcessHandle() const {
DCHECK(child_process_.get())
<< "Requesting a child process handle before launching.";
DCHECK(child_process_->GetHandle())
@@ -147,24 +116,20 @@ base::ProcessHandle BrowserChildProcessHost::GetHandle() const {
}
void BrowserChildProcessHost::SetName(const string16& name) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
data_.name = name;
}
void BrowserChildProcessHost::SetHandle(base::ProcessHandle handle) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
data_.handle = handle;
}
void BrowserChildProcessHost::ForceShutdown() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
g_child_process_list.Get().remove(this);
child_process_host_->ForceShutdown();
}
void BrowserChildProcessHost::SetTerminateChildOnShutdown(
- bool terminate_on_shutdown) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ bool terminate_on_shutdown) {
child_process_->SetTerminateChildOnShutdown(terminate_on_shutdown);
}
@@ -175,29 +140,23 @@ void BrowserChildProcessHost::Notify(int type) {
base::Bind(&ChildNotificationHelper, type, data_));
}
-base::TerminationStatus BrowserChildProcessHost::GetTerminationStatus(
+base::TerminationStatus BrowserChildProcessHost::GetChildTerminationStatus(
int* exit_code) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (!child_process_.get()) // If the delegate doesn't use Launch() helper.
- return base::GetTerminationStatus(data_.handle, exit_code);
+ return base::GetTerminationStatus(data().handle, exit_code);
return child_process_->GetChildTerminationStatus(exit_code);
}
bool BrowserChildProcessHost::OnMessageReceived(const IPC::Message& message) {
- return delegate_->OnMessageReceived(message);
+ return false;
}
void BrowserChildProcessHost::OnChannelConnected(int32 peer_pid) {
Notify(content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED);
- delegate_->OnChannelConnected(peer_pid);
-}
-
-void BrowserChildProcessHost::OnChannelError() {
- delegate_->OnChannelError();
}
bool BrowserChildProcessHost::CanShutdown() {
- return delegate_->CanShutdown();
+ return true;
}
// Normally a ChildProcessHostDelegate deletes itself from this callback, but at
@@ -208,21 +167,21 @@ bool BrowserChildProcessHost::CanShutdown() {
// may be called twice: once from the actual channel error and once from
// OnWaitableEventSignaled() or the delayed task.
void BrowserChildProcessHost::OnChildDisconnected() {
- DCHECK(data_.handle != base::kNullProcessHandle);
+ DCHECK(data().handle != base::kNullProcessHandle);
int exit_code;
- base::TerminationStatus status = GetTerminationStatus(&exit_code);
+ base::TerminationStatus status = GetChildTerminationStatus(&exit_code);
switch (status) {
case base::TERMINATION_STATUS_PROCESS_CRASHED:
case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: {
- delegate_->OnProcessCrashed(exit_code);
+ OnProcessCrashed(exit_code);
// Report that this child process crashed.
Notify(content::NOTIFICATION_CHILD_PROCESS_CRASHED);
UMA_HISTOGRAM_ENUMERATION("ChildProcess.Crashed",
- data_.type,
+ data().type,
content::PROCESS_TYPE_MAX);
if (disconnect_was_alive_) {
UMA_HISTOGRAM_ENUMERATION("ChildProcess.CrashedWasAlive",
- data_.type,
+ data().type,
content::PROCESS_TYPE_MAX);
}
break;
@@ -230,11 +189,11 @@ void BrowserChildProcessHost::OnChildDisconnected() {
case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: {
// Report that this child process was killed.
UMA_HISTOGRAM_ENUMERATION("ChildProcess.Killed",
- data_.type,
+ data().type,
content::PROCESS_TYPE_MAX);
if (disconnect_was_alive_) {
UMA_HISTOGRAM_ENUMERATION("ChildProcess.KilledWasAlive",
- data_.type,
+ data().type,
content::PROCESS_TYPE_MAX);
}
break;
@@ -244,14 +203,14 @@ void BrowserChildProcessHost::OnChildDisconnected() {
// code.
if (disconnect_was_alive_) {
UMA_HISTOGRAM_ENUMERATION("ChildProcess.DisconnectedAlive",
- data_.type,
+ data().type,
content::PROCESS_TYPE_MAX);
break;
}
disconnect_was_alive_ = true;
#if defined(OS_WIN)
child_watcher_.StartWatching(
- new base::WaitableEvent(data_.handle), this);
+ new base::WaitableEvent(data().handle), this);
#else
// On non-Windows platforms, give the child process some time to die after
// disconnecting the channel so that the exit code and termination status
@@ -271,7 +230,7 @@ void BrowserChildProcessHost::OnChildDisconnected() {
break;
}
UMA_HISTOGRAM_ENUMERATION("ChildProcess.Disconnected",
- data_.type,
+ data().type,
content::PROCESS_TYPE_MAX);
// Notify in the main loop of the disconnection.
Notify(content::NOTIFICATION_CHILD_PROCESS_HOST_DISCONNECTED);
@@ -306,12 +265,50 @@ void BrowserChildProcessHost::ShutdownStarted() {
g_child_process_list.Get().remove(this);
}
+BrowserChildProcessHost::ClientHook::ClientHook(BrowserChildProcessHost* host)
+ : host_(host) {
+}
-void BrowserChildProcessHost::OnProcessLaunched() {
- if (!child_process_->GetHandle()) {
- delete this;
+void BrowserChildProcessHost::ClientHook::OnProcessLaunched() {
+ if (!host_->child_process_->GetHandle()) {
+ delete host_;
return;
}
- data_.handle = child_process_->GetHandle();
- delegate_->OnProcessLaunched();
+ host_->data_.handle = host_->child_process_->GetHandle();
+ host_->OnProcessLaunched();
+}
+
+BrowserChildProcessHost::Iterator::Iterator()
+ : all_(true), type_(content::PROCESS_TYPE_UNKNOWN) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)) <<
+ "BrowserChildProcessHost::Iterator must be used on the IO thread.";
+ iterator_ = g_child_process_list.Get().begin();
+}
+
+BrowserChildProcessHost::Iterator::Iterator(content::ProcessType type)
+ : all_(false), type_(type) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)) <<
+ "BrowserChildProcessHost::Iterator must be used on the IO thread.";
+ iterator_ = g_child_process_list.Get().begin();
+ if (!Done() && (*iterator_)->data().type != type_)
+ ++(*this);
+}
+
+BrowserChildProcessHost* BrowserChildProcessHost::Iterator::operator++() {
+ do {
+ ++iterator_;
+ if (Done())
+ break;
+
+ if (!all_ && (*iterator_)->data().type != type_)
+ continue;
+
+ return *iterator_;
+ } while (true);
+
+ return NULL;
+}
+
+bool BrowserChildProcessHost::Iterator::Done() {
+ return iterator_ == g_child_process_list.Get().end();
}
diff --git a/content/browser/browser_child_process_host.h b/content/browser/browser_child_process_host.h
index 45d2a22..3fac085 100644
--- a/content/browser/browser_child_process_host.h
+++ b/content/browser/browser_child_process_host.h
@@ -14,52 +14,116 @@
#include "base/process.h"
#include "base/synchronization/waitable_event_watcher.h"
#include "content/browser/child_process_launcher.h"
-#include "content/public/browser/browser_child_process_host.h"
+#include "content/common/content_export.h"
#include "content/public/browser/child_process_data.h"
#include "content/public/common/child_process_host_delegate.h"
+#include "ipc/ipc_message.h"
+
+namespace base {
+class WaitableEvent;
+}
namespace content {
-class BrowserChildProcessHostIterator;
+class ChildProcessHost;
}
-// Plugins/workers and other child processes that live on the IO thread use this
-// class. RenderProcessHostImpl is the main exception that doesn't use this
-/// class because it lives on the UI thread.
+// Plugins/workers and other child processes that live on the IO thread should
+// derive from this class.
+//
+// [Browser]RenderProcessHost is the main exception that doesn't derive from
+// this class. That project lives on the UI thread.
class CONTENT_EXPORT BrowserChildProcessHost :
- public NON_EXPORTED_BASE(content::BrowserChildProcessHost),
public NON_EXPORTED_BASE(content::ChildProcessHostDelegate),
public ChildProcessLauncher::Client,
- public base::WaitableEventWatcher::Delegate {
+ public base::WaitableEventWatcher::Delegate,
+ public IPC::Message::Sender {
public:
- BrowserChildProcessHost(content::ProcessType type,
- content::BrowserChildProcessHostDelegate* delegate);
virtual ~BrowserChildProcessHost();
+ virtual void OnWaitableEventSignaled(
+ base::WaitableEvent* waitable_event) OVERRIDE;
+
// Terminates all child processes and deletes each BrowserChildProcessHost
// instance.
static void TerminateAll();
- // BrowserChildProcessHost implementation:
+ // The Iterator class allows iteration through either all child processes, or
+ // ones of a specific type, depending on which constructor is used. Note that
+ // this should be done from the IO thread and that the iterator should not be
+ // kept around as it may be invalidated on subsequent event processing in the
+ // event loop.
+ class CONTENT_EXPORT Iterator {
+ public:
+ Iterator();
+ explicit Iterator(content::ProcessType type);
+ BrowserChildProcessHost* operator->() { return *iterator_; }
+ BrowserChildProcessHost* operator*() { return *iterator_; }
+ BrowserChildProcessHost* operator++();
+ bool Done();
+
+ private:
+ bool all_;
+ content::ProcessType type_;
+ std::list<BrowserChildProcessHost*>::iterator iterator_;
+ };
+
+ // IPC::Message::Sender override
virtual bool Send(IPC::Message* message) OVERRIDE;
- virtual void Launch(
+
+ const content::ChildProcessData& data() const { return data_; }
+ bool disconnect_was_alive() const { return disconnect_was_alive_; }
+
+ protected:
+ explicit BrowserChildProcessHost(content::ProcessType type);
+
+ // Derived classes call this to launch the child process asynchronously.
+ void Launch(
#if defined(OS_WIN)
const FilePath& exposed_dir,
#elif defined(OS_POSIX)
bool use_zygote,
const base::environment_vector& environ,
#endif
- CommandLine* cmd_line) OVERRIDE;
- virtual const content::ChildProcessData& GetData() const OVERRIDE;
- virtual content::ChildProcessHost* GetHost() const OVERRIDE;
- virtual base::TerminationStatus GetTerminationStatus(int* exit_code) OVERRIDE;
- virtual void SetName(const string16& name) OVERRIDE;
- virtual void SetHandle(base::ProcessHandle handle) OVERRIDE;
+ CommandLine* cmd_line);
- bool disconnect_was_alive() const { return disconnect_was_alive_; }
+ // TODO(jam): below is what will be in the BrowserChildProcessHostDelegate
+ // interface.
+
+ // ChildProcessLauncher::Client implementation.
+ virtual void OnProcessLaunched() OVERRIDE {}
+
+ // Derived classes can override this to know if the process crashed.
+ // |exit_code| is the status returned when the process crashed (for
+ // posix, as returned from waitpid(), for Windows, as returned from
+ // GetExitCodeProcess()).
+ virtual void OnProcessCrashed(int exit_code) {}
+
+ // Overrides from ChildProcessHostDelegate
+ virtual bool CanShutdown() OVERRIDE;
+ virtual void OnChildDisconnected() OVERRIDE;
+ virtual void ShutdownStarted() OVERRIDE;
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+ virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
+
+ // Returns the termination status of a child. |exit_code| is the
+ // status returned when the process exited (for posix, as returned
+ // from waitpid(), for Windows, as returned from
+ // GetExitCodeProcess()). |exit_code| may be NULL.
+ base::TerminationStatus GetChildTerminationStatus(int* exit_code);
// Returns the handle of the child process. This can be called only after
// OnProcessLaunched is called or it will be invalid and may crash.
- base::ProcessHandle GetHandle() const;
+ base::ProcessHandle GetChildProcessHandle() const;
+
+ // Sets the user-visible name of the process.
+ void SetName(const string16& name);
+
+ // Set the handle of the process. BrowserChildProcessHost will do this when
+ // the Launch method is used to start the process. However if the owner
+ // of this object doesn't call Launch and starts the process in another way,
+ // they need to call this method so that the process handle is associated with
+ // this object.
+ void SetHandle(base::ProcessHandle handle);
// Removes this host from the host list. Calls ChildProcessHost::ForceShutdown
void ForceShutdown();
@@ -71,35 +135,26 @@ class CONTENT_EXPORT BrowserChildProcessHost :
// Sends the given notification on the UI thread.
void Notify(int type);
- content::BrowserChildProcessHostDelegate* delegate() const {
- return delegate_;
+ content::ChildProcessHost* child_process_host() const {
+ return child_process_host_.get();
}
- typedef std::list<BrowserChildProcessHost*> BrowserChildProcessList;
private:
- friend class content::BrowserChildProcessHostIterator;
-
- static BrowserChildProcessList* GetIterator();
-
- // ChildProcessHostDelegate implementation:
- virtual bool CanShutdown() OVERRIDE;
- virtual void OnChildDisconnected() OVERRIDE;
- virtual void ShutdownStarted() OVERRIDE;
- virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
- virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
- virtual void OnChannelError() OVERRIDE;
-
- // ChildProcessLauncher::Client implementation.
- virtual void OnProcessLaunched() OVERRIDE;
-
- // public base::WaitableEventWatcher::Delegate implementation:
- virtual void OnWaitableEventSignaled(
- base::WaitableEvent* waitable_event) OVERRIDE;
+ // By using an internal class as the ChildProcessLauncher::Client, we can
+ // intercept OnProcessLaunched and do our own processing before
+ // calling the subclass' implementation.
+ class ClientHook : public ChildProcessLauncher::Client {
+ public:
+ explicit ClientHook(BrowserChildProcessHost* host);
+ virtual void OnProcessLaunched() OVERRIDE;
+ private:
+ BrowserChildProcessHost* host_;
+ };
content::ChildProcessData data_;
- content::BrowserChildProcessHostDelegate* delegate_;
scoped_ptr<content::ChildProcessHost> child_process_host_;
+ ClientHook client_;
scoped_ptr<ChildProcessLauncher> child_process_;
#if defined(OS_WIN)
base::WaitableEventWatcher child_watcher_;
diff --git a/content/browser/browser_process_sub_thread.cc b/content/browser/browser_process_sub_thread.cc
index 2b42da1..35566f0 100644
--- a/content/browser/browser_process_sub_thread.cc
+++ b/content/browser/browser_process_sub_thread.cc
@@ -69,7 +69,7 @@ void BrowserProcessSubThread::IOThreadPreCleanUp() {
// If any child processes are still running, terminate them and
// and delete the BrowserChildProcessHost instances to release whatever
// IO thread only resources they are referencing.
- ::BrowserChildProcessHost::TerminateAll();
+ BrowserChildProcessHost::TerminateAll();
}
void BrowserProcessSubThread::IOThreadPostCleanUp() {
diff --git a/content/browser/content_ipc_logging.cc b/content/browser/content_ipc_logging.cc
index 45b7a2e..4c9e8ea 100644
--- a/content/browser/content_ipc_logging.cc
+++ b/content/browser/content_ipc_logging.cc
@@ -7,7 +7,6 @@
#include "base/bind.h"
#include "content/browser/browser_child_process_host.h"
#include "content/common/child_process_messages.h"
-#include "content/public/browser/browser_child_process_host_iterator.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h"
#include "ipc/ipc_logging.h"
@@ -19,9 +18,9 @@ namespace content {
void EnableIPCLoggingForChildProcesses(bool enabled) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- BrowserChildProcessHostIterator i; // default constr references a singleton
+ BrowserChildProcessHost::Iterator i; // default constr references a singleton
while (!i.Done()) {
- i.Send(new ChildProcessMsg_SetIPCLoggingEnabled(enabled));
+ i->Send(new ChildProcessMsg_SetIPCLoggingEnabled(enabled));
++i;
}
}
diff --git a/content/browser/debugger/worker_devtools_manager.cc b/content/browser/debugger/worker_devtools_manager.cc
index 217c946..2405fb7 100644
--- a/content/browser/debugger/worker_devtools_manager.cc
+++ b/content/browser/debugger/worker_devtools_manager.cc
@@ -15,7 +15,6 @@
#include "content/browser/worker_host/worker_service_impl.h"
#include "content/common/devtools_messages.h"
#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/child_process_data.h"
#include "content/public/browser/devtools_agent_host_registry.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
@@ -293,7 +292,8 @@ void WorkerDevToolsManager::WorkerCreated(
instance.resource_context())) {
worker->Send(new DevToolsAgentMsg_PauseWorkerContextOnStart(
instance.worker_route_id()));
- WorkerId new_worker_id(worker->GetData().id, instance.worker_route_id());
+ WorkerId new_worker_id(
+ worker->data().id, instance.worker_route_id());
paused_workers_[new_worker_id] = it->old_worker_id;
terminated_workers_.erase(it);
return;
@@ -305,12 +305,12 @@ void WorkerDevToolsManager::WorkerDestroyed(
WorkerProcessHost* worker,
int worker_route_id) {
InspectedWorkersList::iterator it = FindInspectedWorker(
- worker->GetData().id,
+ worker->data().id,
worker_route_id);
if (it == inspected_workers_.end())
return;
- WorkerId worker_id(worker->GetData().id, worker_route_id);
+ WorkerId worker_id(worker->data().id, worker_route_id);
terminated_workers_.push_back(TerminatedInspectedWorker(
worker_id,
it->worker_url,
@@ -323,7 +323,7 @@ void WorkerDevToolsManager::WorkerDestroyed(
void WorkerDevToolsManager::WorkerContextStarted(WorkerProcessHost* process,
int worker_route_id) {
- WorkerId new_worker_id(process->GetData().id, worker_route_id);
+ WorkerId new_worker_id(process->data().id, worker_route_id);
PausedWorkers::iterator it = paused_workers_.find(new_worker_id);
if (it == paused_workers_.end())
return;
@@ -362,7 +362,7 @@ WorkerDevToolsManager::FindInspectedWorker(
int host_id, int route_id) {
InspectedWorkersList::iterator it = inspected_workers_.begin();
while (it != inspected_workers_.end()) {
- if (it->host->GetData().id == host_id && it->route_id == route_id)
+ if (it->host->data().id == host_id && it->route_id == route_id)
break;
++it;
}
@@ -370,9 +370,10 @@ WorkerDevToolsManager::FindInspectedWorker(
}
static WorkerProcessHost* FindWorkerProcess(int worker_process_id) {
- for (WorkerProcessHostIterator iter; !iter.Done(); ++iter) {
- if (iter.GetData().id == worker_process_id)
- return *iter;
+ BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_WORKER);
+ for (; !iter.Done(); ++iter) {
+ if (iter->data().id == worker_process_id)
+ return static_cast<WorkerProcessHost*>(*iter);
}
return NULL;
}
diff --git a/content/browser/debugger/worker_devtools_manager.h b/content/browser/debugger/worker_devtools_manager.h
index d2b2c023..8ee9c1c 100644
--- a/content/browser/debugger/worker_devtools_manager.h
+++ b/content/browser/debugger/worker_devtools_manager.h
@@ -7,7 +7,6 @@
#pragma once
#include <list>
-#include <map>
#include <string>
#include "base/basictypes.h"
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index 258c12a..1b15780 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -15,7 +15,6 @@
#include "base/process_util.h"
#include "base/string_piece.h"
#include "base/threading/thread.h"
-#include "content/browser/browser_child_process_host.h"
#include "content/browser/gpu/gpu_data_manager.h"
#include "content/browser/gpu/gpu_process_host_ui_shim.h"
#include "content/browser/renderer_host/render_widget_host.h"
@@ -161,13 +160,12 @@ class GpuMainThread : public base::Thread {
DISALLOW_COPY_AND_ASSIGN(GpuMainThread);
};
-// static
-bool GpuProcessHost::HostIsValid(GpuProcessHost* host) {
+static bool HostIsValid(GpuProcessHost* host) {
if (!host)
return false;
// Check if the GPU process has died and the host is about to be destroyed.
- if (host->process_->disconnect_was_alive())
+ if (host->disconnect_was_alive())
return false;
// The Gpu process is invalid if it's not using software, the card is
@@ -247,7 +245,8 @@ GpuProcessHost* GpuProcessHost::FromID(int host_id) {
}
GpuProcessHost::GpuProcessHost(int host_id)
- : host_id_(host_id),
+ : BrowserChildProcessHost(content::PROCESS_TYPE_GPU),
+ host_id_(host_id),
gpu_process_(base::kNullProcessHandle),
in_process_(false),
software_rendering_(false) {
@@ -270,8 +269,6 @@ GpuProcessHost::GpuProcessHost(int host_id)
BrowserThread::UI,
FROM_HERE,
base::Bind(base::IgnoreResult(&GpuProcessHostUIShim::Create), host_id));
-
- process_.reset(new BrowserChildProcessHost(content::PROCESS_TYPE_GPU, this));
}
GpuProcessHost::~GpuProcessHost() {
@@ -283,7 +280,7 @@ GpuProcessHost::~GpuProcessHost() {
GPU_PROCESS_LIFETIME_EVENT_MAX);
int exit_code;
- base::TerminationStatus status = process_->GetTerminationStatus(&exit_code);
+ base::TerminationStatus status = GetChildTerminationStatus(&exit_code);
UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessTerminationStatus",
status,
base::TERMINATION_STATUS_MAX_ENUM);
@@ -314,7 +311,7 @@ GpuProcessHost::~GpuProcessHost() {
}
bool GpuProcessHost::Init() {
- std::string channel_id = process_->GetHost()->CreateChannel();
+ std::string channel_id = child_process_host()->CreateChannel();
if (channel_id.empty())
return false;
@@ -353,12 +350,12 @@ void GpuProcessHost::RouteOnUIThread(const IPC::Message& message) {
bool GpuProcessHost::Send(IPC::Message* msg) {
DCHECK(CalledOnValidThread());
- if (process_->GetHost()->IsChannelOpening()) {
+ if (child_process_host()->IsChannelOpening()) {
queued_messages_.push(msg);
return true;
}
- return process_->Send(msg);
+ return BrowserChildProcessHost::Send(msg);
}
bool GpuProcessHost::OnMessageReceived(const IPC::Message& message) {
@@ -374,6 +371,7 @@ bool GpuProcessHost::OnMessageReceived(const IPC::Message& message) {
}
void GpuProcessHost::OnChannelConnected(int32 peer_pid) {
+ BrowserChildProcessHost::OnChannelConnected(peer_pid);
while (!queued_messages_.empty()) {
Send(queued_messages_.front());
queued_messages_.pop();
@@ -491,7 +489,7 @@ void GpuProcessHost::OnProcessLaunched() {
// to such requests require that the GPU process handle be known.
base::ProcessHandle child_handle = in_process_ ?
- base::GetCurrentProcessHandle() : process_->GetData().handle;
+ base::GetCurrentProcessHandle() : data().handle;
#if defined(OS_WIN)
DuplicateHandle(base::GetCurrentProcessHandle(),
@@ -512,6 +510,7 @@ void GpuProcessHost::OnProcessCrashed(int exit_code) {
// The gpu process is too unstable to use. Disable it for current session.
gpu_enabled_ = false;
}
+ BrowserChildProcessHost::OnProcessCrashed(exit_code);
}
bool GpuProcessHost::software_rendering() {
@@ -520,7 +519,7 @@ bool GpuProcessHost::software_rendering() {
void GpuProcessHost::ForceShutdown() {
g_hosts_by_id.Pointer()->Remove(host_id_);
- process_->ForceShutdown();
+ BrowserChildProcessHost::ForceShutdown();
}
bool GpuProcessHost::LaunchGpuProcess(const std::string& channel_id) {
@@ -590,7 +589,7 @@ bool GpuProcessHost::LaunchGpuProcess(const std::string& channel_id) {
if (!gpu_launcher.empty())
cmd_line->PrependWrapper(gpu_launcher);
- process_->Launch(
+ Launch(
#if defined(OS_WIN)
FilePath(),
#elif defined(OS_POSIX)
diff --git a/content/browser/gpu/gpu_process_host.h b/content/browser/gpu/gpu_process_host.h
index 51245d7..29ec0df 100644
--- a/content/browser/gpu/gpu_process_host.h
+++ b/content/browser/gpu/gpu_process_host.h
@@ -11,22 +11,22 @@
#include "base/callback.h"
#include "base/memory/linked_ptr.h"
-#include "base/process.h"
#include "base/threading/non_thread_safe.h"
+#include "content/browser/browser_child_process_host.h"
#include "content/common/content_export.h"
#include "content/common/gpu/gpu_process_launch_causes.h"
-#include "content/public/browser/browser_child_process_host_delegate.h"
#include "content/public/common/gpu_info.h"
-#include "ipc/ipc_message.h"
#include "ui/gfx/native_widget_types.h"
-class GpuMainThread;
struct GPUCreateCommandBufferConfig;
-class BrowserChildProcessHost;
+namespace IPC {
+class Message;
+}
+
+class GpuMainThread;
-class GpuProcessHost : public content::BrowserChildProcessHostDelegate,
- public IPC::Message::Sender,
+class GpuProcessHost : public BrowserChildProcessHost,
public base::NonThreadSafe {
public:
static bool gpu_enabled() { return gpu_enabled_; }
@@ -52,9 +52,12 @@ class GpuProcessHost : public content::BrowserChildProcessHostDelegate,
static GpuProcessHost* FromID(int host_id);
int host_id() const { return host_id_; }
- // IPC::Message::Sender implementation:
virtual bool Send(IPC::Message* msg) OVERRIDE;
+ // ChildProcessHost implementation.
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+ virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
+
typedef base::Callback<void(const IPC::ChannelHandle&,
base::ProcessHandle,
const content::GPUInfo&)>
@@ -83,8 +86,6 @@ class GpuProcessHost : public content::BrowserChildProcessHostDelegate,
void ForceShutdown();
private:
- static bool HostIsValid(GpuProcessHost* host);
-
GpuProcessHost(int host_id);
virtual ~GpuProcessHost();
@@ -93,9 +94,6 @@ class GpuProcessHost : public content::BrowserChildProcessHostDelegate,
// Post an IPC message to the UI shim's message handler on the UI thread.
void RouteOnUIThread(const IPC::Message& message);
- // BrowserChildProcessHostDelegate implementation.
- virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
- virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
virtual void OnProcessLaunched() OVERRIDE;
virtual void OnProcessCrashed(int exit_code) OVERRIDE;
@@ -157,8 +155,6 @@ class GpuProcessHost : public content::BrowserChildProcessHostDelegate,
// existing tabs, just the future ones.
CONTENT_EXPORT static bool gpu_enabled_;
- scoped_ptr<BrowserChildProcessHost> process_;
-
DISALLOW_COPY_AND_ASSIGN(GpuProcessHost);
};
diff --git a/content/browser/plugin_process_host.cc b/content/browser/plugin_process_host.cc
index d15ffbd..cd8fb88 100644
--- a/content/browser/plugin_process_host.cc
+++ b/content/browser/plugin_process_host.cc
@@ -21,7 +21,6 @@
#include "base/path_service.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
-#include "content/browser/browser_child_process_host.h"
#include "content/browser/plugin_service_impl.h"
#include "content/common/child_process_host_impl.h"
#include "content/common/plugin_messages.h"
@@ -37,7 +36,6 @@
#include "ui/gfx/native_widget_types.h"
using content::BrowserThread;
-using content::ChildProcessData;
using content::ChildProcessHost;
#if defined(USE_X11)
@@ -93,7 +91,7 @@ void PluginProcessHost::OnReparentPluginWindow(HWND window, HWND parent) {
// Reparent only from the plugin process to our process.
DWORD process_id = 0;
::GetWindowThreadProcessId(window, &process_id);
- if (process_id != ::GetProcessId(process_->GetHandle()))
+ if (process_id != ::GetProcessId(GetChildProcessHandle()))
return;
::GetWindowThreadProcessId(parent, &process_id);
if (process_id != ::GetCurrentProcessId())
@@ -116,12 +114,11 @@ void PluginProcessHost::OnMapNativeViewId(gfx::NativeViewId id,
#endif // defined(TOOLKIT_USES_GTK)
PluginProcessHost::PluginProcessHost()
+ : BrowserChildProcessHost(content::PROCESS_TYPE_PLUGIN)
#if defined(OS_MACOSX)
- : plugin_cursor_visible_(true)
+ , plugin_cursor_visible_(true)
#endif
{
- process_.reset(new BrowserChildProcessHost(
- content::PROCESS_TYPE_PLUGIN, this));
}
PluginProcessHost::~PluginProcessHost() {
@@ -167,15 +164,11 @@ PluginProcessHost::~PluginProcessHost() {
CancelRequests();
}
-bool PluginProcessHost::Send(IPC::Message* message) {
- return process_->Send(message);
-}
-
bool PluginProcessHost::Init(const webkit::WebPluginInfo& info) {
info_ = info;
- process_->SetName(info_.name);
+ SetName(info_.name);
- std::string channel_id = process_->GetHost()->CreateChannel();
+ std::string channel_id = child_process_host()->CreateChannel();
if (channel_id.empty())
return false;
@@ -265,7 +258,7 @@ bool PluginProcessHost::Init(const webkit::WebPluginInfo& info) {
#endif
#endif
- process_->Launch(
+ Launch(
#if defined(OS_WIN)
FilePath(),
#elif defined(OS_POSIX)
@@ -278,7 +271,7 @@ bool PluginProcessHost::Init(const webkit::WebPluginInfo& info) {
// called on the plugin. The plugin process exits when it receives the
// OnChannelError notification indicating that the browser plugin channel has
// been destroyed.
- process_->SetTerminateChildOnShutdown(false);
+ SetTerminateChildOnShutdown(false);
content::GetContentClient()->browser()->PluginProcessHostCreated(this);
@@ -288,11 +281,11 @@ bool PluginProcessHost::Init(const webkit::WebPluginInfo& info) {
void PluginProcessHost::ForceShutdown() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
Send(new PluginProcessMsg_NotifyRenderersOfPendingShutdown());
- process_->ForceShutdown();
+ BrowserChildProcessHost::ForceShutdown();
}
void PluginProcessHost::AddFilter(IPC::ChannelProxy::MessageFilter* filter) {
- process_->GetHost()->AddFilter(filter);
+ child_process_host()->AddFilter(filter);
}
bool PluginProcessHost::OnMessageReceived(const IPC::Message& msg) {
@@ -327,6 +320,7 @@ bool PluginProcessHost::OnMessageReceived(const IPC::Message& msg) {
}
void PluginProcessHost::OnChannelConnected(int32 peer_pid) {
+ BrowserChildProcessHost::OnChannelConnected(peer_pid);
for (size_t i = 0; i < pending_requests_.size(); ++i) {
RequestPluginChannel(pending_requests_[i]);
}
@@ -358,8 +352,9 @@ void PluginProcessHost::CancelRequests() {
// static
void PluginProcessHost::CancelPendingRequestsForResourceContext(
const content::ResourceContext* context) {
- for (PluginProcessHostIterator host_it; !host_it.Done(); ++host_it) {
- PluginProcessHost* host = *host_it;
+ for (BrowserChildProcessHost::Iterator host_it(content::PROCESS_TYPE_PLUGIN);
+ !host_it.Done(); ++host_it) {
+ PluginProcessHost* host = static_cast<PluginProcessHost*>(*host_it);
for (size_t i = 0; i < host->pending_requests_.size(); ++i) {
if (&host->pending_requests_[i]->GetResourceContext() == context) {
host->pending_requests_[i]->OnError();
@@ -371,9 +366,9 @@ void PluginProcessHost::CancelPendingRequestsForResourceContext(
}
void PluginProcessHost::OpenChannelToPlugin(Client* client) {
- process_->Notify(content::NOTIFICATION_CHILD_INSTANCE_CREATED);
+ Notify(content::NOTIFICATION_CHILD_INSTANCE_CREATED);
client->SetPluginInfo(info_);
- if (process_->GetHost()->IsChannelOpening()) {
+ if (child_process_host()->IsChannelOpening()) {
// The channel is already in the process of being opened. Put
// this "open channel" request into a queue of requests that will
// be run once the channel is open.
diff --git a/content/browser/plugin_process_host.h b/content/browser/plugin_process_host.h
index cc24e5f..2fabe64 100644
--- a/content/browser/plugin_process_host.h
+++ b/content/browser/plugin_process_host.h
@@ -14,17 +14,13 @@
#include <vector>
#include "base/basictypes.h"
-#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
+#include "content/browser/browser_child_process_host.h"
#include "content/common/content_export.h"
-#include "content/public/browser/browser_child_process_host_delegate.h"
-#include "content/public/browser/browser_child_process_host_iterator.h"
#include "ipc/ipc_channel_proxy.h"
#include "webkit/plugins/webplugininfo.h"
#include "ui/gfx/native_widget_types.h"
-class BrowserChildProcessHost;
-
namespace content {
class ResourceContext;
}
@@ -45,9 +41,7 @@ struct ChannelHandle;
// starting the plugin process when a plugin is created that doesn't already
// have a process. After that, most of the communication is directly between
// the renderer and plugin processes.
-class CONTENT_EXPORT PluginProcessHost
- : public content::BrowserChildProcessHostDelegate,
- public IPC::Message::Sender {
+class CONTENT_EXPORT PluginProcessHost : public BrowserChildProcessHost {
public:
class Client {
public:
@@ -71,9 +65,6 @@ class CONTENT_EXPORT PluginProcessHost
PluginProcessHost();
virtual ~PluginProcessHost();
- // IPC::Message::Sender implementation:
- virtual bool Send(IPC::Message* message) OVERRIDE;
-
// Initialize the new plugin process, returning true on success. This must
// be called before the object can be used.
bool Init(const webkit::WebPluginInfo& info);
@@ -178,17 +169,7 @@ class CONTENT_EXPORT PluginProcessHost
bool plugin_cursor_visible_;
#endif
- scoped_ptr<BrowserChildProcessHost> process_;
-
DISALLOW_COPY_AND_ASSIGN(PluginProcessHost);
};
-class PluginProcessHostIterator
- : public content::BrowserChildProcessHostTypeIterator<PluginProcessHost> {
- public:
- PluginProcessHostIterator()
- : content::BrowserChildProcessHostTypeIterator<PluginProcessHost>(
- content::PROCESS_TYPE_PLUGIN) {}
-};
-
#endif // CONTENT_BROWSER_PLUGIN_PROCESS_HOST_H_
diff --git a/content/browser/plugin_process_host_mac.cc b/content/browser/plugin_process_host_mac.cc
index 883d301..91314b1 100644
--- a/content/browser/plugin_process_host_mac.cc
+++ b/content/browser/plugin_process_host_mac.cc
@@ -11,12 +11,9 @@
#include "base/bind.h"
#include "base/logging.h"
#include "base/mac/mac_util.h"
-#include "base/process_util.h"
-#include "content/browser/browser_child_process_host.h"
#include "content/browser/plugin_process_host.h"
#include "content/common/plugin_messages.h"
#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/child_process_data.h"
#include "ui/gfx/rect.h"
using content::BrowserThread;
@@ -78,8 +75,7 @@ void PluginProcessHost::OnPluginHideWindow(uint32 window_id,
if (plugin_fullscreen_windows_set_.find(window_id) !=
plugin_fullscreen_windows_set_.end()) {
plugin_fullscreen_windows_set_.erase(window_id);
- pid_t plugin_pid =
- browser_needs_activation ? -1 : process_->GetData().handle;
+ pid_t plugin_pid = browser_needs_activation ? -1 : data().handle;
browser_needs_activation = false;
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::Bind(ReleasePluginFullScreen, plugin_pid));
@@ -100,7 +96,7 @@ void PluginProcessHost::OnAppActivation() {
if (!plugin_modal_windows_set_.empty()) {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
- base::Bind(base::mac::ActivateProcess, process_->GetData().handle));
+ base::Bind(base::mac::ActivateProcess, data().handle));
}
}
diff --git a/content/browser/plugin_service_impl.cc b/content/browser/plugin_service_impl.cc
index cdb4db9..84734d5f 100644
--- a/content/browser/plugin_service_impl.cc
+++ b/content/browser/plugin_service_impl.cc
@@ -82,8 +82,12 @@ void WillLoadPluginsCallback() {
static void NotifyPluginsOfActivation() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- for (PluginProcessHostIterator iter; !iter.Done(); ++iter)
- iter->OnAppActivation();
+ for (BrowserChildProcessHost::Iterator iter(
+ content::PROCESS_TYPE_PLUGIN);
+ !iter.Done(); ++iter) {
+ PluginProcessHost* plugin = static_cast<PluginProcessHost*>(*iter);
+ plugin->OnAppActivation();
+ }
}
#endif
#if defined(OS_POSIX) && !defined(OS_OPENBSD)
@@ -227,9 +231,13 @@ void PluginServiceImpl::StartWatchingPlugins() {
PluginProcessHost* PluginServiceImpl::FindNpapiPluginProcess(
const FilePath& plugin_path) {
- for (PluginProcessHostIterator iter; !iter.Done(); ++iter) {
- if (iter->info().path == plugin_path)
- return *iter;
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ for (BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_PLUGIN);
+ !iter.Done(); ++iter) {
+ PluginProcessHost* plugin = static_cast<PluginProcessHost*>(*iter);
+ if (plugin->info().path == plugin_path)
+ return plugin;
}
return NULL;
@@ -237,9 +245,15 @@ PluginProcessHost* PluginServiceImpl::FindNpapiPluginProcess(
PpapiPluginProcessHost* PluginServiceImpl::FindPpapiPluginProcess(
const FilePath& plugin_path) {
- for (PpapiPluginProcessHostIterator iter; !iter.Done(); ++iter) {
- if (iter->plugin_path() == plugin_path)
- return *iter;
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ for (BrowserChildProcessHost::Iterator iter(
+ content::PROCESS_TYPE_PPAPI_PLUGIN);
+ !iter.Done(); ++iter) {
+ PpapiPluginProcessHost* plugin =
+ static_cast<PpapiPluginProcessHost*>(*iter);
+ if (plugin->plugin_path() == plugin_path)
+ return plugin;
}
return NULL;
@@ -247,9 +261,15 @@ PpapiPluginProcessHost* PluginServiceImpl::FindPpapiPluginProcess(
PpapiPluginProcessHost* PluginServiceImpl::FindPpapiBrokerProcess(
const FilePath& broker_path) {
- for (PpapiBrokerProcessHostIterator iter; !iter.Done(); ++iter) {
- if (iter->plugin_path() == broker_path)
- return *iter;
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ for (BrowserChildProcessHost::Iterator iter(
+ content::PROCESS_TYPE_PPAPI_BROKER);
+ !iter.Done(); ++iter) {
+ PpapiPluginProcessHost* broker =
+ static_cast<PpapiPluginProcessHost*>(*iter);
+ if (broker->plugin_path() == broker_path)
+ return broker;
}
return NULL;
diff --git a/content/browser/ppapi_plugin_process_host.cc b/content/browser/ppapi_plugin_process_host.cc
index 9ca0019..96b5029 100644
--- a/content/browser/ppapi_plugin_process_host.cc
+++ b/content/browser/ppapi_plugin_process_host.cc
@@ -9,7 +9,6 @@
#include "base/file_path.h"
#include "base/process_util.h"
#include "base/utf_string_conversions.h"
-#include "content/browser/browser_child_process_host.h"
#include "content/browser/plugin_service_impl.h"
#include "content/browser/renderer_host/render_message_filter.h"
#include "content/common/child_process_host_impl.h"
@@ -88,12 +87,8 @@ PpapiPluginProcessHost* PpapiPluginProcessHost::CreateBrokerHost(
return NULL;
}
-bool PpapiPluginProcessHost::Send(IPC::Message* message) {
- return process_->Send(message);
-}
-
void PpapiPluginProcessHost::OpenChannelToPlugin(Client* client) {
- if (process_->GetHost()->IsChannelOpening()) {
+ if (child_process_host()->IsChannelOpening()) {
// The channel is already in the process of being opened. Put
// this "open channel" request into a queue of requests that will
// be run once the channel is open.
@@ -106,31 +101,29 @@ void PpapiPluginProcessHost::OpenChannelToPlugin(Client* client) {
}
PpapiPluginProcessHost::PpapiPluginProcessHost(net::HostResolver* host_resolver)
- : filter_(new PepperMessageFilter(host_resolver)),
+ : BrowserChildProcessHost(content::PROCESS_TYPE_PPAPI_PLUGIN),
+ filter_(new PepperMessageFilter(host_resolver)),
network_observer_(new PluginNetworkObserver(this)),
is_broker_(false),
process_id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()) {
- process_.reset(new BrowserChildProcessHost(
- content::PROCESS_TYPE_PPAPI_PLUGIN, this));
- process_->GetHost()->AddFilter(filter_.get());
+ child_process_host()->AddFilter(filter_.get());
}
PpapiPluginProcessHost::PpapiPluginProcessHost()
- : is_broker_(true),
+ : BrowserChildProcessHost(content::PROCESS_TYPE_PPAPI_BROKER),
+ is_broker_(true),
process_id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()) {
- process_.reset(new BrowserChildProcessHost(
- content::PROCESS_TYPE_PPAPI_BROKER, this));
}
bool PpapiPluginProcessHost::Init(const content::PepperPluginInfo& info) {
plugin_path_ = info.path;
if (info.name.empty()) {
- process_->SetName(plugin_path_.BaseName().LossyDisplayName());
+ SetName(plugin_path_.BaseName().LossyDisplayName());
} else {
- process_->SetName(UTF8ToUTF16(info.name));
+ SetName(UTF8ToUTF16(info.name));
}
- std::string channel_id = process_->GetHost()->CreateChannel();
+ std::string channel_id = child_process_host()->CreateChannel();
if (channel_id.empty())
return false;
@@ -183,7 +176,7 @@ bool PpapiPluginProcessHost::Init(const content::PepperPluginInfo& info) {
#if defined(OS_POSIX)
bool use_zygote = !is_broker_ && plugin_launcher.empty() && info.is_sandboxed;
#endif // OS_POSIX
- process_->Launch(
+ Launch(
#if defined(OS_WIN)
FilePath(),
#elif defined(OS_POSIX)
@@ -226,6 +219,7 @@ bool PpapiPluginProcessHost::OnMessageReceived(const IPC::Message& msg) {
// Called when the browser <--> plugin channel has been established.
void PpapiPluginProcessHost::OnChannelConnected(int32 peer_pid) {
+ BrowserChildProcessHost::OnChannelConnected(peer_pid);
// This will actually load the plugin. Errors will actually not be reported
// back at this point. Instead, the plugin will fail to establish the
// connections when we request them on behalf of the renderer(s).
@@ -277,7 +271,7 @@ void PpapiPluginProcessHost::OnRendererPluginChannelCreated(
sent_requests_.pop();
// Prepare the handle to send to the renderer.
- base::ProcessHandle plugin_process = process_->GetHandle();
+ base::ProcessHandle plugin_process = GetChildProcessHandle();
#if defined(OS_WIN)
base::ProcessHandle renderer_process;
int renderer_id;
diff --git a/content/browser/ppapi_plugin_process_host.h b/content/browser/ppapi_plugin_process_host.h
index 0a37360..f92aa1d 100644
--- a/content/browser/ppapi_plugin_process_host.h
+++ b/content/browser/ppapi_plugin_process_host.h
@@ -12,12 +12,8 @@
#include "base/file_path.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/ref_counted.h"
+#include "content/browser/browser_child_process_host.h"
#include "content/browser/renderer_host/pepper_message_filter.h"
-#include "content/public/browser/browser_child_process_host_delegate.h"
-#include "content/public/browser/browser_child_process_host_iterator.h"
-#include "ipc/ipc_message.h"
-
-class BrowserChildProcessHost;
namespace content {
struct PepperPluginInfo;
@@ -30,8 +26,8 @@ class HostResolver;
// Process host for PPAPI plugin and broker processes.
// When used for the broker, interpret all references to "plugin" with "broker".
-class PpapiPluginProcessHost : public content::BrowserChildProcessHostDelegate,
- public IPC::Message::Sender {
+class PpapiPluginProcessHost
+ : public BrowserChildProcessHost {
public:
class Client {
public:
@@ -64,9 +60,6 @@ class PpapiPluginProcessHost : public content::BrowserChildProcessHostDelegate,
static PpapiPluginProcessHost* CreateBrokerHost(
const content::PepperPluginInfo& info);
- // IPC::Message::Sender implementation:
- virtual bool Send(IPC::Message* message) OVERRIDE;
-
// Opens a new channel to the plugin. The client will be notified when the
// channel is ready or if there's an error.
void OpenChannelToPlugin(Client* client);
@@ -122,28 +115,8 @@ class PpapiPluginProcessHost : public content::BrowserChildProcessHostDelegate,
// The unique id created for the process.
int process_id_;
- scoped_ptr<BrowserChildProcessHost> process_;
-
DISALLOW_COPY_AND_ASSIGN(PpapiPluginProcessHost);
};
-class PpapiPluginProcessHostIterator
- : public content::BrowserChildProcessHostTypeIterator<
- PpapiPluginProcessHost> {
- public:
- PpapiPluginProcessHostIterator()
- : content::BrowserChildProcessHostTypeIterator<
- PpapiPluginProcessHost>(content::PROCESS_TYPE_PPAPI_PLUGIN) {}
-};
-
-class PpapiBrokerProcessHostIterator
- : public content::BrowserChildProcessHostTypeIterator<
- PpapiPluginProcessHost> {
- public:
- PpapiBrokerProcessHostIterator()
- : content::BrowserChildProcessHostTypeIterator<
- PpapiPluginProcessHost>(content::PROCESS_TYPE_PPAPI_BROKER) {}
-};
-
#endif // CONTENT_BROWSER_PPAPI_PLUGIN_PROCESS_HOST_H_
diff --git a/content/browser/profiler_controller_impl.cc b/content/browser/profiler_controller_impl.cc
index 1954da8..4b55357 100644
--- a/content/browser/profiler_controller_impl.cc
+++ b/content/browser/profiler_controller_impl.cc
@@ -6,15 +6,13 @@
#include "base/bind.h"
#include "base/values.h"
+#include "content/browser/browser_child_process_host.h"
#include "content/common/child_process_messages.h"
-#include "content/public/browser/browser_child_process_host_iterator.h"
#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/child_process_data.h"
#include "content/public/browser/profiler_subscriber.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/common/process_type.h"
-using content::BrowserChildProcessHostIterator;
using content::BrowserThread;
namespace content {
@@ -75,12 +73,13 @@ void ProfilerControllerImpl::GetProfilerDataFromChildProcesses(
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
int pending_processes = 0;
- for (BrowserChildProcessHostIterator iter; !iter.Done(); ++iter) {
+ for (BrowserChildProcessHost::Iterator child_process_host;
+ !child_process_host.Done(); ++child_process_host) {
const std::string process_type =
- content::GetProcessTypeNameInEnglish(iter.GetData().type);
+ content::GetProcessTypeNameInEnglish(child_process_host->data().type);
++pending_processes;
- if (!iter.Send(new ChildProcessMsg_GetChildProfilerData(
- sequence_number, process_type))) {
+ if (!child_process_host->Send(new ChildProcessMsg_GetChildProfilerData(
+ sequence_number, process_type))) {
--pending_processes;
}
}
@@ -124,8 +123,10 @@ void ProfilerControllerImpl::GetProfilerData(int sequence_number) {
void ProfilerControllerImpl::SetProfilerStatusInChildProcesses(bool enable) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- for (BrowserChildProcessHostIterator iter; !iter.Done(); ++iter)
- iter.Send(new ChildProcessMsg_SetProfilerStatus(enable));
+ for (BrowserChildProcessHost::Iterator child_process_host;
+ !child_process_host.Done(); ++child_process_host) {
+ child_process_host->Send(new ChildProcessMsg_SetProfilerStatus(enable));
+ }
}
void ProfilerControllerImpl::SetProfilerStatus(bool enable) {
diff --git a/content/browser/renderer_host/gpu_message_filter.cc b/content/browser/renderer_host/gpu_message_filter.cc
index efb5374..14b3b50 100644
--- a/content/browser/renderer_host/gpu_message_filter.cc
+++ b/content/browser/renderer_host/gpu_message_filter.cc
@@ -9,7 +9,6 @@
#include "content/browser/renderer_host/gpu_message_filter.h"
#include "base/bind.h"
-#include "base/process_util.h"
#include "content/browser/gpu/gpu_process_host.h"
#include "content/browser/gpu/gpu_surface_tracker.h"
#include "content/browser/renderer_host/render_widget_helper.h"
diff --git a/content/browser/renderer_host/render_widget_host_view_win.cc b/content/browser/renderer_host/render_widget_host_view_win.cc
index 706211e..87866b2 100644
--- a/content/browser/renderer_host/render_widget_host_view_win.cc
+++ b/content/browser/renderer_host/render_widget_host_view_win.cc
@@ -32,7 +32,6 @@
#include "content/common/plugin_messages.h"
#include "content/common/view_messages.h"
#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/child_process_data.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/native_web_keyboard_event.h"
#include "content/public/browser/notification_service.h"
@@ -129,13 +128,15 @@ void NotifyPluginProcessHostHelper(HWND window, HWND parent, int tries) {
DWORD plugin_process_id;
bool found_starting_plugin_process = false;
GetWindowThreadProcessId(window, &plugin_process_id);
- for (PluginProcessHostIterator iter; !iter.Done(); ++iter) {
- if (!iter.GetData().handle) {
+ for (BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_PLUGIN);
+ !iter.Done(); ++iter) {
+ PluginProcessHost* plugin = static_cast<PluginProcessHost*>(*iter);
+ if (!plugin->data().handle) {
found_starting_plugin_process = true;
continue;
}
- if (base::GetProcId(iter.GetData().handle) == plugin_process_id) {
- iter->AddWindow(parent);
+ if (base::GetProcId(plugin->data().handle) == plugin_process_id) {
+ plugin->AddWindow(parent);
return;
}
}
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc
index 2c225af..68db20a 100644
--- a/content/browser/utility_process_host.cc
+++ b/content/browser/utility_process_host.cc
@@ -9,7 +9,6 @@
#include "base/command_line.h"
#include "base/message_loop.h"
#include "base/utf_string_conversions.h"
-#include "content/browser/browser_child_process_host.h"
#include "content/common/child_process_host_impl.h"
#include "content/common/utility_messages.h"
#include "content/public/browser/content_browser_client.h"
@@ -37,7 +36,8 @@ bool UtilityProcessHost::Client::OnMessageReceived(
UtilityProcessHost::UtilityProcessHost(Client* client,
BrowserThread::ID client_thread_id)
- : client_(client),
+ : BrowserChildProcessHost(content::PROCESS_TYPE_UTILITY),
+ client_(client),
client_thread_id_(client_thread_id),
is_batch_mode_(false),
no_sandbox_(false),
@@ -48,8 +48,6 @@ UtilityProcessHost::UtilityProcessHost(Client* client,
#endif
use_linux_zygote_(false),
started_(false) {
- process_.reset(new BrowserChildProcessHost(
- content::PROCESS_TYPE_UTILITY, this));
}
UtilityProcessHost::~UtilityProcessHost() {
@@ -60,7 +58,7 @@ bool UtilityProcessHost::Send(IPC::Message* message) {
if (!StartProcess())
return false;
- return process_->Send(message);
+ return BrowserChildProcessHost::Send(message);
}
bool UtilityProcessHost::StartBatchMode() {
@@ -89,9 +87,9 @@ bool UtilityProcessHost::StartProcess() {
return true;
// Name must be set or metrics_service will crash in any test which
// launches a UtilityProcessHost.
- process_->SetName(ASCIIToUTF16("utility process"));
+ SetName(ASCIIToUTF16("utility process"));
- std::string channel_id = process_->GetHost()->CreateChannel();
+ std::string channel_id = child_process_host()->CreateChannel();
if (channel_id.empty())
return false;
@@ -138,7 +136,7 @@ bool UtilityProcessHost::StartProcess() {
use_zygote = !no_sandbox_ && use_linux_zygote_;
#endif
- process_->Launch(
+ Launch(
#if defined(OS_WIN)
exposed_dir_,
#elif defined(OS_POSIX)
diff --git a/content/browser/utility_process_host.h b/content/browser/utility_process_host.h
index cad678e..1481d44 100644
--- a/content/browser/utility_process_host.h
+++ b/content/browser/utility_process_host.h
@@ -12,12 +12,9 @@
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/process_util.h"
+#include "content/browser/browser_child_process_host.h"
#include "content/common/content_export.h"
-#include "content/public/browser/browser_child_process_host_delegate.h"
#include "content/public/browser/browser_thread.h"
-#include "ipc/ipc_message.h"
-
-class BrowserChildProcessHost;
// This class acts as the browser-side host to a utility child process. A
// utility process is a short-lived sandboxed process that is created to run
@@ -26,9 +23,7 @@ class BrowserChildProcessHost;
// If you need multiple batches of work to be done in the sandboxed process,
// use StartBatchMode(), then multiple calls to StartFooBar(p),
// then finish with EndBatchMode().
-class CONTENT_EXPORT UtilityProcessHost
- : public content::BrowserChildProcessHostDelegate,
- public IPC::Message::Sender {
+class CONTENT_EXPORT UtilityProcessHost : public BrowserChildProcessHost {
public:
// An interface to be implemented by consumers of the utility process to
// get results back. All functions are called on the thread passed along
@@ -58,7 +53,7 @@ class CONTENT_EXPORT UtilityProcessHost
content::BrowserThread::ID client_thread_id);
virtual ~UtilityProcessHost();
- // IPC::Message::Sender implementation:
+ // BrowserChildProcessHost override
virtual bool Send(IPC::Message* message) OVERRIDE;
// Starts utility process in batch mode. Caller must call EndBatchMode()
@@ -85,8 +80,10 @@ class CONTENT_EXPORT UtilityProcessHost
// has already been started via StartBatchMode().
bool StartProcess();
- // BrowserChildProcessHost:
+ // IPC messages:
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+
+ // BrowserChildProcessHost:
virtual void OnProcessCrashed(int exit_code) OVERRIDE;
// A pointer to our client interface, who will be informed of progress.
@@ -115,8 +112,6 @@ class CONTENT_EXPORT UtilityProcessHost
bool started_;
- scoped_ptr<BrowserChildProcessHost> process_;
-
DISALLOW_COPY_AND_ASSIGN(UtilityProcessHost);
};
diff --git a/content/browser/worker_host/worker_process_host.cc b/content/browser/worker_host/worker_process_host.cc
index 11b3464..875511d 100644
--- a/content/browser/worker_host/worker_process_host.cc
+++ b/content/browser/worker_host/worker_process_host.cc
@@ -16,7 +16,6 @@
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "content/browser/appcache/appcache_dispatcher_host.h"
-#include "content/browser/browser_child_process_host.h"
#include "content/browser/child_process_security_policy.h"
#include "content/browser/debugger/worker_devtools_message_filter.h"
#include "content/browser/file_system/file_system_dispatcher_host.h"
@@ -49,7 +48,6 @@
#include "webkit/glue/resource_type.h"
using content::BrowserThread;
-using content::ChildProcessData;
using content::ChildProcessHost;
using content::UserMetricsAction;
using content::WorkerServiceImpl;
@@ -88,11 +86,10 @@ void WorkerCrashCallback(int render_process_unique_id, int render_view_id) {
WorkerProcessHost::WorkerProcessHost(
const content::ResourceContext* resource_context)
- : resource_context_(resource_context) {
+ : BrowserChildProcessHost(content::PROCESS_TYPE_WORKER),
+ resource_context_(resource_context) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK(resource_context);
- process_.reset(new BrowserChildProcessHost(
- content::PROCESS_TYPE_WORKER, this));
}
WorkerProcessHost::~WorkerProcessHost() {
@@ -111,15 +108,11 @@ WorkerProcessHost::~WorkerProcessHost() {
this, i->worker_route_id());
}
- ChildProcessSecurityPolicy::GetInstance()->Remove(process_->GetData().id);
-}
-
-bool WorkerProcessHost::Send(IPC::Message* message) {
- return process_->Send(message);
+ ChildProcessSecurityPolicy::GetInstance()->Remove(data().id);
}
bool WorkerProcessHost::Init(int render_process_id) {
- std::string channel_id = process_->GetHost()->CreateChannel();
+ std::string channel_id = child_process_host()->CreateChannel();
if (channel_id.empty())
return false;
@@ -182,7 +175,7 @@ bool WorkerProcessHost::Init(int render_process_id) {
}
#endif
- process_->Launch(
+ Launch(
#if defined(OS_WIN)
FilePath(),
#elif defined(OS_POSIX)
@@ -192,7 +185,7 @@ bool WorkerProcessHost::Init(int render_process_id) {
cmd_line);
ChildProcessSecurityPolicy::GetInstance()->AddWorker(
- process_->GetData().id, render_process_id);
+ data().id, render_process_id);
if (!CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableFileSystem)) {
// Grant most file permissions to this worker.
@@ -201,7 +194,7 @@ bool WorkerProcessHost::Init(int render_process_id) {
// requests them.
// This is for the filesystem sandbox.
ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile(
- process_->GetData().id, resource_context_->file_system_context()->
+ data().id, resource_context_->file_system_context()->
sandbox_provider()->new_base_path(),
base::PLATFORM_FILE_OPEN |
base::PLATFORM_FILE_CREATE |
@@ -218,7 +211,7 @@ bool WorkerProcessHost::Init(int render_process_id) {
// This is so that we can read and move stuff out of the old filesystem
// sandbox.
ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile(
- process_->GetData().id, resource_context_->file_system_context()->
+ data().id, resource_context_->file_system_context()->
sandbox_provider()->old_base_path(),
base::PLATFORM_FILE_READ | base::PLATFORM_FILE_WRITE |
base::PLATFORM_FILE_WRITE_ATTRIBUTES |
@@ -226,7 +219,7 @@ bool WorkerProcessHost::Init(int render_process_id) {
// This is so that we can rename the old sandbox out of the way so that
// we know we've taken care of it.
ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile(
- process_->GetData().id, resource_context_->file_system_context()->
+ data().id, resource_context_->file_system_context()->
sandbox_provider()->renamed_old_base_path(),
base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_CREATE_ALWAYS |
base::PLATFORM_FILE_WRITE);
@@ -243,38 +236,37 @@ void WorkerProcessHost::CreateMessageFilters(int render_process_id) {
resource_context_->request_context();
ResourceMessageFilter* resource_message_filter = new ResourceMessageFilter(
- process_->GetData().id, content::PROCESS_TYPE_WORKER, resource_context_,
+ data().id, content::PROCESS_TYPE_WORKER, resource_context_,
new URLRequestContextSelector(request_context));
- process_->GetHost()->AddFilter(resource_message_filter);
+ child_process_host()->AddFilter(resource_message_filter);
worker_message_filter_ = new WorkerMessageFilter(
render_process_id, resource_context_,
base::Bind(&WorkerServiceImpl::next_worker_route_id,
base::Unretained(WorkerServiceImpl::GetInstance())));
- process_->GetHost()->AddFilter(worker_message_filter_);
- process_->GetHost()->AddFilter(new AppCacheDispatcherHost(
- resource_context_->appcache_service(), process_->GetData().id));
- process_->GetHost()->AddFilter(new FileSystemDispatcherHost(
+ child_process_host()->AddFilter(worker_message_filter_);
+ child_process_host()->AddFilter(new AppCacheDispatcherHost(
+ resource_context_->appcache_service(), data().id));
+ child_process_host()->AddFilter(new FileSystemDispatcherHost(
request_context, resource_context_->file_system_context()));
- process_->GetHost()->AddFilter(new FileUtilitiesMessageFilter(
- process_->GetData().id));
- process_->GetHost()->AddFilter(new BlobMessageFilter(
- process_->GetData().id, resource_context_->blob_storage_context()));
- process_->GetHost()->AddFilter(new MimeRegistryMessageFilter());
- process_->GetHost()->AddFilter(new DatabaseMessageFilter(
+ child_process_host()->AddFilter(new FileUtilitiesMessageFilter(data().id));
+ child_process_host()->AddFilter(new BlobMessageFilter(
+ data().id, resource_context_->blob_storage_context()));
+ child_process_host()->AddFilter(new MimeRegistryMessageFilter());
+ child_process_host()->AddFilter(new DatabaseMessageFilter(
resource_context_->database_tracker()));
SocketStreamDispatcherHost* socket_stream_dispatcher_host =
new SocketStreamDispatcherHost(
new URLRequestContextSelector(request_context), resource_context_);
- process_->GetHost()->AddFilter(socket_stream_dispatcher_host);
- process_->GetHost()->AddFilter(
- new content::WorkerDevToolsMessageFilter(process_->GetData().id));
+ child_process_host()->AddFilter(socket_stream_dispatcher_host);
+ child_process_host()->AddFilter(
+ new content::WorkerDevToolsMessageFilter(data().id));
}
void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) {
ChildProcessSecurityPolicy::GetInstance()->GrantRequestURL(
- process_->GetData().id, instance.url());
+ data().id, instance.url());
instances_.push_back(instance);
@@ -328,8 +320,7 @@ bool WorkerProcessHost::OnMessageReceived(const IPC::Message& message) {
NOTREACHED();
content::RecordAction(UserMetricsAction("BadMessageTerminate_WPH"));
base::KillProcess(
- process_->GetData().handle, content::RESULT_CODE_KILLED_BAD_MESSAGE,
- false);
+ data().handle, content::RESULT_CODE_KILLED_BAD_MESSAGE, false);
}
if (handled)
@@ -499,7 +490,7 @@ void WorkerProcessHost::UpdateTitle() {
display_title += *i;
}
- process_->SetName(ASCIIToUTF16(display_title));
+ SetName(ASCIIToUTF16(display_title));
}
void WorkerProcessHost::DocumentDetached(WorkerMessageFilter* filter,
@@ -521,10 +512,6 @@ void WorkerProcessHost::TerminateWorker(int worker_route_id) {
Send(new WorkerMsg_TerminateWorkerContext(worker_route_id));
}
-const ChildProcessData& WorkerProcessHost::GetData() {
- return process_->GetData();
-}
-
WorkerProcessHost::WorkerInstance::WorkerInstance(
const GURL& url,
const string16& name,
diff --git a/content/browser/worker_host/worker_process_host.h b/content/browser/worker_host/worker_process_host.h
index 57806c8..6ccc137 100644
--- a/content/browser/worker_host/worker_process_host.h
+++ b/content/browser/worker_host/worker_process_host.h
@@ -11,15 +11,10 @@
#include "base/basictypes.h"
#include "base/file_path.h"
-#include "base/memory/scoped_ptr.h"
+#include "content/browser/browser_child_process_host.h"
#include "content/common/content_export.h"
#include "content/browser/worker_host/worker_document_set.h"
-#include "content/public/browser/browser_child_process_host_delegate.h"
-#include "content/public/browser/browser_child_process_host_iterator.h"
#include "googleurl/src/gurl.h"
-#include "ipc/ipc_message.h"
-
-class BrowserChildProcessHost;
namespace content {
class ResourceContext;
@@ -32,8 +27,7 @@ class WorkerServiceImpl;
// process, but that may change. However, we do assume (by storing a
// net::URLRequestContext) that a WorkerProcessHost serves a single
// BrowserContext.
-class WorkerProcessHost : public content::BrowserChildProcessHostDelegate,
- public IPC::Message::Sender {
+class WorkerProcessHost : public BrowserChildProcessHost {
public:
// Contains information about each worker instance, needed to forward messages
// between the renderer and worker processes.
@@ -116,9 +110,6 @@ class WorkerProcessHost : public content::BrowserChildProcessHostDelegate,
explicit WorkerProcessHost(const content::ResourceContext* resource_context);
virtual ~WorkerProcessHost();
- // IPC::Message::Sender implementation:
- virtual bool Send(IPC::Message* message) OVERRIDE;
-
// Starts the process. Returns true iff it succeeded.
// |render_process_id| is the renderer process responsible for starting this
// worker.
@@ -141,8 +132,6 @@ class WorkerProcessHost : public content::BrowserChildProcessHostDelegate,
// Terminates the given worker, i.e. based on a UI action.
CONTENT_EXPORT void TerminateWorker(int worker_route_id);
- CONTENT_EXPORT const content::ChildProcessData& GetData();
-
typedef std::list<WorkerInstance> Instances;
const Instances& instances() const { return instances_; }
@@ -156,13 +145,16 @@ class WorkerProcessHost : public content::BrowserChildProcessHostDelegate,
Instances& mutable_instances() { return instances_; }
private:
- // BrowserChildProcessHostDelegate implementation:
+ // Called when the process has been launched successfully.
virtual void OnProcessLaunched() OVERRIDE;
- virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
// Creates and adds the message filters.
void CreateMessageFilters(int render_process_id);
+ // IPC::Channel::Listener implementation:
+ // Called when a message arrives from the worker process.
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+
void OnWorkerContextClosed(int worker_route_id);
void OnAllowDatabase(int worker_route_id,
const GURL& url,
@@ -194,18 +186,7 @@ class WorkerProcessHost : public content::BrowserChildProcessHostDelegate,
// process.
scoped_refptr<WorkerMessageFilter> worker_message_filter_;
- scoped_ptr<BrowserChildProcessHost> process_;
-
DISALLOW_COPY_AND_ASSIGN(WorkerProcessHost);
};
-class WorkerProcessHostIterator
- : public content::BrowserChildProcessHostTypeIterator<WorkerProcessHost> {
- public:
- WorkerProcessHostIterator()
- : content::BrowserChildProcessHostTypeIterator<WorkerProcessHost>(
- content::PROCESS_TYPE_WORKER) {
- }
-};
-
#endif // CONTENT_BROWSER_WORKER_HOST_WORKER_PROCESS_HOST_H_
diff --git a/content/browser/worker_host/worker_service_impl.cc b/content/browser/worker_host/worker_service_impl.cc
index bddd74e..9686152 100644
--- a/content/browser/worker_host/worker_service_impl.cc
+++ b/content/browser/worker_host/worker_service_impl.cc
@@ -15,7 +15,6 @@
#include "content/browser/worker_host/worker_process_host.h"
#include "content/common/view_messages.h"
#include "content/common/worker_messages.h"
-#include "content/public/browser/child_process_data.h"
#include "content/public/browser/worker_service_observer.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/process_type.h"
@@ -46,8 +45,10 @@ WorkerServiceImpl::~WorkerServiceImpl() {
void WorkerServiceImpl::OnWorkerMessageFilterClosing(
WorkerMessageFilter* filter) {
- for (WorkerProcessHostIterator iter; !iter.Done(); ++iter) {
- iter->FilterShutdown(filter);
+ for (BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_WORKER);
+ !iter.Done(); ++iter) {
+ WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
+ worker->FilterShutdown(filter);
}
// See if that process had any queued workers.
@@ -155,8 +156,10 @@ void WorkerServiceImpl::CancelCreateDedicatedWorker(
void WorkerServiceImpl::ForwardToWorker(const IPC::Message& message,
WorkerMessageFilter* filter) {
- for (WorkerProcessHostIterator iter; !iter.Done(); ++iter) {
- if (iter->FilterMessage(message, filter))
+ for (BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_WORKER);
+ !iter.Done(); ++iter) {
+ WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
+ if (worker->FilterMessage(message, filter))
return;
}
@@ -166,8 +169,11 @@ void WorkerServiceImpl::ForwardToWorker(const IPC::Message& message,
void WorkerServiceImpl::DocumentDetached(unsigned long long document_id,
WorkerMessageFilter* filter) {
// Any associated shared workers can be shut down.
- for (WorkerProcessHostIterator iter; !iter.Done(); ++iter)
- iter->DocumentDetached(filter, document_id);
+ for (BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_WORKER);
+ !iter.Done(); ++iter) {
+ WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
+ worker->DocumentDetached(filter, document_id);
+ }
// Remove any queued shared workers for this document.
for (WorkerProcessHost::Instances::iterator iter = queued_workers_.begin();
@@ -303,14 +309,16 @@ WorkerProcessHost* WorkerServiceImpl::GetProcessForDomain(const GURL& url) {
int num_processes = 0;
std::string domain =
net::RegistryControlledDomainService::GetDomainAndRegistry(url);
- for (WorkerProcessHostIterator iter; !iter.Done(); ++iter) {
+ for (BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_WORKER);
+ !iter.Done(); ++iter) {
num_processes++;
+ WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
for (WorkerProcessHost::Instances::const_iterator instance =
- iter->instances().begin();
- instance != iter->instances().end(); ++instance) {
+ worker->instances().begin();
+ instance != worker->instances().end(); ++instance) {
if (net::RegistryControlledDomainService::GetDomainAndRegistry(
instance->url()) == domain) {
- return *iter;
+ return worker;
}
}
}
@@ -323,7 +331,8 @@ WorkerProcessHost* WorkerServiceImpl::GetProcessForDomain(const GURL& url) {
WorkerProcessHost* WorkerServiceImpl::GetProcessToFillUpCores() {
int num_processes = 0;
- for (WorkerProcessHostIterator iter; !iter.Done(); ++iter)
+ BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_WORKER);
+ for (; !iter.Done(); ++iter)
num_processes++;
if (num_processes >= base::SysInfo::NumberOfProcessors())
@@ -334,9 +343,11 @@ WorkerProcessHost* WorkerServiceImpl::GetProcessToFillUpCores() {
WorkerProcessHost* WorkerServiceImpl::GetLeastLoadedWorker() {
WorkerProcessHost* smallest = NULL;
- for (WorkerProcessHostIterator iter; !iter.Done(); ++iter) {
- if (!smallest || iter->instances().size() < smallest->instances().size())
- smallest = *iter;
+ for (BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_WORKER);
+ !iter.Done(); ++iter) {
+ WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
+ if (!smallest || worker->instances().size() < smallest->instances().size())
+ smallest = worker;
}
return smallest;
@@ -374,10 +385,12 @@ bool WorkerServiceImpl::TabCanCreateWorkerProcess(
int total_workers = 0;
int workers_per_tab = 0;
*hit_total_worker_limit = false;
- for (WorkerProcessHostIterator iter; !iter.Done(); ++iter) {
+ for (BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_WORKER);
+ !iter.Done(); ++iter) {
+ WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
for (WorkerProcessHost::Instances::const_iterator cur_instance =
- iter->instances().begin();
- cur_instance != iter->instances().end(); ++cur_instance) {
+ worker->instances().begin();
+ cur_instance != worker->instances().end(); ++cur_instance) {
total_workers++;
if (total_workers >= kMaxWorkersWhenSeparate) {
*hit_total_worker_limit = true;
@@ -420,14 +433,16 @@ void WorkerServiceImpl::TryStartingQueuedWorker() {
bool WorkerServiceImpl::GetRendererForWorker(int worker_process_id,
int* render_process_id,
int* render_view_id) const {
- for (WorkerProcessHostIterator iter; !iter.Done(); ++iter) {
- if (iter.GetData().id != worker_process_id)
+ for (BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_WORKER);
+ !iter.Done(); ++iter) {
+ if (iter->data().id != worker_process_id)
continue;
// This code assumes one worker per process, see function comment in header!
+ WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
WorkerProcessHost::Instances::const_iterator first_instance =
- iter->instances().begin();
- if (first_instance == iter->instances().end())
+ worker->instances().begin();
+ if (first_instance == worker->instances().end())
return false;
WorkerDocumentSet::DocumentInfoSet::const_iterator info =
@@ -441,13 +456,15 @@ bool WorkerServiceImpl::GetRendererForWorker(int worker_process_id,
const WorkerProcessHost::WorkerInstance* WorkerServiceImpl::FindWorkerInstance(
int worker_process_id) {
- for (WorkerProcessHostIterator iter; !iter.Done(); ++iter) {
- if (iter.GetData().id != worker_process_id)
+ for (BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_WORKER);
+ !iter.Done(); ++iter) {
+ if (iter->data().id != worker_process_id)
continue;
+ WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
WorkerProcessHost::Instances::const_iterator instance =
- iter->instances().begin();
- return instance == iter->instances().end() ? NULL : &*instance;
+ worker->instances().begin();
+ return instance == worker->instances().end() ? NULL : &*instance;
}
return NULL;
}
@@ -479,10 +496,12 @@ WorkerProcessHost::WorkerInstance* WorkerServiceImpl::FindSharedWorkerInstance(
const GURL& url,
const string16& name,
const content::ResourceContext* resource_context) {
- for (WorkerProcessHostIterator iter; !iter.Done(); ++iter) {
+ for (BrowserChildProcessHost::Iterator iter(content::PROCESS_TYPE_WORKER);
+ !iter.Done(); ++iter) {
+ WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
for (WorkerProcessHost::Instances::iterator instance_iter =
- iter->mutable_instances().begin();
- instance_iter != iter->mutable_instances().end();
+ worker->mutable_instances().begin();
+ instance_iter != worker->mutable_instances().end();
++instance_iter) {
if (instance_iter->Matches(url, name, resource_context))
return &(*instance_iter);