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