summaryrefslogtreecommitdiffstats
path: root/content/browser/worker_host
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-20 07:51:54 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-20 07:51:54 +0000
commitf177ffd84b0f1b94de05fa0166520783cb5cddb9 (patch)
tree54f755e0de2d845cd2d8b481f08c528911ce62d2 /content/browser/worker_host
parent57c1b56f4ae39e8cb1cd805fb46653423d4e5456 (diff)
downloadchromium_src-f177ffd84b0f1b94de05fa0166520783cb5cddb9.zip
chromium_src-f177ffd84b0f1b94de05fa0166520783cb5cddb9.tar.gz
chromium_src-f177ffd84b0f1b94de05fa0166520783cb5cddb9.tar.bz2
Revert 118415 - Add a Content API around BrowserChildProcessHost, similar to what was done with ChildProcessHost. Now classes like PluginProcessHost don't derive from it, but instead use composition.
I've also moved the iterator class into its own file in the public directory. Since classes don't derive from BrowserChildProcessHost and so can't static_cast from it, I added a template helper that does this. BUG=98716 Review URL: https://chromiumcodereview.appspot.com/9150017 TBR=jam@chromium.org git-svn-id: svn://svn.chromium.org/chrome/trunk/src@118420 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/worker_host')
-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
3 files changed, 81 insertions, 94 deletions
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);