summaryrefslogtreecommitdiffstats
path: root/chrome/browser/worker_host
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-24 02:01:11 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-24 02:01:11 +0000
commitfd09950346afe96c4d86d37d98fd45003872ab3f (patch)
tree115466bfb6c258ef2b190bbea6c02f0e53b17582 /chrome/browser/worker_host
parent06fc8e6e54172eecff83e72fa36d038f26403328 (diff)
downloadchromium_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.cc60
-rw-r--r--chrome/browser/worker_host/worker_process_host.h6
-rw-r--r--chrome/browser/worker_host/worker_service.cc4
-rw-r--r--chrome/browser/worker_host/worker_service.h1
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);