summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authoryurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-21 06:49:54 +0000
committeryurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-21 06:49:54 +0000
commitf44d1193f728c17cc4fd7adfe11a3fce82cddb9b (patch)
tree20bb8549bcafc3dd769b83c51aecc01b37c55952 /content
parent235b2197b020160e95dcf6456dce9ba45a396fbe (diff)
downloadchromium_src-f44d1193f728c17cc4fd7adfe11a3fce82cddb9b.zip
chromium_src-f44d1193f728c17cc4fd7adfe11a3fce82cddb9b.tar.gz
chromium_src-f44d1193f728c17cc4fd7adfe11a3fce82cddb9b.tar.bz2
When WorkerProcessHost receives WorkerHostMsg_WorkerContextDestroyed message it will always notify worker service observers even if there is no corresponding WorkerInstance in WorkerProcessHost::instances_ list(the instance can be removed when WorkerMessageFilter is closed).
WorkerDevToolsManager::InspectedWorkersList has been merged into WorkerDevToolsManager. BUG=None TEST=None Review URL: http://codereview.chromium.org/8364008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@106686 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/browser/debugger/worker_devtools_manager.cc149
-rw-r--r--content/browser/debugger/worker_devtools_manager.h8
-rw-r--r--content/browser/worker_host/worker_process_host.cc9
-rw-r--r--content/browser/worker_host/worker_service.cc4
-rw-r--r--content/browser/worker_host/worker_service.h2
-rw-r--r--content/browser/worker_host/worker_service_observer.h2
6 files changed, 73 insertions, 101 deletions
diff --git a/content/browser/debugger/worker_devtools_manager.cc b/content/browser/debugger/worker_devtools_manager.cc
index c0e01b7..df70af9 100644
--- a/content/browser/debugger/worker_devtools_manager.cc
+++ b/content/browser/debugger/worker_devtools_manager.cc
@@ -224,56 +224,17 @@ void WorkerDevToolsManager::AgentHosts::Observe(
DCHECK(!instance_);
}
-class WorkerDevToolsManager::InspectedWorkersList {
- public:
- InspectedWorkersList() {}
-
- void AddInstance(WorkerProcessHost* host, int route_id) {
- DCHECK(!Contains(host->id(), route_id));
- map_.push_back(Entry(host, route_id));
- }
-
- bool Contains(int host_id, int route_id) {
- return FindHost(host_id, route_id) != NULL;
- }
-
- WorkerProcessHost* FindHost(int host_id, int route_id) {
- Entries::iterator it = FindEntry(host_id, route_id);
- if (it == map_.end())
- return NULL;
- return it->host;
- }
-
- bool RemoveInstance(int host_id, int route_id) {
- Entries::iterator it = FindEntry(host_id, route_id);
- if (it == map_.end())
- return false;
- map_.erase(it);
- return true;
- }
-
- private:
- struct Entry {
- Entry(WorkerProcessHost* host, int route_id)
- : host(host),
- route_id(route_id) {}
- WorkerProcessHost* const host;
- int const route_id;
- };
- typedef std::list<Entry> Entries;
-
- Entries::iterator FindEntry(int host_id, int route_id) {
- Entries::iterator it = map_.begin();
- while (it != map_.end()) {
- if (it->host->id() == host_id && it->route_id == route_id)
- break;
- ++it;
- }
- return it;
- }
-
- Entries map_;
- DISALLOW_COPY_AND_ASSIGN(InspectedWorkersList);
+struct WorkerDevToolsManager::InspectedWorker {
+ InspectedWorker(WorkerProcessHost* host, int route_id, const GURL& url,
+ const string16& name)
+ : host(host),
+ route_id(route_id),
+ worker_url(url),
+ worker_name(name) {}
+ WorkerProcessHost* const host;
+ int const route_id;
+ GURL worker_url;
+ string16 worker_name;
};
// static
@@ -293,8 +254,7 @@ DevToolsAgentHost* WorkerDevToolsManager::GetDevToolsAgentHostForWorker(
return result;
}
-WorkerDevToolsManager::WorkerDevToolsManager()
- : inspected_workers_(new InspectedWorkersList()) {
+WorkerDevToolsManager::WorkerDevToolsManager() {
WorkerService::GetInstance()->AddObserver(this);
}
@@ -320,19 +280,19 @@ void WorkerDevToolsManager::WorkerCreated(
void WorkerDevToolsManager::WorkerDestroyed(
WorkerProcessHost* worker,
- const WorkerProcessHost::WorkerInstance& instance) {
- if (!instance.shared())
- return;
- if (!inspected_workers_->RemoveInstance(worker->id(),
- instance.worker_route_id())) {
+ int worker_route_id) {
+ InspectedWorkersList::iterator it = FindInspectedWorker(
+ worker->id(),
+ worker_route_id);
+ if (it == inspected_workers_.end())
return;
- }
- WorkerId worker_id(worker->id(), instance.worker_route_id());
+ WorkerId worker_id(worker->id(), worker_route_id);
terminated_workers_.push_back(TerminatedInspectedWorker(
worker_id,
- instance.url(),
- instance.name()));
+ it->worker_url,
+ it->worker_name));
+ inspected_workers_.erase(it);
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
NewRunnableFunction(
@@ -376,21 +336,23 @@ void WorkerDevToolsManager::RemoveInspectedWorkerData(
}
}
-static WorkerProcessHost* FindWorkerProcessHostForWorker(
- int worker_process_id,
- int worker_route_id) {
+WorkerDevToolsManager::InspectedWorkersList::iterator
+WorkerDevToolsManager::FindInspectedWorker(
+ int host_id, int route_id) {
+ InspectedWorkersList::iterator it = inspected_workers_.begin();
+ while (it != inspected_workers_.end()) {
+ if (it->host->id() == host_id && it->route_id == route_id)
+ break;
+ ++it;
+ }
+ return it;
+}
+
+static WorkerProcessHost* FindWorkerProcess(int worker_process_id) {
BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
for (; !iter.Done(); ++iter) {
- if (iter->id() != worker_process_id)
- continue;
- WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
- const WorkerProcessHost::Instances& instances = worker->instances();
- for (WorkerProcessHost::Instances::const_iterator i = instances.begin();
- i != instances.end(); ++i) {
- if (i->shared() && i->worker_route_id() == worker_route_id)
- return worker;
- }
- return NULL;
+ if (iter->id() == worker_process_id)
+ return static_cast<WorkerProcessHost*>(*iter);
}
return NULL;
}
@@ -398,20 +360,28 @@ static WorkerProcessHost* FindWorkerProcessHostForWorker(
void WorkerDevToolsManager::RegisterDevToolsAgentHostForWorker(
int worker_process_id,
int worker_route_id) {
- WorkerProcessHost* host = FindWorkerProcessHostForWorker(
- worker_process_id,
- worker_route_id);
- if (host)
- inspected_workers_->AddInstance(host, worker_route_id);
- else
- NotifyWorkerDestroyedOnIOThread(worker_process_id, worker_route_id);
+ if (WorkerProcessHost* process = FindWorkerProcess(worker_process_id)) {
+ const WorkerProcessHost::Instances& instances = process->instances();
+ for (WorkerProcessHost::Instances::const_iterator i = instances.begin();
+ i != instances.end(); ++i) {
+ if (i->shared() && i->worker_route_id() == worker_route_id) {
+ DCHECK(FindInspectedWorker(worker_process_id, worker_route_id) ==
+ inspected_workers_.end());
+ inspected_workers_.push_back(
+ InspectedWorker(process, worker_route_id, i->url(), i->name()));
+ return;
+ }
+ }
+ }
+ NotifyWorkerDestroyedOnIOThread(worker_process_id, worker_route_id);
}
void WorkerDevToolsManager::ForwardToDevToolsClient(
int worker_process_id,
int worker_route_id,
const IPC::Message& message) {
- if (!inspected_workers_->Contains(worker_process_id, worker_route_id)) {
+ if (FindInspectedWorker(worker_process_id, worker_route_id) ==
+ inspected_workers_.end()) {
NOTREACHED();
return;
}
@@ -440,14 +410,14 @@ void WorkerDevToolsManager::ForwardToWorkerDevToolsAgent(
int worker_process_id,
int worker_route_id,
const IPC::Message& message) {
- WorkerProcessHost* host = inspected_workers_->FindHost(
+ InspectedWorkersList::iterator it = FindInspectedWorker(
worker_process_id,
worker_route_id);
- if (!host)
+ if (it == inspected_workers_.end())
return;
IPC::Message* msg = new IPC::Message(message);
msg->set_routing_id(worker_route_id);
- host->Send(msg);
+ it->host->Send(msg);
}
// static
@@ -500,12 +470,7 @@ void WorkerDevToolsManager::NotifyWorkerDestroyedOnUIThread(
// static
void WorkerDevToolsManager::SendResumeToWorker(const WorkerId& id) {
- BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
- for (; !iter.Done(); ++iter) {
- if (iter->id() == id.first) {
- iter->Send(new DevToolsAgentMsg_ResumeWorkerContext(id.second));
- return;
- }
- }
+ if (WorkerProcessHost* process = FindWorkerProcess(id.first))
+ process->Send(new DevToolsAgentMsg_ResumeWorkerContext(id.second));
}
diff --git a/content/browser/debugger/worker_devtools_manager.h b/content/browser/debugger/worker_devtools_manager.h
index 2255aa2..2dfc572 100644
--- a/content/browser/debugger/worker_devtools_manager.h
+++ b/content/browser/debugger/worker_devtools_manager.h
@@ -44,6 +44,8 @@ class WorkerDevToolsManager : private WorkerServiceObserver {
class AgentHosts;
class DetachedClientHosts;
class WorkerDevToolsAgentHost;
+ struct InspectedWorker;
+ typedef std::list<InspectedWorker> InspectedWorkersList;
WorkerDevToolsManager();
virtual ~WorkerDevToolsManager();
@@ -54,11 +56,12 @@ class WorkerDevToolsManager : private WorkerServiceObserver {
const WorkerProcessHost::WorkerInstance& instance) OVERRIDE;
virtual void WorkerDestroyed(
WorkerProcessHost* process,
- const WorkerProcessHost::WorkerInstance& instance) OVERRIDE;
+ int worker_route_id) OVERRIDE;
virtual void WorkerContextStarted(WorkerProcessHost* process,
int worker_route_id) OVERRIDE;
void RemoveInspectedWorkerData(const WorkerId& id);
+ InspectedWorkersList::iterator FindInspectedWorker(int host_id, int route_id);
void RegisterDevToolsAgentHostForWorker(int worker_process_id,
int worker_route_id);
@@ -79,8 +82,7 @@ class WorkerDevToolsManager : private WorkerServiceObserver {
int worker_route_id);
static void SendResumeToWorker(const WorkerId& id);
- class InspectedWorkersList;
- scoped_ptr<InspectedWorkersList> inspected_workers_;
+ InspectedWorkersList inspected_workers_;
struct TerminatedInspectedWorker;
typedef std::list<TerminatedInspectedWorker> TerminatedInspectedWorkers;
diff --git a/content/browser/worker_host/worker_process_host.cc b/content/browser/worker_host/worker_process_host.cc
index 140d272..b3893d1 100644
--- a/content/browser/worker_host/worker_process_host.cc
+++ b/content/browser/worker_host/worker_process_host.cc
@@ -112,7 +112,8 @@ WorkerProcessHost::~WorkerProcessHost() {
new WorkerCrashTask(parent_iter->render_process_id(),
parent_iter->render_view_id()));
}
- WorkerService::GetInstance()->NotifyWorkerDestroyed(this, *i);
+ WorkerService::GetInstance()->NotifyWorkerDestroyed(this,
+ i->worker_route_id());
}
ChildProcessSecurityPolicy::GetInstance()->Remove(id());
@@ -335,6 +336,11 @@ bool WorkerProcessHost::OnMessageReceived(const IPC::Message& message) {
if (handled)
return true;
+ if (message.type() == WorkerHostMsg_WorkerContextDestroyed::ID) {
+ WorkerService::GetInstance()->NotifyWorkerDestroyed(this,
+ message.routing_id());
+ }
+
for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) {
if (i->worker_route_id() == message.routing_id()) {
if (!i->shared()) {
@@ -345,7 +351,6 @@ bool WorkerProcessHost::OnMessageReceived(const IPC::Message& message) {
}
if (message.type() == WorkerHostMsg_WorkerContextDestroyed::ID) {
- WorkerService::GetInstance()->NotifyWorkerDestroyed(this, *i);
instances_.erase(i);
UpdateTitle();
}
diff --git a/content/browser/worker_host/worker_service.cc b/content/browser/worker_host/worker_service.cc
index 93706d2..d33ebcc 100644
--- a/content/browser/worker_host/worker_service.cc
+++ b/content/browser/worker_host/worker_service.cc
@@ -506,9 +506,9 @@ void WorkerService::RemoveObserver(WorkerServiceObserver* observer) {
void WorkerService::NotifyWorkerDestroyed(
WorkerProcessHost* process,
- const WorkerProcessHost::WorkerInstance& instance) {
+ int worker_route_id) {
FOR_EACH_OBSERVER(WorkerServiceObserver, observers_,
- WorkerDestroyed(process, instance));
+ WorkerDestroyed(process, worker_route_id));
}
void WorkerService::NotifyWorkerContextStarted(WorkerProcessHost* process,
diff --git a/content/browser/worker_host/worker_service.h b/content/browser/worker_host/worker_service.h
index 635dd8b..69af159 100644
--- a/content/browser/worker_host/worker_service.h
+++ b/content/browser/worker_host/worker_service.h
@@ -67,7 +67,7 @@ class WorkerService {
void NotifyWorkerDestroyed(
WorkerProcessHost* process,
- const WorkerProcessHost::WorkerInstance& instance);
+ int worker_route_id);
void NotifyWorkerContextStarted(
WorkerProcessHost* process,
int worker_route_id);
diff --git a/content/browser/worker_host/worker_service_observer.h b/content/browser/worker_host/worker_service_observer.h
index 8ee4514..ae52edd 100644
--- a/content/browser/worker_host/worker_service_observer.h
+++ b/content/browser/worker_host/worker_service_observer.h
@@ -15,7 +15,7 @@ class WorkerServiceObserver {
const WorkerProcessHost::WorkerInstance& instance) = 0;
virtual void WorkerDestroyed(
WorkerProcessHost* process,
- const WorkerProcessHost::WorkerInstance& instance) = 0;
+ int worker_route_id) = 0;
virtual void WorkerContextStarted(
WorkerProcessHost* process,
int worker_route_id) = 0;