| 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 d1b5b1e67245588bb2cf4c35cc6e0ccf5523d50e..0fb8573747892d6f9d408db432329b19046ec04f 100644
|
| --- a/content/browser/devtools/devtools_http_handler_impl.cc
|
| +++ b/content/browser/devtools/devtools_http_handler_impl.cc
|
| @@ -41,6 +41,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"
|
| @@ -69,6 +70,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 DevToolsClientHost that delegates
|
| // messages sent for DevToolsClient to a DebuggerShell instance.
|
| class DevToolsClientHostImpl : public DevToolsClientHost {
|
| @@ -99,20 +103,22 @@ class DevToolsClientHostImpl : public DevToolsClientHost {
|
| 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 DispatchOnInspectorFrontend(const std::string& data) OVERRIDE {
|
| message_loop_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&net::HttpServer::SendOverWebSocket,
|
| - server_,
|
| + base::Unretained(server_),
|
| connection_id_,
|
| data));
|
| }
|
| @@ -122,9 +128,9 @@ class DevToolsClientHostImpl : public DevToolsClientHost {
|
| }
|
|
|
| private:
|
| - base::MessageLoop* message_loop_;
|
| - net::HttpServer* server_;
|
| - int connection_id_;
|
| + base::MessageLoop* const message_loop_;
|
| + net::HttpServer* const server_;
|
| + const int connection_id_;
|
| bool is_closed_;
|
| std::string detach_reason_;
|
| };
|
| @@ -153,12 +159,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);
|
| @@ -166,6 +172,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.
|
| @@ -255,6 +283,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,
|
| @@ -344,6 +374,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;
|
| }
|
| @@ -647,12 +678,12 @@ 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())
|
| @@ -664,14 +695,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
|
| @@ -729,7 +761,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));
|
| }
|
| @@ -742,7 +774,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));
|
| @@ -753,7 +785,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,
|
| @@ -762,7 +796,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));
|
| }
|
|
|
| @@ -773,8 +809,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(
|
|
|