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