Index: chrome/browser/devtools/browser_list_tabcontents_provider.cc |
diff --git a/chrome/browser/devtools/browser_list_tabcontents_provider.cc b/chrome/browser/devtools/browser_list_tabcontents_provider.cc |
index 99a0ec2c0decf4df98bd8355bde50393c98714e8..f464fa4d5ee35fa9ede2fc83395ae58679271770 100644 |
--- a/chrome/browser/devtools/browser_list_tabcontents_provider.cc |
+++ b/chrome/browser/devtools/browser_list_tabcontents_provider.cc |
@@ -6,7 +6,11 @@ |
#include "base/path_service.h" |
#include "base/strings/string_number_conversions.h" |
-#include "chrome/browser/devtools/devtools_target_impl.h" |
+#include "base/strings/stringprintf.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "chrome/browser/extensions/extension_host.h" |
+#include "chrome/browser/extensions/extension_service.h" |
+#include "chrome/browser/extensions/extension_system.h" |
#include "chrome/browser/history/top_sites.h" |
#include "chrome/browser/profiles/profile_manager.h" |
#include "chrome/browser/ui/browser.h" |
@@ -15,9 +19,14 @@ |
#include "chrome/browser/ui/browser_list.h" |
#include "chrome/browser/ui/browser_tabstrip.h" |
#include "chrome/browser/ui/host_desktop.h" |
+#include "chrome/browser/ui/tab_contents/tab_contents_iterator.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/common/chrome_paths.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/devtools_target.h" |
+#include "content/public/browser/favicon_status.h" |
+#include "content/public/browser/navigation_entry.h" |
+#include "content/public/browser/render_view_host.h" |
#include "content/public/browser/web_contents.h" |
#include "content/public/common/url_constants.h" |
#include "grit/devtools_discovery_page_resources.h" |
@@ -25,9 +34,142 @@ |
#include "net/url_request/url_request_context_getter.h" |
#include "ui/base/resource/resource_bundle.h" |
+using content::DevToolsAgentHost; |
+using content::DevToolsHttpHandlerDelegate; |
using content::DevToolsTarget; |
+using content::RenderViewHost; |
using content::WebContents; |
+namespace { |
+ |
+const char kTargetTypePage[] = "page"; |
+const char kTargetTypeOther[] = "other"; |
+ |
+std::string GetExtensionName(WebContents* web_contents) { |
+ Profile* profile = |
+ Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
+ if (!profile) |
+ return std::string(); |
+ |
+ extensions::ExtensionHost* extension_host = |
+ extensions::ExtensionSystem::Get(profile)->process_manager()-> |
+ GetBackgroundHostForExtension(web_contents->GetURL().host()); |
+ |
+ if (!extension_host || extension_host->host_contents() != web_contents) |
+ return std::string(); |
+ |
+ return extension_host->extension()->name(); |
+} |
+ |
+class Target : public content::DevToolsTarget { |
+ public: |
+ Target(WebContents* web_contents, bool is_tab); |
+ |
+ virtual std::string GetId() const OVERRIDE { return id_; } |
+ virtual std::string GetType() const OVERRIDE { return type_; } |
+ virtual std::string GetTitle() const OVERRIDE { return title_; } |
+ virtual std::string GetDescription() const OVERRIDE { return description_; } |
+ virtual GURL GetUrl() const OVERRIDE { return url_; } |
+ virtual GURL GetFaviconUrl() const OVERRIDE { return favicon_url_; } |
+ virtual base::TimeTicks GetLastActivityTime() const OVERRIDE { |
+ return last_activity_time_; |
+ } |
+ virtual bool IsAttached() const OVERRIDE { |
+ return agent_host_->IsAttached(); |
+ } |
+ virtual scoped_refptr<DevToolsAgentHost> GetAgentHost() const OVERRIDE { |
+ return agent_host_; |
+ } |
+ virtual bool Activate() const OVERRIDE; |
+ virtual bool Close() const OVERRIDE; |
+ |
+ private: |
+ scoped_refptr<DevToolsAgentHost> agent_host_; |
+ std::string id_; |
+ std::string type_; |
+ std::string title_; |
+ std::string description_; |
+ GURL url_; |
+ GURL favicon_url_; |
+ base::TimeTicks last_activity_time_; |
+}; |
+ |
+Target::Target(WebContents* web_contents, bool is_tab) { |
+ agent_host_ = |
+ DevToolsAgentHost::GetOrCreateFor(web_contents->GetRenderViewHost()); |
+ id_ = agent_host_->GetId(); |
+ type_ = is_tab ? kTargetTypePage : kTargetTypeOther; |
+ description_ = GetExtensionName(web_contents); |
+ title_ = UTF16ToUTF8(web_contents->GetTitle()); |
+ url_ = web_contents->GetURL(); |
+ content::NavigationController& controller = web_contents->GetController(); |
+ content::NavigationEntry* entry = controller.GetActiveEntry(); |
+ if (entry != NULL && entry->GetURL().is_valid()) |
+ favicon_url_ = entry->GetFavicon().url; |
+ last_activity_time_ = web_contents->GetLastSelectedTime(); |
+} |
+ |
+bool Target::Activate() const { |
+ RenderViewHost* rvh = agent_host_->GetRenderViewHost(); |
+ if (!rvh) |
+ return false; |
+ WebContents* web_contents = WebContents::FromRenderViewHost(rvh); |
+ if (!web_contents) |
+ return false; |
+ web_contents->GetDelegate()->ActivateContents(web_contents); |
+ return true; |
+} |
+ |
+bool Target::Close() const { |
+ RenderViewHost* rvh = agent_host_->GetRenderViewHost(); |
+ if (!rvh) |
+ return false; |
+ rvh->ClosePage(); |
+ return true; |
+} |
+ |
+class WorkerTarget : public content::DevToolsTarget { |
+ public: |
+ explicit WorkerTarget(const content::WorkerService::WorkerInfo& worker_info); |
+ |
+ virtual std::string GetId() const OVERRIDE { return id_; } |
+ virtual std::string GetType() const OVERRIDE { return "other"; } |
+ virtual std::string GetTitle() const OVERRIDE { return title_; } |
+ virtual std::string GetDescription() const OVERRIDE { return description_; } |
+ virtual GURL GetUrl() const OVERRIDE { return url_; } |
+ virtual GURL GetFaviconUrl() const OVERRIDE { return GURL(); } |
+ virtual base::TimeTicks GetLastActivityTime() const OVERRIDE { |
+ return base::TimeTicks(); |
+ } |
+ virtual bool IsAttached() const OVERRIDE { |
+ return agent_host_->IsAttached(); |
+ } |
+ virtual scoped_refptr<DevToolsAgentHost> GetAgentHost() const OVERRIDE { |
+ return agent_host_; |
+ } |
+ virtual bool Activate() const OVERRIDE { return false; } |
+ virtual bool Close() const OVERRIDE { return false; } |
+ |
+ private: |
+ scoped_refptr<DevToolsAgentHost> agent_host_; |
+ std::string id_; |
+ std::string title_; |
+ std::string description_; |
+ GURL url_; |
+}; |
+ |
+WorkerTarget::WorkerTarget(const content::WorkerService::WorkerInfo& worker) { |
+ agent_host_ = |
+ DevToolsAgentHost::GetForWorker(worker.process_id, worker.route_id); |
+ id_ = agent_host_->GetId(); |
+ title_ = UTF16ToUTF8(worker.name); |
+ description_ = |
+ base::StringPrintf("Worker pid:%d", base::GetProcId(worker.handle)); |
+ url_ = worker.url; |
+} |
+ |
+} // namespace |
+ |
BrowserListTabContentsProvider::BrowserListTabContentsProvider( |
chrome::HostDesktopType host_desktop_type) |
: host_desktop_type_(host_desktop_type) { |
@@ -85,7 +227,7 @@ std::string BrowserListTabContentsProvider::GetPageThumbnailData( |
} |
scoped_ptr<DevToolsTarget> |
-BrowserListTabContentsProvider::CreateNewTarget(const GURL& url) { |
+BrowserListTabContentsProvider::CreateNewTarget() { |
const BrowserList* browser_list = |
BrowserList::GetInstance(host_desktop_type_); |
WebContents* web_contents; |
@@ -96,21 +238,23 @@ BrowserListTabContentsProvider::CreateNewTarget(const GURL& url) { |
return scoped_ptr<DevToolsTarget>(); |
web_contents = |
browser_list->get(0)->tab_strip_model()->GetActiveWebContents(); |
- web_contents->GetController().LoadURL(url, |
- content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
} else { |
web_contents = chrome::AddSelectedTabWithURL( |
browser_list->get(0), |
- url, |
+ GURL(content::kAboutBlankURL), |
content::PAGE_TRANSITION_LINK); |
} |
- return scoped_ptr<DevToolsTarget>( |
- DevToolsTargetImpl::CreateForWebContents(web_contents)); |
+ return scoped_ptr<DevToolsTarget>(new Target(web_contents, true)); |
} |
- |
void BrowserListTabContentsProvider::EnumerateTargets(TargetCallback callback) { |
- DevToolsTargetImpl::EnumerateAllTargets( |
- *reinterpret_cast<DevToolsTargetImpl::Callback*>(&callback)); |
+ content::BrowserThread::PostTaskAndReplyWithResult( |
+ content::BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&BrowserListTabContentsProvider::GetWorkerInfo, |
+ base::Unretained(this)), |
+ base::Bind(&BrowserListTabContentsProvider::RespondWithTargetList, |
+ base::Unretained(this), |
+ callback)); |
} |
#if defined(DEBUG_DEVTOOLS) |
@@ -135,3 +279,33 @@ BrowserListTabContentsProvider::CreateSocketForTethering( |
return scoped_ptr<net::StreamListenSocket>(); |
} |
#endif // defined(DEBUG_DEVTOOLS) |
+ |
+BrowserListTabContentsProvider::WorkerInfoList |
+BrowserListTabContentsProvider::GetWorkerInfo() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
+ return content::WorkerService::GetInstance()->GetWorkers(); |
+} |
+ |
+void BrowserListTabContentsProvider::RespondWithTargetList( |
+ TargetCallback callback, const WorkerInfoList& worker_info_list) { |
+ std::set<RenderViewHost*> tab_rvhs; |
+ for (TabContentsIterator it; !it.done(); it.Next()) |
+ tab_rvhs.insert(it->GetRenderViewHost()); |
+ |
+ TargetList targets; |
+ |
+ 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(); |
+ WebContents* web_contents = WebContents::FromRenderViewHost(*it); |
+ if (web_contents) |
+ targets.push_back(new Target(web_contents, is_tab)); |
+ } |
+ |
+ for (size_t i = 0; i < worker_info_list.size(); ++i) |
+ targets.push_back(new WorkerTarget(worker_info_list[i])); |
+ |
+ callback.Run(targets); |
+} |