11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "android_webview/browser/aw_dev_tools_manager_delegate.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "android_webview/native/aw_contents.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/json/json_writer.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/stringprintf.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/utf_string_conversions.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/values.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/devtools_agent_host.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/devtools_target.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/web_contents.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing content::DevToolsAgentHost;
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing content::RenderViewHost;
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing content::WebContents;
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTargetTypePage[] = "page";
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTargetTypeServiceWorker[] = "service_worker";
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTargetTypeOther[] = "other";
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string GetViewDescription(WebContents* web_contents);
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass Target : public content::DevToolsTarget {
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit Target(scoped_refptr<DevToolsAgentHost> agent_host);
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::string GetId() const OVERRIDE { return agent_host_->GetId(); }
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::string GetParentId() const OVERRIDE { return std::string(); }
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::string GetType() const OVERRIDE {
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (agent_host_->GetType()) {
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case DevToolsAgentHost::TYPE_WEB_CONTENTS:
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return kTargetTypePage;
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case DevToolsAgentHost::TYPE_SERVICE_WORKER:
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return kTargetTypeServiceWorker;
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return kTargetTypeOther;
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::string GetTitle() const OVERRIDE {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return agent_host_->GetTitle();
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::string GetDescription() const OVERRIDE { return description_; }
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual GURL GetURL() const OVERRIDE { return agent_host_->GetURL(); }
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual GURL GetFaviconURL() const OVERRIDE { return GURL(); }
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual base::TimeTicks GetLastActivityTime() const OVERRIDE {
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return last_activity_time_;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool IsAttached() const OVERRIDE {
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return agent_host_->IsAttached();
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual scoped_refptr<DevToolsAgentHost> GetAgentHost() const OVERRIDE {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return agent_host_;
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool Activate() const OVERRIDE { return agent_host_->Activate(); }
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool Close() const OVERRIDE { return agent_host_->Close(); }
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<DevToolsAgentHost> agent_host_;
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string description_;
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::TimeTicks last_activity_time_;
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTarget::Target(scoped_refptr<DevToolsAgentHost> agent_host)
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : agent_host_(agent_host) {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (WebContents* web_contents = agent_host->GetWebContents()) {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    description_ = GetViewDescription(web_contents);
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    last_activity_time_ = web_contents->GetLastActiveTime();
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string GetViewDescription(WebContents* web_contents) {
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const android_webview::BrowserViewRenderer* bvr =
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      android_webview::AwContents::FromWebContents(web_contents)
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ->GetBrowserViewRenderer();
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!bvr) return "";
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::DictionaryValue description;
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  description.SetBoolean("attached", bvr->attached_to_window());
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  description.SetBoolean("visible", bvr->IsVisible());
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Rect screen_rect = bvr->GetScreenRect();
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  description.SetInteger("screenX", screen_rect.x());
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  description.SetInteger("screenY", screen_rect.y());
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  description.SetBoolean("empty", screen_rect.size().IsEmpty());
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!screen_rect.size().IsEmpty()) {
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    description.SetInteger("width", screen_rect.width());
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    description.SetInteger("height", screen_rect.height());
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string json;
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::JSONWriter::Write(&description, &json);
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return json;
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace android_webview {
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciAwDevToolsManagerDelegate::AwDevToolsManagerDelegate() {
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciAwDevToolsManagerDelegate::~AwDevToolsManagerDelegate() {
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::DictionaryValue* AwDevToolsManagerDelegate::HandleCommand(
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content::DevToolsAgentHost* agent_host,
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::DictionaryValue* command_dict) {
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid AwDevToolsManagerDelegate::EnumerateTargets(TargetCallback callback) {
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TargetList targets;
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DevToolsAgentHost::List agents = DevToolsAgentHost::GetOrCreateAll();
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (DevToolsAgentHost::List::iterator it = agents.begin();
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      it != agents.end(); ++it) {
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    targets.push_back(new Target(*it));
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  callback.Run(targets);
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string AwDevToolsManagerDelegate::GetPageThumbnailData(const GURL&) {
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return "";
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<content::DevToolsTarget> AwDevToolsManagerDelegate::CreateNewTarget(
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL&) {
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return scoped_ptr<content::DevToolsTarget>();
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace android_webview
135