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