Index: chrome/browser/devtools/devtools_target_impl.cc |
diff --git a/chrome/browser/devtools/devtools_target_impl.cc b/chrome/browser/devtools/devtools_target_impl.cc |
index 62f6354aa5ca704c86d66f4eb6eb183372155c87..823253b9e839f3b74f9d2ca9cf045d1516647631 100644 |
--- a/chrome/browser/devtools/devtools_target_impl.cc |
+++ b/chrome/browser/devtools/devtools_target_impl.cc |
@@ -215,6 +215,24 @@ void WorkerTarget::Inspect(Profile* profile) const { |
DevToolsWindow::OpenDevToolsWindowForWorker(profile, GetAgentHost()); |
} |
+class ServiceWorkerTarget : public DevToolsTargetImpl { |
+ public: |
+ explicit ServiceWorkerTarget(scoped_refptr<DevToolsAgentHost> agent_host); |
+ virtual void Inspect(Profile* profile) const OVERRIDE; |
+}; |
+ |
+ServiceWorkerTarget::ServiceWorkerTarget( |
+ scoped_refptr<DevToolsAgentHost> agent_host) |
+ : DevToolsTargetImpl(agent_host) { |
+ set_type(kTargetTypeWorker); |
+ set_title(""); |
+ set_url(agent_host->GetURL()); |
+} |
+ |
+void ServiceWorkerTarget::Inspect(Profile* profile) const { |
+ DevToolsWindow::OpenDevToolsWindowForWorker(profile, GetAgentHost()); |
+} |
+ |
} // namespace |
// DevToolsTargetImpl ---------------------------------------------------------- |
@@ -300,27 +318,37 @@ scoped_ptr<DevToolsTargetImpl> DevToolsTargetImpl::CreateForRenderViewHost( |
return scoped_ptr<DevToolsTargetImpl>(new RenderViewHostTarget(rvh, is_tab)); |
} |
-// static |
-DevToolsTargetImpl::List DevToolsTargetImpl::EnumerateRenderViewHostTargets() { |
+ |
+static void CreateRenderViewHostTargets( |
+ const DevToolsTargetImpl::Callback& callback, |
+ const DevToolsAgentHost::List& agents) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
std::set<RenderViewHost*> tab_rvhs; |
for (TabContentsIterator it; !it.done(); it.Next()) |
tab_rvhs.insert(it->GetRenderViewHost()); |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DevToolsTargetImpl::List result; |
- std::vector<RenderViewHost*> rvh_list = |
- content::DevToolsAgentHost::GetValidRenderViewHosts(); |
- for (std::vector<RenderViewHost*>::iterator it = rvh_list.begin(); |
- it != rvh_list.end(); ++it) { |
- bool is_tab = tab_rvhs.find(*it) != tab_rvhs.end(); |
- result.push_back(new RenderViewHostTarget(*it, is_tab)); |
+ for (content::DevToolsAgentHost::List::const_iterator it = agents.begin(); |
+ it != agents.end(); ++it) { |
+ if (RenderViewHost* rvh = (*it)->GetRenderViewHost()) { |
+ bool is_tab = tab_rvhs.find(rvh) != tab_rvhs.end(); |
+ result.push_back(new RenderViewHostTarget(rvh, is_tab)); |
+ } |
} |
- return result; |
+ callback.Run(result); |
+} |
+ |
+// static |
+void DevToolsTargetImpl::EnumerateRenderViewHostTargets( |
+ const Callback& callback) { |
+ content::DevToolsAgentHost::GetOrCreateAllHosts( |
+ base::Bind(&CreateRenderViewHostTargets, callback)); |
} |
static void CreateWorkerTargets( |
const std::vector<WorkerService::WorkerInfo>& worker_info, |
- DevToolsTargetImpl::Callback callback) { |
+ const DevToolsTargetImpl::Callback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DevToolsTargetImpl::List result; |
for (size_t i = 0; i < worker_info.size(); ++i) { |
@@ -330,7 +358,7 @@ static void CreateWorkerTargets( |
} |
// static |
-void DevToolsTargetImpl::EnumerateWorkerTargets(Callback callback) { |
+void DevToolsTargetImpl::EnumerateWorkerTargets(const Callback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
content::BrowserThread::PostTask( |
content::BrowserThread::UI, |
@@ -340,22 +368,44 @@ void DevToolsTargetImpl::EnumerateWorkerTargets(Callback callback) { |
callback)); |
} |
-static void CollectAllTargets( |
- DevToolsTargetImpl::Callback callback, |
- const DevToolsTargetImpl::List& worker_targets) { |
+static void Assign(DevToolsTargetImpl::List* targets_ptr, |
+ const DevToolsTargetImpl::List& targets) { |
+ *targets_ptr = targets; |
+} |
+ |
+static void OnAgentHostsReceived(const DevToolsTargetImpl::Callback& callback, |
+ const DevToolsTargetImpl::List& worker_targets, |
+ const DevToolsAgentHost::List& agent_hosts) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DevToolsTargetImpl::List result = |
- DevToolsTargetImpl::EnumerateRenderViewHostTargets(); |
- result.insert(result.begin(), worker_targets.begin(), worker_targets.end()); |
+ DevToolsTargetImpl::List result; |
+ CreateRenderViewHostTargets(base::Bind(Assign, &result), agent_hosts); |
+ result.insert(result.end(), worker_targets.begin(), worker_targets.end()); |
+ std::set<scoped_refptr<DevToolsAgentHost> > used_hosts; |
+ for (DevToolsTargetImpl::List::iterator it = result.begin(); |
+ it != result.end(); ++it) { |
+ used_hosts.insert((*it)->GetAgentHost()); |
+ } |
+ for (DevToolsAgentHost::List::const_iterator it = agent_hosts.begin(); |
+ it != agent_hosts.end(); ++it) { |
+ if (used_hosts.find(*it) == used_hosts.end()) |
+ result.push_back(new ServiceWorkerTarget(*it)); |
+ } |
callback.Run(result); |
} |
+static void OnWorkersReceived(const DevToolsTargetImpl::Callback& callback, |
+ const DevToolsTargetImpl::List& worker_targets) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DevToolsAgentHost::GetOrCreateAllHosts( |
+ base::Bind(&OnAgentHostsReceived, callback, worker_targets)); |
+} |
+ |
// static |
-void DevToolsTargetImpl::EnumerateAllTargets(Callback callback) { |
+void DevToolsTargetImpl::EnumerateAllTargets(const Callback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
content::BrowserThread::PostTask( |
content::BrowserThread::IO, |
FROM_HERE, |
base::Bind(&DevToolsTargetImpl::EnumerateWorkerTargets, |
- base::Bind(&CollectAllTargets, callback))); |
+ base::Bind(&OnWorkersReceived, callback))); |
} |