| 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)));
|
| }
|
|
|