cast_dev_tools_delegate.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file. 46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chromecast/shell/browser/devtools/cast_dev_tools_delegate.h" 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/files/file_path.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/macros.h" 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/devtools_target.h" 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/favicon_status.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/web_contents.h" 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "grit/shell_resources.h" 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace chromecast { 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace shell { 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace { 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kTargetTypePage[] = "page"; 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class Target : public content::DevToolsTarget { 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public: 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) explicit Target(content::WebContents* web_contents); 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual std::string GetId() const OVERRIDE { return id_; } 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual std::string GetParentId() const OVERRIDE { return std::string(); } 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual std::string GetType() const OVERRIDE { return kTargetTypePage; } 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual std::string GetTitle() const OVERRIDE { return title_; } 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual std::string GetDescription() const OVERRIDE { return std::string(); } 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual GURL GetURL() const OVERRIDE { return url_; } 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual GURL GetFaviconURL() const OVERRIDE { return favicon_url_; } 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual base::TimeTicks GetLastActivityTime() const OVERRIDE { 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return last_activity_time_; 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual bool IsAttached() const OVERRIDE { 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return agent_host_->IsAttached(); 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual scoped_refptr<content::DevToolsAgentHost> GetAgentHost() 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const OVERRIDE { 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return agent_host_; 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual bool Activate() const OVERRIDE; 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual bool Close() const OVERRIDE; 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private: 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<content::DevToolsAgentHost> agent_host_; 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string id_; 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string title_; 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GURL url_; 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GURL favicon_url_; 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::TimeTicks last_activity_time_; 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Target); 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)Target::Target(content::WebContents* web_contents) { 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) agent_host_ = content::DevToolsAgentHost::GetOrCreateFor(web_contents); 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) id_ = agent_host_->GetId(); 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) title_ = base::UTF16ToUTF8(web_contents->GetTitle()); 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) url_ = web_contents->GetURL(); 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::NavigationController& controller = web_contents->GetController(); 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::NavigationEntry* entry = controller.GetActiveEntry(); 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (entry != NULL && entry->GetURL().is_valid()) 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) favicon_url_ = entry->GetFavicon().url; 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_activity_time_ = web_contents->GetLastActiveTime(); 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool Target::Activate() const { 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::WebContents* web_contents = agent_host_->GetWebContents(); 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!web_contents) 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_contents->GetDelegate()->ActivateContents(web_contents); 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return true; 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool Target::Close() const { 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::WebContents* web_contents = agent_host_->GetWebContents(); 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!web_contents) 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_contents->GetRenderViewHost()->ClosePage(); 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return true; 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace 916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)CastDevToolsDelegate::CastDevToolsDelegate() { 936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)CastDevToolsDelegate::~CastDevToolsDelegate() { 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::string CastDevToolsDelegate::GetDiscoveryPageHTML() { 996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(OS_ANDROID) 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return std::string(); 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#else 1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return ResourceBundle::GetSharedInstance().GetRawDataResource( 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) IDR_CAST_SHELL_DEVTOOLS_DISCOVERY_PAGE).as_string(); 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif // defined(OS_ANDROID) 1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool CastDevToolsDelegate::BundlesFrontendResources() { 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(OS_ANDROID) 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Since Android remote debugging connects over a Unix domain socket, Chrome 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // will not load the same homepage. 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#else 1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return true; 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif // defined(OS_ANDROID) 1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)base::FilePath CastDevToolsDelegate::GetDebugFrontendDir() { 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return base::FilePath(); 1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::string CastDevToolsDelegate::GetPageThumbnailData(const GURL& url) { 1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return ""; 1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)scoped_ptr<content::DevToolsTarget> CastDevToolsDelegate::CreateNewTarget( 1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL& url) { 1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return scoped_ptr<content::DevToolsTarget>(); 1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void CastDevToolsDelegate::EnumerateTargets(TargetCallback callback) { 1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TargetList targets; 1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::vector<content::WebContents*> wc_list = 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::DevToolsAgentHost::GetInspectableWebContents(); 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (std::vector<content::WebContents*>::iterator it = wc_list.begin(); 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) it != wc_list.end(); 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ++it) { 1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) targets.push_back(new Target(*it)); 1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) callback.Run(targets); 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)scoped_ptr<net::StreamListenSocket> 1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)CastDevToolsDelegate::CreateSocketForTethering( 1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) net::StreamListenSocket::Delegate* delegate, 1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string* name) { 1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return scoped_ptr<net::StreamListenSocket>(); 1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace shell 1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace chromecast 151