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"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/profiles/profile.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/browser_resources.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/socket/tcp_listen_socket.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace {
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kMinTetheringPort = 9333;
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kMaxTetheringPort = 9444;
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbase::LazyInstance<bool>::Leaky g_tethering_enabled = LAZY_INSTANCE_INITIALIZER;
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// static
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BrowserListTabContentsProvider::EnableTethering() {
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  g_tethering_enabled.Get() = true;
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserListTabContentsProvider::BrowserListTabContentsProvider(
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::HostDesktopType host_desktop_type)
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : host_desktop_type_(host_desktop_type),
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      last_tethering_port_(kMinTetheringPort) {
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  g_tethering_enabled.Get() = false;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserListTabContentsProvider::~BrowserListTabContentsProvider() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BrowserListTabContentsProvider::GetDiscoveryPageHTML() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<Profile*> profiles;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next())
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profiles.insert((*it)->profile());
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<Profile*>::iterator it = profiles.begin();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != profiles.end(); ++it) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history::TopSites* ts = (*it)->GetTopSites();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ts) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TopSites updates itself after a delay. Ask TopSites to update itself
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // when we're about to show the remote debugging landing page.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ts->SyncWithHistory();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ResourceBundle::GetSharedInstance().GetRawDataResource(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDR_DEVTOOLS_DISCOVERY_PAGE_HTML).as_string();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserListTabContentsProvider::BundlesFrontendResources() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath BrowserListTabContentsProvider::GetDebugFrontendDir() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(DEBUG_DEVTOOLS)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath inspector_dir;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(chrome::DIR_INSPECTOR, &inspector_dir);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return inspector_dir;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::FilePath();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<net::StreamListenSocket>
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BrowserListTabContentsProvider::CreateSocketForTethering(
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    net::StreamListenSocket::Delegate* delegate,
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string* name) {
810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!g_tethering_enabled.Get())
820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return scoped_ptr<net::StreamListenSocket>();
830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (last_tethering_port_ == kMaxTetheringPort)
850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    last_tethering_port_ = kMinTetheringPort;
860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int port = ++last_tethering_port_;
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *name = base::IntToString(port);
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return net::TCPListenSocket::CreateAndListen("127.0.0.1", port, delegate)
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      .PassAs<net::StreamListenSocket>();
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
91