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