diff options
author | yurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-21 06:49:54 +0000 |
---|---|---|
committer | yurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-21 06:49:54 +0000 |
commit | f44d1193f728c17cc4fd7adfe11a3fce82cddb9b (patch) | |
tree | 20bb8549bcafc3dd769b83c51aecc01b37c55952 /content | |
parent | 235b2197b020160e95dcf6456dce9ba45a396fbe (diff) | |
download | chromium_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')
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; |