1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/devtools/remote_debugging_server.h" 6 7 #include "base/path_service.h" 8 #include "chrome/browser/devtools/browser_list_tabcontents_provider.h" 9 #include "chrome/browser/ui/webui/devtools_ui.h" 10 #include "chrome/common/chrome_paths.h" 11 #include "content/public/browser/devtools_http_handler.h" 12 #include "net/socket/tcp_server_socket.h" 13 14 namespace { 15 16 class TCPServerSocketFactory 17 : public content::DevToolsHttpHandler::ServerSocketFactory { 18 public: 19 TCPServerSocketFactory(const std::string& address, int port, int backlog) 20 : content::DevToolsHttpHandler::ServerSocketFactory( 21 address, port, backlog) {} 22 23 private: 24 // content::DevToolsHttpHandler::ServerSocketFactory. 25 virtual scoped_ptr<net::ServerSocket> Create() const OVERRIDE { 26 return scoped_ptr<net::ServerSocket>( 27 new net::TCPServerSocket(NULL, net::NetLog::Source())); 28 } 29 30 DISALLOW_COPY_AND_ASSIGN(TCPServerSocketFactory); 31 }; 32 33 } // namespace 34 35 RemoteDebuggingServer::RemoteDebuggingServer( 36 chrome::HostDesktopType host_desktop_type, 37 const std::string& ip, 38 int port) { 39 base::FilePath output_dir; 40 if (!port) { 41 // The client requested an ephemeral port. Must write the selected 42 // port to a well-known location in the profile directory to 43 // bootstrap the connection process. 44 bool result = PathService::Get(chrome::DIR_USER_DATA, &output_dir); 45 DCHECK(result); 46 } 47 48 scoped_ptr<content::DevToolsHttpHandler::ServerSocketFactory> factory( 49 new TCPServerSocketFactory(ip, port, 1)); 50 devtools_http_handler_ = content::DevToolsHttpHandler::Start( 51 factory.Pass(), 52 "", 53 new BrowserListTabContentsProvider(host_desktop_type), 54 output_dir); 55 } 56 57 RemoteDebuggingServer::~RemoteDebuggingServer() { 58 devtools_http_handler_->Stop(); 59 } 60