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 ea81477c4767e65d3a9e1bdcb91c0d390d2f37ea..269212439e3e2cfa18ea0b6d54611c0e738fe29a 100644 |
--- a/chrome/browser/devtools/devtools_target_impl.cc |
+++ b/chrome/browser/devtools/devtools_target_impl.cc |
@@ -28,6 +28,151 @@ |
using content::DevToolsAgentHost; |
using content::WebContents; |
+const char DevToolsTargetImpl::kTargetTypeApp[] = "app"; |
+const char DevToolsTargetImpl::kTargetTypeBackgroundPage[] = "background_page"; |
+const char DevToolsTargetImpl::kTargetTypePage[] = "page"; |
+const char DevToolsTargetImpl::kTargetTypeWorker[] = "worker"; |
+const char DevToolsTargetImpl::kTargetTypeWebView[] = "webview"; |
+const char DevToolsTargetImpl::kTargetTypeIFrame[] = "iframe"; |
+const char DevToolsTargetImpl::kTargetTypeNode[] = "node"; |
+const char DevToolsTargetImpl::kTargetTypeOther[] = "other"; |
+const char DevToolsTargetImpl::kTargetTypeServiceWorker[] = "service_worker"; |
+ |
+namespace { |
+ |
+// WebContentsTarget -------------------------------------------------------- |
+ |
+class WebContentsTarget : public DevToolsTargetImpl { |
+ public: |
+ WebContentsTarget(WebContents* web_contents, bool is_tab); |
+ |
+ // DevToolsTargetImpl overrides. |
+ int GetTabId() const override; |
+ std::string GetExtensionId() const override; |
+ void Inspect(Profile* profile) const override; |
+ |
+ private: |
+ int tab_id_; |
+ std::string extension_id_; |
+}; |
+ |
+WebContentsTarget::WebContentsTarget(WebContents* web_contents, bool is_tab) |
+ : DevToolsTargetImpl(DevToolsAgentHost::GetOrCreateFor(web_contents)), |
+ tab_id_(-1) { |
+ set_type(kTargetTypeOther); |
+ |
+ guest_view::GuestViewBase* guest = |
+ guest_view::GuestViewBase::FromWebContents(web_contents); |
+ WebContents* guest_contents = guest ? guest->embedder_web_contents() : NULL; |
+ if (guest_contents) { |
+ set_type(kTargetTypeWebView); |
+ set_parent_id(DevToolsAgentHost::GetOrCreateFor(guest_contents)->GetId()); |
+ return; |
+ } |
+ |
+ if (is_tab) { |
+ set_type(kTargetTypePage); |
+ tab_id_ = extensions::ExtensionTabUtil::GetTabId(web_contents); |
+ return; |
+ } |
+ |
+ const extensions::Extension* extension = extensions::ExtensionRegistry::Get( |
+ web_contents->GetBrowserContext())->enabled_extensions().GetByID( |
+ GetURL().host()); |
+ if (!extension) |
+ return; |
+ |
+ Profile* profile = |
+ Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
+ if (!profile) |
+ return; |
+ set_title(extension->name()); |
+ extensions::ExtensionHost* extension_host = |
+ extensions::ProcessManager::Get(profile) |
+ ->GetBackgroundHostForExtension(extension->id()); |
+ if (extension_host && |
+ extension_host->host_contents() == web_contents) { |
+ set_type(kTargetTypeBackgroundPage); |
+ extension_id_ = extension->id(); |
+ } else if (extension->is_hosted_app() |
+ || extension->is_legacy_packaged_app() |
+ || extension->is_platform_app()) { |
+ set_type(kTargetTypeApp); |
+ } |
+ set_favicon_url(extensions::ExtensionIconSource::GetIconURL( |
+ extension, extension_misc::EXTENSION_ICON_SMALLISH, |
+ ExtensionIconSet::MATCH_BIGGER, false, NULL)); |
+} |
+ |
+int WebContentsTarget::GetTabId() const { |
+ return tab_id_; |
+} |
+ |
+std::string WebContentsTarget::GetExtensionId() const { |
+ return extension_id_; |
+} |
+ |
+void WebContentsTarget::Inspect(Profile* profile) const { |
+ WebContents* web_contents = GetWebContents(); |
+ if (!web_contents) |
+ return; |
+ DevToolsWindow::OpenDevToolsWindow(web_contents); |
+} |
+ |
+// FrameTarget ---------------------------------------------------------------- |
+ |
+class FrameTarget : public DevToolsTargetImpl { |
+ public: |
+ explicit FrameTarget(scoped_refptr<DevToolsAgentHost> agent_host); |
+ |
+ // DevToolsTargetImpl overrides: |
+ void Inspect(Profile* profile) const override; |
+}; |
+ |
+FrameTarget::FrameTarget(scoped_refptr<DevToolsAgentHost> agent_host) |
+ : DevToolsTargetImpl(agent_host) { |
+ set_type(kTargetTypeIFrame); |
+ WebContents* wc = agent_host->GetWebContents(); |
+ DCHECK(DevToolsAgentHost::GetOrCreateFor(wc).get() != agent_host.get()); |
+ set_parent_id(DevToolsAgentHost::GetOrCreateFor(wc)->GetId()); |
+} |
+ |
+void FrameTarget::Inspect(Profile* profile) const { |
+ DevToolsWindow::OpenDevToolsWindow(profile, GetAgentHost()); |
+} |
+ |
+// WorkerTarget ---------------------------------------------------------------- |
+ |
+class WorkerTarget : public DevToolsTargetImpl { |
+ public: |
+ explicit WorkerTarget(scoped_refptr<DevToolsAgentHost> agent_host); |
+ |
+ // DevToolsTargetImpl overrides: |
+ void Inspect(Profile* profile) const override; |
+}; |
+ |
+WorkerTarget::WorkerTarget(scoped_refptr<DevToolsAgentHost> agent_host) |
+ : DevToolsTargetImpl(agent_host) { |
+ switch (agent_host->GetType()) { |
+ case DevToolsAgentHost::TYPE_SHARED_WORKER: |
+ set_type(kTargetTypeWorker); |
+ break; |
+ case DevToolsAgentHost::TYPE_SERVICE_WORKER: |
+ set_type(kTargetTypeServiceWorker); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ } |
+} |
+ |
+void WorkerTarget::Inspect(Profile* profile) const { |
+ DevToolsWindow::OpenDevToolsWindowForWorker(profile, GetAgentHost()); |
+} |
+ |
+} // namespace |
+ |
+// DevToolsTargetImpl ---------------------------------------------------------- |
+ |
DevToolsTargetImpl::~DevToolsTargetImpl() { |
} |
@@ -36,15 +181,70 @@ |
: devtools_discovery::BasicTargetDescriptor(agent_host) { |
} |
+int DevToolsTargetImpl::GetTabId() const { |
+ return -1; |
+} |
+ |
+WebContents* DevToolsTargetImpl::GetWebContents() const { |
+ return GetAgentHost()->GetWebContents(); |
+} |
+ |
+std::string DevToolsTargetImpl::GetExtensionId() const { |
+ return std::string(); |
+} |
+ |
+void DevToolsTargetImpl::Inspect(Profile* /*profile*/) const { |
+} |
+ |
+void DevToolsTargetImpl::Reload() const { |
+} |
+ |
+// static |
+std::unique_ptr<DevToolsTargetImpl> DevToolsTargetImpl::CreateForTab( |
+ content::WebContents* web_contents) { |
+ // TODO(dgozman): these checks should not be necessary. See |
+ // http://crbug.com/489664. |
+ if (!web_contents) |
+ return nullptr; |
+ if (!DevToolsAgentHost::GetOrCreateFor(web_contents)) |
+ return nullptr; |
+ return std::unique_ptr<DevToolsTargetImpl>( |
+ new WebContentsTarget(web_contents, true)); |
+} |
+ |
// static |
std::vector<DevToolsTargetImpl*> DevToolsTargetImpl::EnumerateAll() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ |
+ std::set<WebContents*> tab_web_contents; |
+ for (TabContentsIterator it; !it.done(); it.Next()) |
+ tab_web_contents.insert(*it); |
std::vector<DevToolsTargetImpl*> result; |
DevToolsAgentHost::List agents = DevToolsAgentHost::GetOrCreateAll(); |
for (DevToolsAgentHost::List::iterator it = agents.begin(); |
it != agents.end(); ++it) { |
- result.push_back(new DevToolsTargetImpl(*it)); |
+ DevToolsAgentHost* agent_host = (*it).get(); |
+ switch (agent_host->GetType()) { |
+ case DevToolsAgentHost::TYPE_WEB_CONTENTS: |
+ if (WebContents* web_contents = agent_host->GetWebContents()) { |
+ const bool is_tab = |
+ tab_web_contents.find(web_contents) != tab_web_contents.end(); |
+ result.push_back(new WebContentsTarget(web_contents, is_tab)); |
+ } |
+ break; |
+ case DevToolsAgentHost::TYPE_FRAME: |
+ result.push_back(new FrameTarget(agent_host)); |
+ break; |
+ case DevToolsAgentHost::TYPE_SHARED_WORKER: |
+ result.push_back(new WorkerTarget(agent_host)); |
+ break; |
+ case DevToolsAgentHost::TYPE_SERVICE_WORKER: |
+ result.push_back(new WorkerTarget(agent_host)); |
+ break; |
+ default: |
+ break; |
+ } |
} |
return result; |
} |