Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(493)

Unified Diff: content/browser/devtools/devtools_http_handler_impl.cc

Issue 693603003: [DevTools] Split DevToolsHttpHandler into two classes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@shell
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 e7b7fb9b99e68f17eff500742b76addccf88e3e3..996eedb6d78ca28376ea674171080a900ed2c325 100644
--- a/content/browser/devtools/devtools_http_handler_impl.cc
+++ b/content/browser/devtools/devtools_http_handler_impl.cc
@@ -71,16 +71,118 @@ const char kTargetDevtoolsFrontendUrlField[] = "devtoolsFrontendUrl";
// Maximum write buffer size of devtools http/websocket connectinos.
const int32 kSendBufferSizeForDevTools = 100 * 1024 * 1024; // 100Mb
-// DevToolsAgentHostClientImpl -----------------------------------------------
+// Runs on FILE thread.
+static scoped_ptr<base::Thread> StartHandlerThread() {
+ scoped_ptr<base::Thread> thread(new base::Thread(kDevToolsHandlerThreadName));
+ base::Thread::Options options;
+ options.message_loop_type = base::MessageLoop::TYPE_IO;
+ if (!thread->StartWithOptions(options))
+ return nullptr;
+
+ return thread.Pass();
+}
+
+} // namespace
+
+// DevToolsHttpHandlerImpl::ServerWrapper ------------------------------------
+
+class DevToolsHttpHandlerImpl::ServerWrapper : net::HttpServer::Delegate {
+ public:
+ static void StartServer(
+ base::WeakPtr<DevToolsHttpHandlerImpl> handler,
+ scoped_ptr<ServerSocketFactory> server_socket_factory,
+ const base::FilePath& output_directory,
+ const base::FilePath& frontend_dir,
+ bool bundles_resources);
+
+ void AcceptWebSocket(int connection_id,
+ const net::HttpServerRequestInfo& request);
+ void SendOverWebSocket(int connection_id, const std::string& message);
+ void SendResponse(int connection_id,
+ const net::HttpServerResponseInfo& response);
+ void Send200(int connection_id,
+ const std::string& data,
+ const std::string& mime_type);
+ void Send404(int connection_id);
+ void Send500(int connection_id, const std::string& message);
+ void Close(int connection_id);
+
+ virtual ~ServerWrapper() {}
+
+ private:
+ ServerWrapper(base::WeakPtr<DevToolsHttpHandlerImpl> handler,
+ scoped_ptr<net::ServerSocket> socket,
+ const base::FilePath& frontend_dir,
+ bool bundles_resources);
+
+ // net::HttpServer::Delegate implementation.
+ void OnConnect(int connection_id) override {}
+ void OnHttpRequest(int connection_id,
+ const net::HttpServerRequestInfo& info) override;
+ void OnWebSocketRequest(int connection_id,
+ const net::HttpServerRequestInfo& info) override;
+ void OnWebSocketMessage(int connection_id,
+ const std::string& data) override;
+ void OnClose(int connection_id) override;
+
+ void WriteActivePortToUserProfile(const base::FilePath& output_directory);
+
+ base::WeakPtr<DevToolsHttpHandlerImpl> handler_;
+ scoped_ptr<net::HttpServer> server_;
+ base::FilePath frontend_dir_;
+ bool bundles_resources_;
+};
+
+void DevToolsHttpHandlerImpl::ServerWrapper::AcceptWebSocket(
+ int connection_id,
+ const net::HttpServerRequestInfo& request) {
+ server_->SetSendBufferSize(connection_id, kSendBufferSizeForDevTools);
+ server_->AcceptWebSocket(connection_id, request);
+}
+
+void DevToolsHttpHandlerImpl::ServerWrapper::SendOverWebSocket(
+ int connection_id,
+ const std::string& message) {
+ server_->SendOverWebSocket(connection_id, message);
+}
+
+void DevToolsHttpHandlerImpl::ServerWrapper::SendResponse(
+ int connection_id,
+ const net::HttpServerResponseInfo& response) {
+ server_->SendResponse(connection_id, response);
+}
+
+void DevToolsHttpHandlerImpl::ServerWrapper::Send200(
+ int connection_id,
+ const std::string& data,
+ const std::string& mime_type) {
+ server_->Send200(connection_id, data, mime_type);
+}
+
+void DevToolsHttpHandlerImpl::ServerWrapper::Send404(int connection_id) {
+ server_->Send404(connection_id);
+}
+
+void DevToolsHttpHandlerImpl::ServerWrapper::Send500(
+ int connection_id,
+ const std::string& message) {
+ server_->Send500(connection_id, message);
+}
+void DevToolsHttpHandlerImpl::ServerWrapper::Close(int connection_id) {
+ server_->Close(connection_id);
+}
+
+// DevToolsHttpHandlerImpl::AgentHostClientImpl ------------------------------
// An internal implementation of DevToolsAgentHostClient that delegates
// messages sent to a DebuggerShell instance.
-class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient {
+class DevToolsHttpHandlerImpl::AgentHostClientImpl
+ : public DevToolsAgentHostClient {
public:
- DevToolsAgentHostClientImpl(base::MessageLoop* message_loop,
- net::HttpServer* server,
- int connection_id,
- DevToolsAgentHost* agent_host)
+ AgentHostClientImpl(base::MessageLoop* message_loop,
+ ServerWrapper* server,
+ int connection_id,
+ DevToolsAgentHost* agent_host)
: message_loop_(message_loop),
server_(server),
connection_id_(connection_id),
@@ -88,7 +190,7 @@ class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient {
agent_host_->AttachClient(this);
}
- ~DevToolsAgentHostClientImpl() override {
+ ~AgentHostClientImpl() override {
if (agent_host_.get())
agent_host_->DetachClient();
}
@@ -108,14 +210,14 @@ class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient {
notification.DeepCopy())->Serialize();
message_loop_->PostTask(
FROM_HERE,
- base::Bind(&net::HttpServer::SendOverWebSocket,
+ base::Bind(&ServerWrapper::SendOverWebSocket,
base::Unretained(server_),
connection_id_,
response));
message_loop_->PostTask(
FROM_HERE,
- base::Bind(&net::HttpServer::Close,
+ base::Bind(&ServerWrapper::Close,
base::Unretained(server_),
connection_id_));
}
@@ -125,7 +227,7 @@ class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient {
DCHECK(agent_host == agent_host_.get());
message_loop_->PostTask(
FROM_HERE,
- base::Bind(&net::HttpServer::SendOverWebSocket,
+ base::Bind(&ServerWrapper::SendOverWebSocket,
base::Unretained(server_),
connection_id_,
message));
@@ -138,7 +240,7 @@ class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient {
private:
base::MessageLoop* const message_loop_;
- net::HttpServer* const server_;
+ ServerWrapper* const server_;
const int connection_id_;
scoped_refptr<DevToolsAgentHost> agent_host_;
};
@@ -148,14 +250,12 @@ static bool TimeComparator(const DevToolsTarget* target1,
return target1->GetLastActivityTime() > target2->GetLastActivityTime();
}
-} // namespace
-
// DevToolsHttpHandlerImpl::BrowserTarget ------------------------------------
class DevToolsHttpHandlerImpl::BrowserTarget {
public:
BrowserTarget(base::MessageLoop* message_loop,
- net::HttpServer* server,
+ ServerWrapper* server,
int connection_id)
: message_loop_(message_loop),
server_(server),
@@ -210,7 +310,7 @@ class DevToolsHttpHandlerImpl::BrowserTarget {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
message_loop_->PostTask(
FROM_HERE,
- base::Bind(&net::HttpServer::SendOverWebSocket,
+ base::Bind(&ServerWrapper::SendOverWebSocket,
base::Unretained(server_),
connection_id_,
message));
@@ -218,7 +318,7 @@ class DevToolsHttpHandlerImpl::BrowserTarget {
private:
base::MessageLoop* const message_loop_;
- net::HttpServer* const server_;
+ ServerWrapper* const server_;
const int connection_id_;
scoped_ptr<devtools::tracing::TracingHandler> tracing_handler_;
scoped_ptr<DevToolsProtocolHandlerImpl> protocol_handler_;
@@ -253,7 +353,6 @@ DevToolsHttpHandler* DevToolsHttpHandler::Start(
frontend_url,
delegate,
active_port_output_directory);
- http_handler->Start();
return http_handler;
}
@@ -284,64 +383,18 @@ DevToolsHttpHandler::ServerSocketFactory::CreateAndListen() const {
// DevToolsHttpHandlerImpl ---------------------------------------------------
DevToolsHttpHandlerImpl::~DevToolsHttpHandlerImpl() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- // Stop() must be called prior to destruction.
- DCHECK(server_.get() == NULL);
- DCHECK(thread_.get() == NULL);
STLDeleteValues(&target_map_);
-}
-
-void DevToolsHttpHandlerImpl::Start() {
- if (thread_)
- return;
- thread_.reset(new base::Thread(kDevToolsHandlerThreadName));
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- base::Bind(&DevToolsHttpHandlerImpl::StartHandlerThread, this));
-}
-
-// Runs on FILE thread.
-void DevToolsHttpHandlerImpl::StartHandlerThread() {
- base::Thread::Options options;
- options.message_loop_type = base::MessageLoop::TYPE_IO;
- if (!thread_->StartWithOptions(options)) {
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&DevToolsHttpHandlerImpl::ResetHandlerThread, this));
- return;
- }
-
- thread_->message_loop()->PostTask(
- FROM_HERE,
- base::Bind(&DevToolsHttpHandlerImpl::Init, this));
-}
-
-void DevToolsHttpHandlerImpl::ResetHandlerThread() {
- thread_.reset();
- server_ip_address_.reset();
-}
-
-void DevToolsHttpHandlerImpl::ResetHandlerThreadAndRelease() {
- ResetHandlerThread();
- Release();
+ STLDeleteValues(&browser_targets_);
+ STLDeleteValues(&connection_to_client_);
}
void DevToolsHttpHandlerImpl::Stop() {
- if (!thread_)
- return;
- BrowserThread::PostTaskAndReply(
- BrowserThread::FILE, FROM_HERE,
- base::Bind(&DevToolsHttpHandlerImpl::StopHandlerThread, this),
- base::Bind(&DevToolsHttpHandlerImpl::ResetHandlerThreadAndRelease, this));
-}
-
-void DevToolsHttpHandlerImpl::StopWithoutRelease() {
- if (!thread_)
- return;
- BrowserThread::PostTaskAndReply(
- BrowserThread::FILE, FROM_HERE,
- base::Bind(&DevToolsHttpHandlerImpl::StopHandlerThread, this),
- base::Bind(&DevToolsHttpHandlerImpl::ResetHandlerThread, this));
+ if (server_) {
+ DCHECK(thread_);
+ thread_->message_loop()->DeleteSoon(FROM_HERE, server_.release());
+ }
+ StopHandlerThread();
+ delete this;
}
GURL DevToolsHttpHandlerImpl::GetFrontendURL() {
@@ -378,7 +431,7 @@ static std::string GetMimeType(const std::string& filename) {
return "text/plain";
}
-void DevToolsHttpHandlerImpl::OnHttpRequest(
+void DevToolsHttpHandlerImpl::ServerWrapper::OnHttpRequest(
int connection_id,
const net::HttpServerRequestInfo& info) {
server_->SetSendBufferSize(connection_id, kSendBufferSizeForDevTools);
@@ -387,8 +440,8 @@ void DevToolsHttpHandlerImpl::OnHttpRequest(
BrowserThread::PostTask(
BrowserThread::UI,
FROM_HERE,
- base::Bind(&DevToolsHttpHandlerImpl::OnJsonRequestUI,
- this,
+ base::Bind(&DevToolsHttpHandlerImpl::OnJsonRequest,
+ handler_,
connection_id,
info));
return;
@@ -397,17 +450,13 @@ void DevToolsHttpHandlerImpl::OnHttpRequest(
if (info.path.find(kThumbUrlPrefix) == 0) {
// Thumbnail request.
const std::string target_id = info.path.substr(strlen(kThumbUrlPrefix));
- DevToolsTarget* target = GetTarget(target_id);
- GURL page_url;
- if (target)
- page_url = target->GetURL();
BrowserThread::PostTask(
BrowserThread::UI,
FROM_HERE,
- base::Bind(&DevToolsHttpHandlerImpl::OnThumbnailRequestUI,
- this,
+ base::Bind(&DevToolsHttpHandlerImpl::OnThumbnailRequest,
+ handler_,
connection_id,
- page_url));
+ target_id));
return;
}
@@ -416,8 +465,8 @@ void DevToolsHttpHandlerImpl::OnHttpRequest(
BrowserThread::PostTask(
BrowserThread::UI,
FROM_HERE,
- base::Bind(&DevToolsHttpHandlerImpl::OnDiscoveryPageRequestUI,
- this,
+ base::Bind(&DevToolsHttpHandlerImpl::OnDiscoveryPageRequest,
+ handler_,
connection_id));
return;
}
@@ -430,15 +479,14 @@ void DevToolsHttpHandlerImpl::OnHttpRequest(
std::string filename = PathWithoutParams(info.path.substr(10));
std::string mime_type = GetMimeType(filename);
- base::FilePath frontend_dir = delegate_->GetDebugFrontendDir();
- if (!frontend_dir.empty()) {
- base::FilePath path = frontend_dir.AppendASCII(filename);
+ if (!frontend_dir_.empty()) {
+ base::FilePath path = frontend_dir_.AppendASCII(filename);
std::string data;
base::ReadFileToString(path, &data);
server_->Send200(connection_id, data, mime_type);
return;
}
- if (delegate_->BundlesFrontendResources()) {
+ if (bundles_resources_) {
int resource_id = DevToolsHttpHandler::GetFrontendResourceId(filename);
if (resource_id != -1) {
base::StringPiece data = GetContentClient()->GetDataResource(
@@ -450,39 +498,39 @@ void DevToolsHttpHandlerImpl::OnHttpRequest(
server_->Send404(connection_id);
}
-void DevToolsHttpHandlerImpl::OnWebSocketRequest(
+void DevToolsHttpHandlerImpl::ServerWrapper::OnWebSocketRequest(
int connection_id,
const net::HttpServerRequestInfo& request) {
BrowserThread::PostTask(
BrowserThread::UI,
FROM_HERE,
base::Bind(
- &DevToolsHttpHandlerImpl::OnWebSocketRequestUI,
- this,
+ &DevToolsHttpHandlerImpl::OnWebSocketRequest,
+ handler_,
connection_id,
request));
}
-void DevToolsHttpHandlerImpl::OnWebSocketMessage(
+void DevToolsHttpHandlerImpl::ServerWrapper::OnWebSocketMessage(
int connection_id,
const std::string& data) {
BrowserThread::PostTask(
BrowserThread::UI,
FROM_HERE,
base::Bind(
- &DevToolsHttpHandlerImpl::OnWebSocketMessageUI,
- this,
+ &DevToolsHttpHandlerImpl::OnWebSocketMessage,
+ handler_,
connection_id,
data));
}
-void DevToolsHttpHandlerImpl::OnClose(int connection_id) {
+void DevToolsHttpHandlerImpl::ServerWrapper::OnClose(int connection_id) {
BrowserThread::PostTask(
BrowserThread::UI,
FROM_HERE,
base::Bind(
- &DevToolsHttpHandlerImpl::OnCloseUI,
- this,
+ &DevToolsHttpHandlerImpl::OnClose,
+ handler_,
connection_id));
}
@@ -523,7 +571,7 @@ static bool ParseJsonPath(
return true;
}
-void DevToolsHttpHandlerImpl::OnJsonRequestUI(
+void DevToolsHttpHandlerImpl::OnJsonRequest(
int connection_id,
const net::HttpServerRequestInfo& info) {
// Trim /json
@@ -567,13 +615,12 @@ void DevToolsHttpHandlerImpl::OnJsonRequestUI(
if (command == "list") {
std::string host = info.headers["host"];
- AddRef(); // Balanced in OnTargetListReceived.
DevToolsManagerDelegate* manager_delegate =
DevToolsManager::GetInstance()->delegate();
if (manager_delegate) {
manager_delegate->EnumerateTargets(
- base::Bind(&DevToolsHttpHandlerImpl::OnTargetListReceived,
- this, connection_id, host));
+ base::Bind(&DevToolsHttpHandlerImpl::OnTargetListReceivedWeak,
+ weak_factory_.GetWeakPtr(), connection_id, host));
} else {
DevToolsManagerDelegate::TargetList empty_list;
OnTargetListReceived(connection_id, host, empty_list);
@@ -648,6 +695,19 @@ void DevToolsHttpHandlerImpl::OnJsonRequestUI(
return;
}
+// static
+void DevToolsHttpHandlerImpl::OnTargetListReceivedWeak(
+ base::WeakPtr<DevToolsHttpHandlerImpl> handler,
+ int connection_id,
+ const std::string& host,
+ const DevToolsManagerDelegate::TargetList& targets) {
+ if (handler) {
+ handler->OnTargetListReceived(connection_id, host, targets);
+ } else {
+ STLDeleteContainerPointers(targets.begin(), targets.end());
+ }
+}
+
void DevToolsHttpHandlerImpl::OnTargetListReceived(
int connection_id,
const std::string& host,
@@ -664,7 +724,6 @@ void DevToolsHttpHandlerImpl::OnTargetListReceived(
list_value.Append(SerializeTarget(*target, host));
}
SendJson(connection_id, net::HTTP_OK, &list_value, std::string());
- Release(); // Balanced in OnJsonRequestUI.
}
DevToolsTarget* DevToolsHttpHandlerImpl::GetTarget(const std::string& id) {
@@ -674,8 +733,12 @@ DevToolsTarget* DevToolsHttpHandlerImpl::GetTarget(const std::string& id) {
return it->second;
}
-void DevToolsHttpHandlerImpl::OnThumbnailRequestUI(
- int connection_id, const GURL& page_url) {
+void DevToolsHttpHandlerImpl::OnThumbnailRequest(
+ int connection_id, const std::string& target_id) {
+ DevToolsTarget* target = GetTarget(target_id);
+ GURL page_url;
+ if (target)
+ page_url = target->GetURL();
DevToolsManagerDelegate* manager_delegate =
DevToolsManager::GetInstance()->delegate();
std::string data =
@@ -686,12 +749,12 @@ void DevToolsHttpHandlerImpl::OnThumbnailRequestUI(
Send404(connection_id);
}
-void DevToolsHttpHandlerImpl::OnDiscoveryPageRequestUI(int connection_id) {
+void DevToolsHttpHandlerImpl::OnDiscoveryPageRequest(int connection_id) {
std::string response = delegate_->GetDiscoveryPageHTML();
Send200(connection_id, response, "text/html; charset=UTF-8");
}
-void DevToolsHttpHandlerImpl::OnWebSocketRequestUI(
+void DevToolsHttpHandlerImpl::OnWebSocketRequest(
int connection_id,
const net::HttpServerRequestInfo& request) {
if (!thread_)
@@ -732,14 +795,14 @@ void DevToolsHttpHandlerImpl::OnWebSocketRequestUI(
return;
}
- DevToolsAgentHostClientImpl* client_host = new DevToolsAgentHostClientImpl(
+ AgentHostClientImpl* client_host = new AgentHostClientImpl(
thread_->message_loop(), server_.get(), connection_id, agent.get());
- connection_to_client_ui_[connection_id] = client_host;
+ connection_to_client_[connection_id] = client_host;
AcceptWebSocket(connection_id, request);
}
-void DevToolsHttpHandlerImpl::OnWebSocketMessageUI(
+void DevToolsHttpHandlerImpl::OnWebSocketMessage(
int connection_id,
const std::string& data) {
BrowserTargets::iterator browser_it = browser_targets_.find(connection_id);
@@ -749,16 +812,12 @@ void DevToolsHttpHandlerImpl::OnWebSocketMessageUI(
}
ConnectionToClientMap::iterator it =
- connection_to_client_ui_.find(connection_id);
- if (it == connection_to_client_ui_.end())
- return;
-
- DevToolsAgentHostClientImpl* client =
- static_cast<DevToolsAgentHostClientImpl*>(it->second);
- client->OnMessage(data);
+ connection_to_client_.find(connection_id);
+ if (it != connection_to_client_.end())
+ it->second->OnMessage(data);
}
-void DevToolsHttpHandlerImpl::OnCloseUI(int connection_id) {
+void DevToolsHttpHandlerImpl::OnClose(int connection_id) {
BrowserTargets::iterator browser_it = browser_targets_.find(connection_id);
if (browser_it != browser_targets_.end()) {
delete browser_it->second;
@@ -767,78 +826,107 @@ void DevToolsHttpHandlerImpl::OnCloseUI(int connection_id) {
}
ConnectionToClientMap::iterator it =
- connection_to_client_ui_.find(connection_id);
- if (it != connection_to_client_ui_.end()) {
- DevToolsAgentHostClientImpl* client =
- static_cast<DevToolsAgentHostClientImpl*>(it->second);
- delete client;
- connection_to_client_ui_.erase(connection_id);
+ connection_to_client_.find(connection_id);
+ if (it != connection_to_client_.end()) {
+ delete it->second;
+ connection_to_client_.erase(connection_id);
}
}
-void DevToolsHttpHandlerImpl::OnHttpServerInitialized(
- const net::IPEndPoint& ip_address) {
- server_ip_address_.reset(new net::IPEndPoint(ip_address));
-}
-
DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl(
scoped_ptr<ServerSocketFactory> server_socket_factory,
const std::string& frontend_url,
DevToolsHttpHandlerDelegate* delegate,
- const base::FilePath& active_port_output_directory)
+ const base::FilePath& output_directory)
: frontend_url_(frontend_url),
- server_socket_factory_(server_socket_factory.Pass()),
delegate_(delegate),
- active_port_output_directory_(active_port_output_directory) {
+ weak_factory_(this) {
if (frontend_url_.empty())
frontend_url_ = "/devtools/devtools.html";
- // Balanced in ResetHandlerThreadAndRelease().
- AddRef();
+ BrowserThread::PostTaskAndReplyWithResult(
+ BrowserThread::FILE, FROM_HERE,
+ base::Bind(&StartHandlerThread),
+ base::Bind(&DevToolsHttpHandlerImpl::ThreadStarted,
+ weak_factory_.GetWeakPtr(),
+ base::Passed(&server_socket_factory),
+ output_directory));
}
-// Runs on the handler thread
-void DevToolsHttpHandlerImpl::Init() {
+void DevToolsHttpHandlerImpl::ThreadStarted(
+ scoped_ptr<ServerSocketFactory> server_socket_factory,
+ const base::FilePath& output_directory,
+ scoped_ptr<base::Thread> thread) {
+ thread_.swap(thread);
+ thread_->message_loop()->PostTask(FROM_HERE,
+ base::Bind(&DevToolsHttpHandlerImpl::ServerWrapper::StartServer,
+ weak_factory_.GetWeakPtr(),
+ base::Passed(&server_socket_factory),
+ output_directory,
+ delegate_->GetDebugFrontendDir(),
+ delegate_->BundlesFrontendResources()));
+}
+
+// static
+void DevToolsHttpHandlerImpl::ServerWrapper::StartServer(
+ base::WeakPtr<DevToolsHttpHandlerImpl> handler,
+ scoped_ptr<ServerSocketFactory> server_socket_factory,
+ const base::FilePath& output_directory,
+ const base::FilePath& frontend_dir,
+ bool bundles_resources) {
+ scoped_ptr<ServerWrapper> server;
scoped_ptr<net::ServerSocket> server_socket =
- server_socket_factory_->CreateAndListen();
- if (!server_socket) {
+ server_socket_factory->CreateAndListen();
+ scoped_ptr<net::IPEndPoint> ip_address(new net::IPEndPoint);
+ if (server_socket) {
+ server.reset(new ServerWrapper(handler, server_socket.Pass(),
+ frontend_dir, bundles_resources));
+ if (!output_directory.empty())
+ server->WriteActivePortToUserProfile(output_directory);
+
+ if (server->server_->GetLocalAddress(ip_address.get()) != net::OK)
+ ip_address.reset();
+ } else {
+ ip_address.reset();
LOG(ERROR) << "Cannot start http server for devtools. Stop devtools.";
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&DevToolsHttpHandlerImpl::StopWithoutRelease, this));
- return;
}
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&DevToolsHttpHandlerImpl::ServerStarted,
+ handler, base::Passed(&server), base::Passed(&ip_address)));
+}
- server_.reset(new net::HttpServer(server_socket.Pass(), this));
- net::IPEndPoint ip_address;
- server_->GetLocalAddress(&ip_address);
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&DevToolsHttpHandlerImpl::OnHttpServerInitialized,
- this, ip_address));
- if (!active_port_output_directory_.empty())
- WriteActivePortToUserProfile();
+DevToolsHttpHandlerImpl::ServerWrapper::ServerWrapper(
+ base::WeakPtr<DevToolsHttpHandlerImpl> handler,
+ scoped_ptr<net::ServerSocket> socket,
+ const base::FilePath& frontend_dir,
+ bool bundles_resources)
+ : handler_(handler),
+ server_(new net::HttpServer(socket.Pass(), this)),
+ frontend_dir_(frontend_dir),
+ bundles_resources_(bundles_resources) {
}
-// Runs on the handler thread
-void DevToolsHttpHandlerImpl::Teardown() {
- server_.reset();
+void DevToolsHttpHandlerImpl::ServerStarted(
+ scoped_ptr<ServerWrapper> server,
+ scoped_ptr<net::IPEndPoint> ip_address) {
+ if (server) {
+ server_.swap(server);
+ server_ip_address_.swap(ip_address);
+ } else {
+ StopHandlerThread();
+ }
}
-// Runs on FILE thread to make sure that it is serialized against
-// {Start|Stop}HandlerThread and to allow calling pthread_join.
void DevToolsHttpHandlerImpl::StopHandlerThread() {
- if (!thread_->message_loop())
- return;
- thread_->message_loop()->PostTask(
- FROM_HERE,
- base::Bind(&DevToolsHttpHandlerImpl::Teardown, this));
- // Thread::Stop joins the thread.
- thread_->Stop();
+ if (thread_) {
+ BrowserThread::DeleteSoon(BrowserThread::FILE, FROM_HERE,
+ thread_.release());
+ }
}
-void DevToolsHttpHandlerImpl::WriteActivePortToUserProfile() {
- DCHECK(!active_port_output_directory_.empty());
+void DevToolsHttpHandlerImpl::ServerWrapper::WriteActivePortToUserProfile(
+ const base::FilePath& output_directory) {
+ DCHECK(!output_directory.empty());
net::IPEndPoint endpoint;
int err;
if ((err = server_->GetLocalAddress(&endpoint)) != net::OK) {
@@ -848,8 +936,7 @@ void DevToolsHttpHandlerImpl::WriteActivePortToUserProfile() {
// Write this port to a well-known file in the profile directory
// so Telemetry can pick it up.
- base::FilePath path = active_port_output_directory_.Append(
- kDevToolsActivePortFileName);
+ base::FilePath path = output_directory.Append(kDevToolsActivePortFileName);
std::string port_string = base::IntToString(endpoint.port());
if (base::WriteFile(path, port_string.c_str(), port_string.length()) < 0) {
LOG(ERROR) << "Error writing DevTools active port to file";
@@ -879,7 +966,7 @@ void DevToolsHttpHandlerImpl::SendJson(int connection_id,
thread_->message_loop()->PostTask(
FROM_HERE,
- base::Bind(&net::HttpServer::SendResponse,
+ base::Bind(&ServerWrapper::SendResponse,
base::Unretained(server_.get()),
connection_id,
response));
@@ -892,7 +979,7 @@ void DevToolsHttpHandlerImpl::Send200(int connection_id,
return;
thread_->message_loop()->PostTask(
FROM_HERE,
- base::Bind(&net::HttpServer::Send200,
+ base::Bind(&ServerWrapper::Send200,
base::Unretained(server_.get()),
connection_id,
data,
@@ -904,7 +991,7 @@ void DevToolsHttpHandlerImpl::Send404(int connection_id) {
return;
thread_->message_loop()->PostTask(
FROM_HERE,
- base::Bind(&net::HttpServer::Send404,
+ base::Bind(&ServerWrapper::Send404,
base::Unretained(server_.get()),
connection_id));
}
@@ -915,7 +1002,7 @@ void DevToolsHttpHandlerImpl::Send500(int connection_id,
return;
thread_->message_loop()->PostTask(
FROM_HERE,
- base::Bind(&net::HttpServer::Send500,
+ base::Bind(&ServerWrapper::Send500,
base::Unretained(server_.get()),
connection_id,
message));
@@ -928,13 +1015,7 @@ void DevToolsHttpHandlerImpl::AcceptWebSocket(
return;
thread_->message_loop()->PostTask(
FROM_HERE,
- base::Bind(&net::HttpServer::SetSendBufferSize,
- base::Unretained(server_.get()),
- connection_id,
- kSendBufferSizeForDevTools));
- thread_->message_loop()->PostTask(
- FROM_HERE,
- base::Bind(&net::HttpServer::AcceptWebSocket,
+ base::Bind(&ServerWrapper::AcceptWebSocket,
base::Unretained(server_.get()),
connection_id,
request));

Powered by Google App Engine
This is Rietveld 408576698