Commit 8bf9ce70 authored by pliard@chromium.org's avatar pliard@chromium.org

Decouple DevTools from socket implementation.

This is part of Chrome for Android upstreaming.

This will let us use a UnixDomainSocket for DevTools on Android.

Note that this CL depends on CL 10161005 (which should land soon).

TEST=net_unittests

Review URL: https://chromiumcodereview.appspot.com/10386048

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@138497 0039d316-1c4b-4281-b951-d872f2087c98
parent eeb34acd
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "chrome/browser/ui/webui/chrome_url_data_manager.h" #include "chrome/browser/ui/webui/chrome_url_data_manager.h"
#include "chrome/browser/ui/webui/devtools_ui.h" #include "chrome/browser/ui/webui/devtools_ui.h"
#include "content/public/browser/devtools_http_handler.h" #include "content/public/browser/devtools_http_handler.h"
#include "net/base/tcp_listen_socket.h"
RemoteDebuggingServer::RemoteDebuggingServer(Profile* profile, RemoteDebuggingServer::RemoteDebuggingServer(Profile* profile,
const std::string& ip, const std::string& ip,
...@@ -19,12 +20,12 @@ RemoteDebuggingServer::RemoteDebuggingServer(Profile* profile, ...@@ -19,12 +20,12 @@ RemoteDebuggingServer::RemoteDebuggingServer(Profile* profile,
net::URLRequestContextGetter* request_context_getter = net::URLRequestContextGetter* request_context_getter =
profile->GetRequestContext(); profile->GetRequestContext();
devtools_http_handler_ =
content::DevToolsHttpHandler::Start(ip, devtools_http_handler_ = content::DevToolsHttpHandler::Start(
port, new net::TCPListenSocketFactory(ip, port),
frontend_url, frontend_url,
request_context_getter, request_context_getter,
new BrowserListTabContentsProvider()); new BrowserListTabContentsProvider());
} }
RemoteDebuggingServer::~RemoteDebuggingServer() { RemoteDebuggingServer::~RemoteDebuggingServer() {
......
...@@ -128,14 +128,12 @@ int DevToolsHttpHandler::GetFrontendResourceId(const std::string& name) { ...@@ -128,14 +128,12 @@ int DevToolsHttpHandler::GetFrontendResourceId(const std::string& name) {
// static // static
DevToolsHttpHandler* DevToolsHttpHandler::Start( DevToolsHttpHandler* DevToolsHttpHandler::Start(
const std::string& ip, const net::StreamListenSocketFactory* socket_factory,
int port,
const std::string& frontend_url, const std::string& frontend_url,
net::URLRequestContextGetter* request_context_getter, net::URLRequestContextGetter* request_context_getter,
DevToolsHttpHandlerDelegate* delegate) { DevToolsHttpHandlerDelegate* delegate) {
DevToolsHttpHandlerImpl* http_handler = DevToolsHttpHandlerImpl* http_handler =
new DevToolsHttpHandlerImpl(ip, new DevToolsHttpHandlerImpl(socket_factory,
port,
frontend_url, frontend_url,
request_context_getter, request_context_getter,
delegate); delegate);
...@@ -528,14 +526,12 @@ void DevToolsHttpHandlerImpl::OnReadCompleted(net::URLRequest* request, ...@@ -528,14 +526,12 @@ void DevToolsHttpHandlerImpl::OnReadCompleted(net::URLRequest* request,
} }
DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl( DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl(
const std::string& ip, const net::StreamListenSocketFactory* socket_factory,
int port,
const std::string& frontend_url, const std::string& frontend_url,
net::URLRequestContextGetter* request_context_getter, net::URLRequestContextGetter* request_context_getter,
DevToolsHttpHandlerDelegate* delegate) DevToolsHttpHandlerDelegate* delegate)
: ip_(ip), : overridden_frontend_url_(frontend_url),
port_(port), socket_factory_(socket_factory),
overridden_frontend_url_(frontend_url),
request_context_getter_(request_context_getter), request_context_getter_(request_context_getter),
delegate_(delegate) { delegate_(delegate) {
if (overridden_frontend_url_.empty()) if (overridden_frontend_url_.empty())
...@@ -548,7 +544,7 @@ DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl( ...@@ -548,7 +544,7 @@ DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl(
} }
void DevToolsHttpHandlerImpl::Init() { void DevToolsHttpHandlerImpl::Init() {
server_ = new net::HttpServer(ip_, port_, this); server_ = new net::HttpServer(*socket_factory_.get(), this);
} }
// Run on I/O thread // Run on I/O thread
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "net/url_request/url_request.h" #include "net/url_request/url_request.h"
namespace net { namespace net {
class StreamListenSocketFactory;
class URLRequestContextGetter; class URLRequestContextGetter;
} }
...@@ -41,8 +42,8 @@ class DevToolsHttpHandlerImpl ...@@ -41,8 +42,8 @@ class DevToolsHttpHandlerImpl
static bool SortPageListByTime(const PageInfo& info1, const PageInfo& info2); static bool SortPageListByTime(const PageInfo& info1, const PageInfo& info2);
DevToolsHttpHandlerImpl(const std::string& ip, // Takes ownership over |socket_factory|.
int port, DevToolsHttpHandlerImpl(const net::StreamListenSocketFactory* socket_factory,
const std::string& frontend_url, const std::string& frontend_url,
net::URLRequestContextGetter* request_context_getter, net::URLRequestContextGetter* request_context_getter,
DevToolsHttpHandlerDelegate* delegate); DevToolsHttpHandlerDelegate* delegate);
...@@ -93,9 +94,8 @@ class DevToolsHttpHandlerImpl ...@@ -93,9 +94,8 @@ class DevToolsHttpHandlerImpl
void AcceptWebSocket(int connection_id, void AcceptWebSocket(int connection_id,
const net::HttpServerRequestInfo& request); const net::HttpServerRequestInfo& request);
std::string ip_;
int port_;
std::string overridden_frontend_url_; std::string overridden_frontend_url_;
scoped_ptr<const net::StreamListenSocketFactory> socket_factory_;
scoped_refptr<net::HttpServer> server_; scoped_refptr<net::HttpServer> server_;
typedef std::map<net::URLRequest*, int> typedef std::map<net::URLRequest*, int>
RequestToSocketMap; RequestToSocketMap;
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "content/common/content_export.h" #include "content/common/content_export.h"
namespace net { namespace net {
class StreamListenSocketFactory;
class URLRequestContextGetter; class URLRequestContextGetter;
} }
...@@ -41,10 +42,9 @@ class DevToolsHttpHandler { ...@@ -41,10 +42,9 @@ class DevToolsHttpHandler {
CONTENT_EXPORT static int GetFrontendResourceId( CONTENT_EXPORT static int GetFrontendResourceId(
const std::string& name); const std::string& name);
// Takes ownership over |delegate|. // Takes ownership over |socket_factory| and |delegate|.
CONTENT_EXPORT static DevToolsHttpHandler* Start( CONTENT_EXPORT static DevToolsHttpHandler* Start(
const std::string& ip, const net::StreamListenSocketFactory* socket_factory,
int port,
const std::string& frontend_url, const std::string& frontend_url,
net::URLRequestContextGetter* request_context_getter, net::URLRequestContextGetter* request_context_getter,
DevToolsHttpHandlerDelegate* delegate); DevToolsHttpHandlerDelegate* delegate);
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "content/public/browser/devtools_http_handler.h" #include "content/public/browser/devtools_http_handler.h"
#include "grit/shell_resources.h" #include "grit/shell_resources.h"
#include "net/base/tcp_listen_socket.h"
#include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_context_getter.h"
#include "ui/base/resource/resource_bundle.h" #include "ui/base/resource/resource_bundle.h"
...@@ -18,8 +19,7 @@ ShellDevToolsDelegate::ShellDevToolsDelegate( ...@@ -18,8 +19,7 @@ ShellDevToolsDelegate::ShellDevToolsDelegate(
net::URLRequestContextGetter* context_getter) net::URLRequestContextGetter* context_getter)
: context_getter_(context_getter) { : context_getter_(context_getter) {
devtools_http_handler_ = DevToolsHttpHandler::Start( devtools_http_handler_ = DevToolsHttpHandler::Start(
"127.0.0.1", new net::TCPListenSocketFactory("127.0.0.1", port),
port,
"", "",
context_getter_, context_getter_,
this); this);
......
...@@ -147,6 +147,17 @@ class NET_EXPORT StreamListenSocket ...@@ -147,6 +147,17 @@ class NET_EXPORT StreamListenSocket
DISALLOW_COPY_AND_ASSIGN(StreamListenSocket); DISALLOW_COPY_AND_ASSIGN(StreamListenSocket);
}; };
// Abstract factory that must be subclassed for each subclass of
// StreamListenSocket.
class NET_EXPORT StreamListenSocketFactory {
public:
virtual ~StreamListenSocketFactory() {}
// Returns a new instance of StreamListenSocket or NULL if an error occurred.
virtual scoped_refptr<StreamListenSocket> CreateAndListen(
StreamListenSocket::Delegate* delegate) const = 0;
};
} // namespace net } // namespace net
#endif // NET_BASE_STREAM_LISTEN_SOCKET_H_ #endif // NET_BASE_STREAM_LISTEN_SOCKET_H_
...@@ -88,4 +88,16 @@ void TCPListenSocket::Accept() { ...@@ -88,4 +88,16 @@ void TCPListenSocket::Accept() {
socket_delegate_->DidAccept(this, sock); socket_delegate_->DidAccept(this, sock);
} }
TCPListenSocketFactory::TCPListenSocketFactory(const string& ip, int port)
: ip_(ip),
port_(port) {
}
TCPListenSocketFactory::~TCPListenSocketFactory() {}
scoped_refptr<StreamListenSocket> TCPListenSocketFactory::CreateAndListen(
StreamListenSocket::Delegate* delegate) const {
return TCPListenSocket::CreateAndListen(ip_, port_, delegate);
}
} // namespace net } // namespace net
...@@ -24,6 +24,8 @@ class NET_EXPORT TCPListenSocket : public StreamListenSocket { ...@@ -24,6 +24,8 @@ class NET_EXPORT TCPListenSocket : public StreamListenSocket {
const std::string& ip, int port, StreamListenSocket::Delegate* del); const std::string& ip, int port, StreamListenSocket::Delegate* del);
protected: protected:
friend class scoped_refptr<TCPListenSocket>;
TCPListenSocket(SOCKET s, StreamListenSocket::Delegate* del); TCPListenSocket(SOCKET s, StreamListenSocket::Delegate* del);
virtual ~TCPListenSocket(); virtual ~TCPListenSocket();
...@@ -36,6 +38,23 @@ class NET_EXPORT TCPListenSocket : public StreamListenSocket { ...@@ -36,6 +38,23 @@ class NET_EXPORT TCPListenSocket : public StreamListenSocket {
DISALLOW_COPY_AND_ASSIGN(TCPListenSocket); DISALLOW_COPY_AND_ASSIGN(TCPListenSocket);
}; };
// Factory that can be used to instantiate TCPListenSocket.
class NET_EXPORT TCPListenSocketFactory : public StreamListenSocketFactory {
public:
TCPListenSocketFactory(const std::string& ip, int port);
virtual ~TCPListenSocketFactory();
// StreamListenSocketFactory overrides.
virtual scoped_refptr<StreamListenSocket> CreateAndListen(
StreamListenSocket::Delegate* delegate) const OVERRIDE;
private:
const std::string ip_;
const int port_;
DISALLOW_COPY_AND_ASSIGN(TCPListenSocketFactory);
};
} // namespace net } // namespace net
#endif // NET_BASE_TCP_LISTEN_SOCKET_H_ #endif // NET_BASE_TCP_LISTEN_SOCKET_H_
...@@ -20,6 +20,8 @@ class WebSocket; ...@@ -20,6 +20,8 @@ class WebSocket;
class HttpConnection { class HttpConnection {
public: public:
~HttpConnection();
void Send(const std::string& data); void Send(const std::string& data);
void Send(const char* bytes, int len); void Send(const char* bytes, int len);
void Send200(const std::string& data, const std::string& content_type); void Send200(const std::string& data, const std::string& content_type);
...@@ -36,7 +38,6 @@ class HttpConnection { ...@@ -36,7 +38,6 @@ class HttpConnection {
static int last_id_; static int last_id_;
HttpConnection(HttpServer* server, StreamListenSocket* sock); HttpConnection(HttpServer* server, StreamListenSocket* sock);
~HttpConnection();
void DetachSocket(); void DetachSocket();
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/stl_util.h"
#include "base/string_util.h" #include "base/string_util.h"
#include "base/stringprintf.h" #include "base/stringprintf.h"
#include "base/sys_byteorder.h" #include "base/sys_byteorder.h"
...@@ -17,11 +18,11 @@ ...@@ -17,11 +18,11 @@
namespace net { namespace net {
HttpServer::HttpServer(const std::string& host, HttpServer::HttpServer(const StreamListenSocketFactory& factory,
int port, HttpServer::Delegate* delegate)
HttpServer::Delegate* del) : delegate_(delegate),
: delegate_(del) { ALLOW_THIS_IN_INITIALIZER_LIST(server_(factory.CreateAndListen(this))) {
server_ = TCPListenSocket::CreateAndListen(host, port, this); DCHECK(server_);
} }
void HttpServer::AcceptWebSocket( void HttpServer::AcceptWebSocket(
...@@ -157,10 +158,8 @@ void HttpServer::DidClose(StreamListenSocket* socket) { ...@@ -157,10 +158,8 @@ void HttpServer::DidClose(StreamListenSocket* socket) {
} }
HttpServer::~HttpServer() { HttpServer::~HttpServer() {
IdToConnectionMap copy = id_to_connection_; STLDeleteContainerPairSecondPointers(
for (IdToConnectionMap::iterator it = copy.begin(); it != copy.end(); ++it) id_to_connection_.begin(), id_to_connection_.end());
delete it->second;
server_ = NULL; server_ = NULL;
} }
......
...@@ -39,7 +39,8 @@ class HttpServer : public StreamListenSocket::Delegate, ...@@ -39,7 +39,8 @@ class HttpServer : public StreamListenSocket::Delegate,
virtual ~Delegate() {} virtual ~Delegate() {}
}; };
HttpServer(const std::string& host, int port, HttpServer::Delegate* del); HttpServer(const StreamListenSocketFactory& socket_factory,
HttpServer::Delegate* delegate);
void AcceptWebSocket(int connection_id, void AcceptWebSocket(int connection_id,
const HttpServerRequestInfo& request); const HttpServerRequestInfo& request);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment