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 @@
#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
#include "chrome/browser/ui/webui/devtools_ui.h"
#include "content/public/browser/devtools_http_handler.h"
#include "net/base/tcp_listen_socket.h"
RemoteDebuggingServer::RemoteDebuggingServer(Profile* profile,
const std::string& ip,
......@@ -19,12 +20,12 @@ RemoteDebuggingServer::RemoteDebuggingServer(Profile* profile,
net::URLRequestContextGetter* request_context_getter =
profile->GetRequestContext();
devtools_http_handler_ =
content::DevToolsHttpHandler::Start(ip,
port,
frontend_url,
request_context_getter,
new BrowserListTabContentsProvider());
devtools_http_handler_ = content::DevToolsHttpHandler::Start(
new net::TCPListenSocketFactory(ip, port),
frontend_url,
request_context_getter,
new BrowserListTabContentsProvider());
}
RemoteDebuggingServer::~RemoteDebuggingServer() {
......
......@@ -128,14 +128,12 @@ int DevToolsHttpHandler::GetFrontendResourceId(const std::string& name) {
// static
DevToolsHttpHandler* DevToolsHttpHandler::Start(
const std::string& ip,
int port,
const net::StreamListenSocketFactory* socket_factory,
const std::string& frontend_url,
net::URLRequestContextGetter* request_context_getter,
DevToolsHttpHandlerDelegate* delegate) {
DevToolsHttpHandlerImpl* http_handler =
new DevToolsHttpHandlerImpl(ip,
port,
new DevToolsHttpHandlerImpl(socket_factory,
frontend_url,
request_context_getter,
delegate);
......@@ -528,14 +526,12 @@ void DevToolsHttpHandlerImpl::OnReadCompleted(net::URLRequest* request,
}
DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl(
const std::string& ip,
int port,
const net::StreamListenSocketFactory* socket_factory,
const std::string& frontend_url,
net::URLRequestContextGetter* request_context_getter,
DevToolsHttpHandlerDelegate* delegate)
: ip_(ip),
port_(port),
overridden_frontend_url_(frontend_url),
: overridden_frontend_url_(frontend_url),
socket_factory_(socket_factory),
request_context_getter_(request_context_getter),
delegate_(delegate) {
if (overridden_frontend_url_.empty())
......@@ -548,7 +544,7 @@ DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl(
}
void DevToolsHttpHandlerImpl::Init() {
server_ = new net::HttpServer(ip_, port_, this);
server_ = new net::HttpServer(*socket_factory_.get(), this);
}
// Run on I/O thread
......
......@@ -20,6 +20,7 @@
#include "net/url_request/url_request.h"
namespace net {
class StreamListenSocketFactory;
class URLRequestContextGetter;
}
......@@ -41,8 +42,8 @@ class DevToolsHttpHandlerImpl
static bool SortPageListByTime(const PageInfo& info1, const PageInfo& info2);
DevToolsHttpHandlerImpl(const std::string& ip,
int port,
// Takes ownership over |socket_factory|.
DevToolsHttpHandlerImpl(const net::StreamListenSocketFactory* socket_factory,
const std::string& frontend_url,
net::URLRequestContextGetter* request_context_getter,
DevToolsHttpHandlerDelegate* delegate);
......@@ -93,9 +94,8 @@ class DevToolsHttpHandlerImpl
void AcceptWebSocket(int connection_id,
const net::HttpServerRequestInfo& request);
std::string ip_;
int port_;
std::string overridden_frontend_url_;
scoped_ptr<const net::StreamListenSocketFactory> socket_factory_;
scoped_refptr<net::HttpServer> server_;
typedef std::map<net::URLRequest*, int>
RequestToSocketMap;
......
......@@ -11,6 +11,7 @@
#include "content/common/content_export.h"
namespace net {
class StreamListenSocketFactory;
class URLRequestContextGetter;
}
......@@ -41,10 +42,9 @@ class DevToolsHttpHandler {
CONTENT_EXPORT static int GetFrontendResourceId(
const std::string& name);
// Takes ownership over |delegate|.
// Takes ownership over |socket_factory| and |delegate|.
CONTENT_EXPORT static DevToolsHttpHandler* Start(
const std::string& ip,
int port,
const net::StreamListenSocketFactory* socket_factory,
const std::string& frontend_url,
net::URLRequestContextGetter* request_context_getter,
DevToolsHttpHandlerDelegate* delegate);
......
......@@ -8,6 +8,7 @@
#include "content/public/browser/devtools_http_handler.h"
#include "grit/shell_resources.h"
#include "net/base/tcp_listen_socket.h"
#include "net/url_request/url_request_context_getter.h"
#include "ui/base/resource/resource_bundle.h"
......@@ -18,8 +19,7 @@ ShellDevToolsDelegate::ShellDevToolsDelegate(
net::URLRequestContextGetter* context_getter)
: context_getter_(context_getter) {
devtools_http_handler_ = DevToolsHttpHandler::Start(
"127.0.0.1",
port,
new net::TCPListenSocketFactory("127.0.0.1", port),
"",
context_getter_,
this);
......
......@@ -147,6 +147,17 @@ class NET_EXPORT 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
#endif // NET_BASE_STREAM_LISTEN_SOCKET_H_
......@@ -88,4 +88,16 @@ void TCPListenSocket::Accept() {
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
......@@ -24,6 +24,8 @@ class NET_EXPORT TCPListenSocket : public StreamListenSocket {
const std::string& ip, int port, StreamListenSocket::Delegate* del);
protected:
friend class scoped_refptr<TCPListenSocket>;
TCPListenSocket(SOCKET s, StreamListenSocket::Delegate* del);
virtual ~TCPListenSocket();
......@@ -36,6 +38,23 @@ class NET_EXPORT TCPListenSocket : public StreamListenSocket {
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
#endif // NET_BASE_TCP_LISTEN_SOCKET_H_
......@@ -20,6 +20,8 @@ class WebSocket;
class HttpConnection {
public:
~HttpConnection();
void Send(const std::string& data);
void Send(const char* bytes, int len);
void Send200(const std::string& data, const std::string& content_type);
......@@ -36,7 +38,6 @@ class HttpConnection {
static int last_id_;
HttpConnection(HttpServer* server, StreamListenSocket* sock);
~HttpConnection();
void DetachSocket();
......
......@@ -6,6 +6,7 @@
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/stl_util.h"
#include "base/string_util.h"
#include "base/stringprintf.h"
#include "base/sys_byteorder.h"
......@@ -17,11 +18,11 @@
namespace net {
HttpServer::HttpServer(const std::string& host,
int port,
HttpServer::Delegate* del)
: delegate_(del) {
server_ = TCPListenSocket::CreateAndListen(host, port, this);
HttpServer::HttpServer(const StreamListenSocketFactory& factory,
HttpServer::Delegate* delegate)
: delegate_(delegate),
ALLOW_THIS_IN_INITIALIZER_LIST(server_(factory.CreateAndListen(this))) {
DCHECK(server_);
}
void HttpServer::AcceptWebSocket(
......@@ -157,10 +158,8 @@ void HttpServer::DidClose(StreamListenSocket* socket) {
}
HttpServer::~HttpServer() {
IdToConnectionMap copy = id_to_connection_;
for (IdToConnectionMap::iterator it = copy.begin(); it != copy.end(); ++it)
delete it->second;
STLDeleteContainerPairSecondPointers(
id_to_connection_.begin(), id_to_connection_.end());
server_ = NULL;
}
......
......@@ -39,7 +39,8 @@ class HttpServer : public StreamListenSocket::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,
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