diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-24 02:01:11 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-24 02:01:11 +0000 |
commit | fd09950346afe96c4d86d37d98fd45003872ab3f (patch) | |
tree | 115466bfb6c258ef2b190bbea6c02f0e53b17582 /chrome/browser/worker_host | |
parent | 06fc8e6e54172eecff83e72fa36d038f26403328 (diff) | |
download | chromium_src-fd09950346afe96c4d86d37d98fd45003872ab3f.zip chromium_src-fd09950346afe96c4d86d37d98fd45003872ab3f.tar.gz chromium_src-fd09950346afe96c4d86d37d98fd45003872ab3f.tar.bz2 |
Finish hooking up the worker process UI: use the domains of the workers as the title in the task manager, and show an infobar when a page's workers die.
I also cleaned up the code in RenderView which creates a window and widget, since when I originally wrote it I wasn't aware of RenderViewHost::FromID.
Review URL: http://codereview.chromium.org/45025
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12335 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/worker_host')
-rw-r--r-- | chrome/browser/worker_host/worker_process_host.cc | 60 | ||||
-rw-r--r-- | chrome/browser/worker_host/worker_process_host.h | 6 | ||||
-rw-r--r-- | chrome/browser/worker_host/worker_service.cc | 4 | ||||
-rw-r--r-- | chrome/browser/worker_host/worker_service.h | 1 |
4 files changed, 67 insertions, 4 deletions
diff --git a/chrome/browser/worker_host/worker_process_host.cc b/chrome/browser/worker_host/worker_process_host.cc index d696df6..88b4a23 100644 --- a/chrome/browser/worker_host/worker_process_host.cc +++ b/chrome/browser/worker_host/worker_process_host.cc @@ -4,11 +4,15 @@ #include "chrome/browser/worker_host/worker_process_host.h" +#include <set> + #include "base/command_line.h" #include "base/debug_util.h" #include "base/path_service.h" #include "base/process_util.h" +#include "base/string_util.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/renderer_host/render_view_host.h" #include "chrome/browser/renderer_host/resource_message_filter.h" #include "chrome/browser/worker_host/worker_service.h" #include "chrome/common/chrome_switches.h" @@ -16,11 +20,31 @@ #include "chrome/common/process_watcher.h" #include "chrome/common/render_messages.h" #include "chrome/common/worker_messages.h" +#include "net/base/registry_controlled_domain.h" #if defined(OS_WIN) #include "chrome/browser/sandbox_policy.h" #endif +// Notifies RenderViewHost that one or more worker objects crashed. +class WorkerCrashTask : public Task { + public: + WorkerCrashTask(int render_process_id, int render_view_id) + : render_process_id_(render_process_id), + render_view_id_(render_view_id) { } + + void Run() { + RenderViewHost* host = + RenderViewHost::FromID(render_process_id_, render_view_id_); + if (host) + host->delegate()->OnCrashedWorker(); + } + + private: + int render_process_id_; + int render_view_id_; +}; + WorkerProcessHost::WorkerProcessHost( ResourceDispatcherHost* resource_dispatcher_host_) @@ -28,12 +52,14 @@ WorkerProcessHost::WorkerProcessHost( } WorkerProcessHost::~WorkerProcessHost() { + // If we crashed, tell the RenderViewHost. + for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { + i->filter->ui_loop()->PostTask(FROM_HERE, new WorkerCrashTask( + i->filter->GetProcessId(), i->render_view_route_id)); + } } bool WorkerProcessHost::Init() { - // TODO(jabdelmalek): figure out what to set as the title. - set_name(L"TBD"); - if (!CreateChannel()) return false; @@ -59,15 +85,20 @@ bool WorkerProcessHost::Init() { } void WorkerProcessHost::CreateWorker(const GURL& url, + int render_view_route_id, int worker_route_id, int renderer_route_id, ResourceMessageFilter* filter) { WorkerInstance instance; + instance.url = url; + instance.render_view_route_id = render_view_route_id; instance.worker_route_id = worker_route_id; instance.renderer_route_id = renderer_route_id; instance.filter = filter; instances_.push_back(instance); Send(new WorkerProcessMsg_CreateWorker(url, worker_route_id)); + + UpdateTitle(); } bool WorkerProcessHost::FilterMessage(const IPC::Message& message) { @@ -95,6 +126,11 @@ void WorkerProcessHost::OnMessageReceived(const IPC::Message& message) { IPC::Message* new_message = new IPC::Message(message); new_message->set_routing_id(i->renderer_route_id); i->filter->Send(new_message); + + if (message.type() == WorkerHostMsg_WorkerContextDestroyed::ID) { + instances_.erase(i); + UpdateTitle(); + } break; } } @@ -109,3 +145,21 @@ void WorkerProcessHost::RendererShutdown(ResourceMessageFilter* filter) { } } } + +void WorkerProcessHost::UpdateTitle() { + std::set<std::string> worker_domains; + for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { + worker_domains.insert( + net::RegistryControlledDomainService::GetDomainAndRegistry(i->url)); + } + + std::string title; + for (std::set<std::string>::iterator i = worker_domains.begin(); + i != worker_domains.end(); ++i) { + if (!title.empty()) + title += ", "; + title += *i; + } + + set_name(ASCIIToWide(title)); +} diff --git a/chrome/browser/worker_host/worker_process_host.h b/chrome/browser/worker_host/worker_process_host.h index 15a61e2..0a885ea 100644 --- a/chrome/browser/worker_host/worker_process_host.h +++ b/chrome/browser/worker_host/worker_process_host.h @@ -24,6 +24,7 @@ class WorkerProcessHost : public ChildProcessHost { // Creates a worker object in the process. void CreateWorker(const GURL& url, + int render_view_route_id, int worker_route_id, int renderer_route_id, ResourceMessageFilter* filter); @@ -43,9 +44,14 @@ class WorkerProcessHost : public ChildProcessHost { // Called when a message arrives from the worker process. void OnMessageReceived(const IPC::Message& message); + // Updates the title shown in the task manager. + void UpdateTitle(); + // Contains information about each worker instance, needed to forward messages // between the renderer and worker processes. struct WorkerInstance { + GURL url; + int render_view_route_id; int worker_route_id; int renderer_route_id; ResourceMessageFilter* filter; diff --git a/chrome/browser/worker_host/worker_service.cc b/chrome/browser/worker_host/worker_service.cc index 7eb5c69..675326f 100644 --- a/chrome/browser/worker_host/worker_service.cc +++ b/chrome/browser/worker_host/worker_service.cc @@ -23,6 +23,7 @@ WorkerService::~WorkerService() { } bool WorkerService::CreateDedicatedWorker(const GURL &url, + int render_view_route_id, ResourceMessageFilter* filter, int renderer_route_id) { WorkerProcessHost* worker = NULL; @@ -45,7 +46,8 @@ bool WorkerService::CreateDedicatedWorker(const GURL &url, // unique among all worker processes. That way when the worker process sends // a wrapped IPC message through us, we know which WorkerProcessHost to give // it to. - worker->CreateWorker(url, ++next_worker_route_id_, renderer_route_id, filter); + worker->CreateWorker(url, render_view_route_id, ++next_worker_route_id_, + renderer_route_id, filter); return true; } diff --git a/chrome/browser/worker_host/worker_service.h b/chrome/browser/worker_host/worker_service.h index 7deac0d..4f00c15 100644 --- a/chrome/browser/worker_host/worker_service.h +++ b/chrome/browser/worker_host/worker_service.h @@ -26,6 +26,7 @@ class WorkerService { // Creates a dedicated worker. Returns true on success. bool CreateDedicatedWorker(const GURL &url, + int render_view_route_id, ResourceMessageFilter* filter, int renderer_route_id); |