11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/devtools/devtools_target_impl.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/stringprintf.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h"
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/tab_contents_iterator.h"
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/favicon_status.h"
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/web_contents.h"
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)using content::BrowserThread;
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)using content::DevToolsAgentHost;
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)using content::RenderViewHost;
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)using content::WebContents;
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)using content::WorkerService;
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace {
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const char kTargetTypeApp[] = "app";
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const char kTargetTypeBackgroundPage[] = "background_page";
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const char kTargetTypePage[] = "page";
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const char kTargetTypeWorker[] = "worker";
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const char kTargetTypeOther[] = "other";
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class RenderViewHostTarget : public DevToolsTargetImpl {
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  explicit RenderViewHostTarget(RenderViewHost* rvh, bool is_tab);
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // content::DevToolsTarget overrides:
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool Activate() const OVERRIDE;
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool Close() const OVERRIDE;
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // DevToolsTargetImpl overrides:
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual RenderViewHost* GetRenderViewHost() const OVERRIDE;
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual int GetTabId() const OVERRIDE;
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual std::string GetExtensionId() const OVERRIDE;
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void Inspect(Profile* profile) const OVERRIDE;
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int tab_id_;
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string extension_id_;
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)RenderViewHostTarget::RenderViewHostTarget(RenderViewHost* rvh, bool is_tab) {
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  agent_host_ = DevToolsAgentHost::GetOrCreateFor(rvh);
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  id_ = agent_host_->GetId();
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  type_ = kTargetTypeOther;
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  tab_id_ = -1;
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  WebContents* web_contents = WebContents::FromRenderViewHost(rvh);
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!web_contents)
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;  // Orphan RVH will show up with no title/url/icon in clients.
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  title_ = UTF16ToUTF8(web_contents->GetTitle());
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  url_ = web_contents->GetURL();
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::NavigationController& controller = web_contents->GetController();
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::NavigationEntry* entry = controller.GetActiveEntry();
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (entry != NULL && entry->GetURL().is_valid())
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    favicon_url_ = entry->GetFavicon().url;
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  last_activity_time_ = web_contents->GetLastSelectedTime();
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (is_tab) {
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    type_ = kTargetTypePage;
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    tab_id_ = extensions::ExtensionTabUtil::GetTabId(web_contents);
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } else {
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    Profile* profile =
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        Profile::FromBrowserContext(web_contents->GetBrowserContext());
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (profile) {
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ExtensionService* extension_service = profile->GetExtensionService();
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const extensions::Extension* extension = extension_service->
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          extensions()->GetByID(url_.host());
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (extension) {
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        title_ = extension->name();
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        if (extension->is_hosted_app()
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            || extension->is_legacy_packaged_app()
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            || extension->is_platform_app()) {
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          type_ = kTargetTypeApp;
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        } else {
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          extensions::ExtensionHost* extension_host =
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              extensions::ExtensionSystem::Get(profile)->process_manager()->
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                  GetBackgroundHostForExtension(extension->id());
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          if (extension_host &&
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              extension_host->host_contents() == web_contents) {
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            type_ = kTargetTypeBackgroundPage;
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            extension_id_ = extension->id();
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          }
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        }
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        favicon_url_ = extensions::ExtensionIconSource::GetIconURL(
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            extension, extension_misc::EXTENSION_ICON_SMALLISH,
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            ExtensionIconSet::MATCH_BIGGER, false, NULL);
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool RenderViewHostTarget::Activate() const {
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderViewHost* rvh = GetRenderViewHost();
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!rvh)
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  WebContents* web_contents = WebContents::FromRenderViewHost(rvh);
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!web_contents)
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  web_contents->GetDelegate()->ActivateContents(web_contents);
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return true;
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool RenderViewHostTarget::Close() const {
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderViewHost* rvh = GetRenderViewHost();
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!rvh)
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  rvh->ClosePage();
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return true;
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)RenderViewHost* RenderViewHostTarget::GetRenderViewHost() const {
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return agent_host_->GetRenderViewHost();
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)int RenderViewHostTarget::GetTabId() const {
1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return tab_id_;
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)std::string RenderViewHostTarget::GetExtensionId() const {
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return extension_id_;
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void RenderViewHostTarget::Inspect(Profile* profile) const {
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderViewHost* rvh = GetRenderViewHost();
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!rvh)
1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DevToolsWindow::OpenDevToolsWindow(rvh);
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class WorkerTarget : public DevToolsTargetImpl {
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  explicit WorkerTarget(const WorkerService::WorkerInfo& worker_info);
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // content::DevToolsTarget overrides:
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool Close() const OVERRIDE;
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // DevToolsTargetImpl overrides:
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void Inspect(Profile* profile) const OVERRIDE;
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int process_id_;
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int route_id_;
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WorkerTarget::WorkerTarget(const WorkerService::WorkerInfo& worker) {
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  agent_host_ =
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DevToolsAgentHost::GetForWorker(worker.process_id, worker.route_id);
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  id_ = agent_host_->GetId();
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  type_ = kTargetTypeWorker;
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  title_ = UTF16ToUTF8(worker.name);
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  description_ =
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::StringPrintf("Worker pid:%d", base::GetProcId(worker.handle));
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  url_ = worker.url;
1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  process_id_ = worker.process_id;
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  route_id_ = worker.route_id;
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static void TerminateWorker(int process_id, int route_id) {
1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  WorkerService::GetInstance()->TerminateWorker(process_id, route_id);
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool WorkerTarget::Close() const {
1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE,
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::Bind(&TerminateWorker, process_id_, route_id_));
1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return true;
1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WorkerTarget::Inspect(Profile* profile) const {
1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DevToolsWindow::OpenDevToolsWindowForWorker(profile, agent_host_.get());
1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace
1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DevToolsTargetImpl::~DevToolsTargetImpl() {
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DevToolsTargetImpl::DevToolsTargetImpl() {
1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)std::string DevToolsTargetImpl::GetId() const {
2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return id_;
2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)std::string DevToolsTargetImpl::GetType() const {
2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return type_;
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)std::string DevToolsTargetImpl::GetTitle() const {
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return title_;
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)std::string DevToolsTargetImpl::GetDescription() const {
2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return description_;
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)GURL DevToolsTargetImpl::GetUrl() const {
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return url_;
2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)GURL DevToolsTargetImpl::GetFaviconUrl() const {
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return favicon_url_;
2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)base::TimeTicks DevToolsTargetImpl::GetLastActivityTime() const {
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return last_activity_time_;
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)scoped_refptr<content::DevToolsAgentHost>
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DevToolsTargetImpl::GetAgentHost() const {
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return agent_host_;
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool DevToolsTargetImpl::IsAttached() const {
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return agent_host_->IsAttached();
2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool DevToolsTargetImpl::Activate() const {
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return false;
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool DevToolsTargetImpl::Close() const {
2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return false;
2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)int DevToolsTargetImpl::GetTabId() const {
2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return -1;
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)RenderViewHost* DevToolsTargetImpl::GetRenderViewHost() const {
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return NULL;
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)std::string DevToolsTargetImpl::GetExtensionId() const {
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return std::string();
2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void DevToolsTargetImpl::Inspect(Profile*) const {
2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void DevToolsTargetImpl::Reload() const {
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// static
2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)scoped_ptr<DevToolsTargetImpl> DevToolsTargetImpl::CreateForRenderViewHost(
2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    content::RenderViewHost* rvh, bool is_tab) {
2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return scoped_ptr<DevToolsTargetImpl>(new RenderViewHostTarget(rvh, is_tab));
2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// static
2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)scoped_ptr<DevToolsTargetImpl> DevToolsTargetImpl::CreateForWorker(
2711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const WorkerService::WorkerInfo& worker_info) {
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return scoped_ptr<DevToolsTargetImpl>(new WorkerTarget(worker_info));
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// static
2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DevToolsTargetImpl::List DevToolsTargetImpl::EnumerateRenderViewHostTargets() {
2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::set<RenderViewHost*> tab_rvhs;
2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (TabContentsIterator it; !it.done(); it.Next())
2791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    tab_rvhs.insert(it->GetRenderViewHost());
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DevToolsTargetImpl::List result;
2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::vector<RenderViewHost*> rvh_list =
2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      content::DevToolsAgentHost::GetValidRenderViewHosts();
2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (std::vector<RenderViewHost*>::iterator it = rvh_list.begin();
2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       it != rvh_list.end(); ++it) {
2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bool is_tab = tab_rvhs.find(*it) != tab_rvhs.end();
2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    result.push_back(new RenderViewHostTarget(*it, is_tab));
2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return result;
2911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static void CreateWorkerTargets(
2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::vector<WorkerService::WorkerInfo>& worker_info,
2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DevToolsTargetImpl::Callback callback) {
2961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DevToolsTargetImpl::List result;
2981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < worker_info.size(); ++i) {
2991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    result.push_back(new WorkerTarget(worker_info[i]));
3001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
3011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  callback.Run(result);
3021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// static
3051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void DevToolsTargetImpl::EnumerateWorkerTargets(Callback callback) {
3061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
3071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::BrowserThread::PostTask(
3081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      content::BrowserThread::UI,
3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      FROM_HERE,
3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::Bind(&CreateWorkerTargets,
3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 WorkerService::GetInstance()->GetWorkers(),
3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 callback));
3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static void CollectAllTargets(
3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DevToolsTargetImpl::Callback callback,
3171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const DevToolsTargetImpl::List& worker_targets) {
3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DevToolsTargetImpl::List result =
3201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DevToolsTargetImpl::EnumerateRenderViewHostTargets();
3211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  result.insert(result.begin(), worker_targets.begin(), worker_targets.end());
3221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  callback.Run(result);
3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// static
3261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void DevToolsTargetImpl::EnumerateAllTargets(Callback callback) {
3271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::BrowserThread::PostTask(
3291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      content::BrowserThread::IO,
3301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      FROM_HERE,
3311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::Bind(&DevToolsTargetImpl::EnumerateWorkerTargets,
3321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 base::Bind(&CollectAllTargets, callback)));
3331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
334