browser_list_tabcontents_provider.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/browser_list_tabcontents_provider.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/devtools/devtools_target_impl.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/browser_resources.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/socket/tcp_listen_socket.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using content::DevToolsTarget;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using content::WebContents;
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserListTabContentsProvider::BrowserListTabContentsProvider(
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::HostDesktopType host_desktop_type)
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : host_desktop_type_(host_desktop_type) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserListTabContentsProvider::~BrowserListTabContentsProvider() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BrowserListTabContentsProvider::GetDiscoveryPageHTML() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<Profile*> profiles;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next())
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profiles.insert((*it)->profile());
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<Profile*>::iterator it = profiles.begin();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != profiles.end(); ++it) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history::TopSites* ts = (*it)->GetTopSites();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ts) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TopSites updates itself after a delay. Ask TopSites to update itself
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // when we're about to show the remote debugging landing page.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ts->SyncWithHistory();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ResourceBundle::GetSharedInstance().GetRawDataResource(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDR_DEVTOOLS_DISCOVERY_PAGE_HTML).as_string();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserListTabContentsProvider::BundlesFrontendResources() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath BrowserListTabContentsProvider::GetDebugFrontendDir() {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(DEBUG_DEVTOOLS)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath inspector_dir;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(chrome::DIR_INSPECTOR, &inspector_dir);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return inspector_dir;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::FilePath();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BrowserListTabContentsProvider::GetPageThumbnailData(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url) {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next()) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile = (*it)->profile();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history::TopSites* top_sites = profile->GetTopSites();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!top_sites)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> data;
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (top_sites->GetPageThumbnail(url, false, &data))
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return std::string(data->front_as<char>(), data->size());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)scoped_ptr<DevToolsTarget>
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)BrowserListTabContentsProvider::CreateNewTarget(const GURL& url) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const BrowserList* browser_list =
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserList::GetInstance(host_desktop_type_);
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebContents* web_contents;
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (browser_list->empty()) {
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    chrome::NewEmptyWindow(ProfileManager::GetLastUsedProfile(),
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        host_desktop_type_);
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (browser_list->empty())
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return scoped_ptr<DevToolsTarget>();
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    web_contents =
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        browser_list->get(0)->tab_strip_model()->GetActiveWebContents();
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    web_contents->GetController().LoadURL(url,
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string());
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    web_contents = chrome::AddSelectedTabWithURL(
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser_list->get(0),
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      url,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::PAGE_TRANSITION_LINK);
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::RenderViewHost* rvh = web_contents->GetRenderViewHost();
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!rvh)
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return scoped_ptr<DevToolsTarget>();
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return scoped_ptr<DevToolsTarget>(
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DevToolsTargetImpl::CreateForRenderViewHost(rvh, true));
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BrowserListTabContentsProvider::EnumerateTargets(TargetCallback callback) {
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DevToolsTargetImpl::EnumerateAllTargets(
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      *reinterpret_cast<DevToolsTargetImpl::Callback*>(&callback));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(DEBUG_DEVTOOLS)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static int g_last_tethering_port_ = 9333;
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<net::StreamListenSocket>
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BrowserListTabContentsProvider::CreateSocketForTethering(
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    net::StreamListenSocket::Delegate* delegate,
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string* name) {
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (g_last_tethering_port_ == 9444)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    g_last_tethering_port_ = 9333;
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int port = ++g_last_tethering_port_;
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *name = base::IntToString(port);
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return net::TCPListenSocket::CreateAndListen("127.0.0.1", port, delegate)
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      .PassAs<net::StreamListenSocket>();
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<net::StreamListenSocket>
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BrowserListTabContentsProvider::CreateSocketForTethering(
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    net::StreamListenSocket::Delegate* delegate,
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string* name) {
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return scoped_ptr<net::StreamListenSocket>();
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // defined(DEBUG_DEVTOOLS)
140