| Index: content/browser/devtools/devtools_http_handler_impl.cc
|
| diff --git a/content/browser/devtools/devtools_http_handler_impl.cc b/content/browser/devtools/devtools_http_handler_impl.cc
|
| index 72fe254a23be241c5b05b3f6549bf84097b99814..18d30e39c19ad19507c0513619c12509744f0cb1 100644
|
| --- a/content/browser/devtools/devtools_http_handler_impl.cc
|
| +++ b/content/browser/devtools/devtools_http_handler_impl.cc
|
| @@ -39,6 +39,7 @@
|
| #include "net/base/net_errors.h"
|
| #include "net/server/http_server_request_info.h"
|
| #include "net/server/http_server_response_info.h"
|
| +#include "net/socket/server_socket.h"
|
|
|
| #if defined(OS_ANDROID)
|
| #include "base/android/build_info.h"
|
| @@ -67,6 +68,9 @@ const char kTargetFaviconUrlField[] = "faviconUrl";
|
| const char kTargetWebSocketDebuggerUrlField[] = "webSocketDebuggerUrl";
|
| const char kTargetDevtoolsFrontendUrlField[] = "devtoolsFrontendUrl";
|
|
|
| +// Maximum write buffer size of devtools http/websocket connectinos.
|
| +const int32 kSendBufferSizeForDevTools = 100 * 1024 * 1024; // 100Mb
|
| +
|
| // An internal implementation of DevToolsAgentHostClient that delegates
|
| // messages sent to a DebuggerShell instance.
|
| class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient {
|
| @@ -104,13 +108,15 @@ class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient {
|
| message_loop_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&net::HttpServer::SendOverWebSocket,
|
| - server_,
|
| + base::Unretained(server_),
|
| connection_id_,
|
| response));
|
|
|
| message_loop_->PostTask(
|
| FROM_HERE,
|
| - base::Bind(&net::HttpServer::Close, server_, connection_id_));
|
| + base::Bind(&net::HttpServer::Close,
|
| + base::Unretained(server_),
|
| + connection_id_));
|
| }
|
|
|
| virtual void DispatchProtocolMessage(
|
| @@ -119,7 +125,7 @@ class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient {
|
| message_loop_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&net::HttpServer::SendOverWebSocket,
|
| - server_,
|
| + base::Unretained(server_),
|
| connection_id_,
|
| message));
|
| }
|
| @@ -130,9 +136,9 @@ class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient {
|
| }
|
|
|
| private:
|
| - base::MessageLoop* message_loop_;
|
| - net::HttpServer* server_;
|
| - int connection_id_;
|
| + base::MessageLoop* const message_loop_;
|
| + net::HttpServer* const server_;
|
| + const int connection_id_;
|
| scoped_refptr<DevToolsAgentHost> agent_host_;
|
| };
|
|
|
| @@ -160,12 +166,12 @@ int DevToolsHttpHandler::GetFrontendResourceId(const std::string& name) {
|
|
|
| // static
|
| DevToolsHttpHandler* DevToolsHttpHandler::Start(
|
| - const net::StreamListenSocketFactory* socket_factory,
|
| + scoped_ptr<ServerSocketFactory> server_socket_factory,
|
| const std::string& frontend_url,
|
| DevToolsHttpHandlerDelegate* delegate,
|
| const base::FilePath& active_port_output_directory) {
|
| DevToolsHttpHandlerImpl* http_handler =
|
| - new DevToolsHttpHandlerImpl(socket_factory,
|
| + new DevToolsHttpHandlerImpl(server_socket_factory.Pass(),
|
| frontend_url,
|
| delegate,
|
| active_port_output_directory);
|
| @@ -173,6 +179,28 @@ DevToolsHttpHandler* DevToolsHttpHandler::Start(
|
| return http_handler;
|
| }
|
|
|
| +DevToolsHttpHandler::ServerSocketFactory::ServerSocketFactory(
|
| + const std::string& address,
|
| + int port,
|
| + int backlog)
|
| + : address_(address),
|
| + port_(port),
|
| + backlog_(backlog) {
|
| +}
|
| +
|
| +DevToolsHttpHandler::ServerSocketFactory::~ServerSocketFactory() {
|
| +}
|
| +
|
| +scoped_ptr<net::ServerSocket>
|
| +DevToolsHttpHandler::ServerSocketFactory::CreateAndListen() const {
|
| + scoped_ptr<net::ServerSocket> socket = Create();
|
| + if (socket &&
|
| + socket->ListenWithAddressAndPort(address_, port_, backlog_) == net::OK) {
|
| + return socket.Pass();
|
| + }
|
| + return scoped_ptr<net::ServerSocket>();
|
| +}
|
| +
|
| DevToolsHttpHandlerImpl::~DevToolsHttpHandlerImpl() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| // Stop() must be called prior to destruction.
|
| @@ -262,6 +290,8 @@ static std::string GetMimeType(const std::string& filename) {
|
| void DevToolsHttpHandlerImpl::OnHttpRequest(
|
| int connection_id,
|
| const net::HttpServerRequestInfo& info) {
|
| + server_->SetSendBufferSize(connection_id, kSendBufferSizeForDevTools);
|
| +
|
| if (info.path.find("/json") == 0) {
|
| BrowserThread::PostTask(
|
| BrowserThread::UI,
|
| @@ -351,6 +381,7 @@ void DevToolsHttpHandlerImpl::OnWebSocketRequest(
|
| true /* handle on UI thread */);
|
| browser_targets_[connection_id] = browser_target;
|
|
|
| + server_->SetSendBufferSize(connection_id, kSendBufferSizeForDevTools);
|
| server_->AcceptWebSocket(connection_id, request);
|
| return;
|
| }
|
| @@ -651,16 +682,16 @@ void DevToolsHttpHandlerImpl::OnCloseUI(int connection_id) {
|
| }
|
|
|
| DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl(
|
| - const net::StreamListenSocketFactory* socket_factory,
|
| + scoped_ptr<ServerSocketFactory> server_socket_factory,
|
| const std::string& frontend_url,
|
| DevToolsHttpHandlerDelegate* delegate,
|
| const base::FilePath& active_port_output_directory)
|
| : frontend_url_(frontend_url),
|
| - socket_factory_(socket_factory),
|
| + server_socket_factory_(server_socket_factory.Pass()),
|
| delegate_(delegate),
|
| active_port_output_directory_(active_port_output_directory) {
|
| if (frontend_url_.empty())
|
| - frontend_url_ = "/devtools/devtools.html";
|
| + frontend_url_ = "/devtools/devtools.html";
|
|
|
| // Balanced in ResetHandlerThreadAndRelease().
|
| AddRef();
|
| @@ -668,14 +699,15 @@ DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl(
|
|
|
| // Runs on the handler thread
|
| void DevToolsHttpHandlerImpl::Init() {
|
| - server_ = new net::HttpServer(*socket_factory_.get(), this);
|
| + server_.reset(new net::HttpServer(server_socket_factory_->CreateAndListen(),
|
| + this));
|
| if (!active_port_output_directory_.empty())
|
| WriteActivePortToUserProfile();
|
| }
|
|
|
| // Runs on the handler thread
|
| void DevToolsHttpHandlerImpl::Teardown() {
|
| - server_ = NULL;
|
| + server_.reset(NULL);
|
| }
|
|
|
| // Runs on FILE thread to make sure that it is serialized against
|
| @@ -733,7 +765,7 @@ void DevToolsHttpHandlerImpl::SendJson(int connection_id,
|
| thread_->message_loop()->PostTask(
|
| FROM_HERE,
|
| base::Bind(&net::HttpServer::SendResponse,
|
| - server_.get(),
|
| + base::Unretained(server_.get()),
|
| connection_id,
|
| response));
|
| }
|
| @@ -746,7 +778,7 @@ void DevToolsHttpHandlerImpl::Send200(int connection_id,
|
| thread_->message_loop()->PostTask(
|
| FROM_HERE,
|
| base::Bind(&net::HttpServer::Send200,
|
| - server_.get(),
|
| + base::Unretained(server_.get()),
|
| connection_id,
|
| data,
|
| mime_type));
|
| @@ -757,7 +789,9 @@ void DevToolsHttpHandlerImpl::Send404(int connection_id) {
|
| return;
|
| thread_->message_loop()->PostTask(
|
| FROM_HERE,
|
| - base::Bind(&net::HttpServer::Send404, server_.get(), connection_id));
|
| + base::Bind(&net::HttpServer::Send404,
|
| + base::Unretained(server_.get()),
|
| + connection_id));
|
| }
|
|
|
| void DevToolsHttpHandlerImpl::Send500(int connection_id,
|
| @@ -766,7 +800,9 @@ void DevToolsHttpHandlerImpl::Send500(int connection_id,
|
| return;
|
| thread_->message_loop()->PostTask(
|
| FROM_HERE,
|
| - base::Bind(&net::HttpServer::Send500, server_.get(), connection_id,
|
| + base::Bind(&net::HttpServer::Send500,
|
| + base::Unretained(server_.get()),
|
| + connection_id,
|
| message));
|
| }
|
|
|
| @@ -777,8 +813,16 @@ void DevToolsHttpHandlerImpl::AcceptWebSocket(
|
| return;
|
| thread_->message_loop()->PostTask(
|
| FROM_HERE,
|
| - base::Bind(&net::HttpServer::AcceptWebSocket, server_.get(),
|
| - connection_id, request));
|
| + base::Bind(&net::HttpServer::SetSendBufferSize,
|
| + base::Unretained(server_.get()),
|
| + connection_id,
|
| + kSendBufferSizeForDevTools));
|
| + thread_->message_loop()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&net::HttpServer::AcceptWebSocket,
|
| + base::Unretained(server_.get()),
|
| + connection_id,
|
| + request));
|
| }
|
|
|
| base::DictionaryValue* DevToolsHttpHandlerImpl::SerializeTarget(
|
|
|