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 113c2e556d5e10fbb0fa4547a102d8aebd4903df..031feb91f2f3a3bcc1e540252e026e74a3c8a8b6 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. |
@@ -211,6 +239,10 @@ void DevToolsHttpHandlerImpl::ResetHandlerThreadAndRelease() { |
void DevToolsHttpHandlerImpl::Stop() { |
if (!thread_) |
return; |
+ // Deletes DevToolsClientHostImpl which has http sever reference. |
+ while (!connection_to_client_host_ui_.empty()) { |
+ OnCloseUI(connection_to_client_host_ui_.begin()->first); |
+ } |
BrowserThread::PostTaskAndReply( |
BrowserThread::FILE, FROM_HERE, |
base::Bind(&DevToolsHttpHandlerImpl::StopHandlerThread, this), |
@@ -255,6 +287,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, |
@@ -346,6 +380,7 @@ void DevToolsHttpHandlerImpl::OnWebSocketRequest( |
new DevToolsSystemInfoHandler(), |
true /* handle on UI thread */); |
+ server_->SetSendBufferSize(connection_id, kSendBufferSizeForDevTools); |
server_->AcceptWebSocket(connection_id, request); |
return; |
} |
@@ -647,12 +682,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 +699,20 @@ 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; |
+ // Detaches DevToolsBrowserTarget which hold http server reference. |
+ if (browser_target_) { |
+ browser_target_->Detach(); |
+ browser_target_ = NULL; |
+ } |
+ server_.reset(NULL); |
} |
// Runs on FILE thread to make sure that it is serialized against |
@@ -731,7 +772,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)); |
} |
@@ -744,7 +785,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)); |
@@ -755,7 +796,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, |
@@ -764,7 +807,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)); |
} |
@@ -775,8 +820,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( |