1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/values.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/devtools/devtools_target_impl.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/history/top_sites.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/profiles/profile_manager.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/browser.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/browser_iterator.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/web_contents.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate() 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : network_protocol_handler_(new DevToolsNetworkProtocolHandler()) { 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ChromeDevToolsManagerDelegate::~ChromeDevToolsManagerDelegate() { 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeDevToolsManagerDelegate::Inspect( 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::BrowserContext* browser_context, 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::DevToolsAgentHost* agent_host) { 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!agent_host->IsWorker()) { 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(horo): Support other types of DevToolsAgentHost when necessary. 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED() << "Inspect() only supports workers."; 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (Profile* profile = Profile::FromBrowserContext(browser_context)) 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DevToolsWindow::OpenDevToolsWindowForWorker(profile, agent_host); 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)base::DictionaryValue* ChromeDevToolsManagerDelegate::HandleCommand( 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::DevToolsAgentHost* agent_host, 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::DictionaryValue* command_dict) { 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return network_protocol_handler_->HandleCommand(agent_host, command_dict); 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ChromeDevToolsManagerDelegate::DevToolsAgentStateChanged( 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) content::DevToolsAgentHost* agent_host, 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool attached) { 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci network_protocol_handler_->DevToolsAgentStateChanged(agent_host, attached); 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string ChromeDevToolsManagerDelegate::GetPageThumbnailData( 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& url) { 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (chrome::BrowserIterator it; !it.done(); it.Next()) { 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Profile* profile = (*it)->profile(); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci history::TopSites* top_sites = profile->GetTopSites(); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!top_sites) 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue; 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<base::RefCountedMemory> data; 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (top_sites->GetPageThumbnail(url, false, &data)) 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return std::string(data->front_as<char>(), data->size()); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return std::string(); 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<content::DevToolsTarget> 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciChromeDevToolsManagerDelegate::CreateNewTarget(const GURL& url) { 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chrome::NavigateParams params(ProfileManager::GetLastUsedProfile(), 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci url, ui::PAGE_TRANSITION_AUTO_TOPLEVEL); 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.disposition = NEW_FOREGROUND_TAB; 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chrome::Navigate(¶ms); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!params.target_contents) 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<content::DevToolsTarget>(); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<content::DevToolsTarget>( 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DevToolsTargetImpl::CreateForWebContents(params.target_contents, true)); 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ChromeDevToolsManagerDelegate::EnumerateTargets(TargetCallback callback) { 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DevToolsTargetImpl::EnumerateAllTargets( 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *reinterpret_cast<DevToolsTargetImpl::Callback*>(&callback)); 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 80