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