Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/debugger/devtools_http_protocol_handler.h" | 5 #include "chrome/browser/debugger/devtools_http_protocol_handler.h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/message_loop_proxy.h" | 9 #include "base/message_loop_proxy.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 | 30 |
| 31 // An internal implementation of DevToolsClientHost that delegates | 31 // An internal implementation of DevToolsClientHost that delegates |
| 32 // messages sent for DevToolsClient to a DebuggerShell instance. | 32 // messages sent for DevToolsClient to a DebuggerShell instance. |
| 33 class DevToolsClientHostImpl : public DevToolsClientHost { | 33 class DevToolsClientHostImpl : public DevToolsClientHost { |
| 34 public: | 34 public: |
| 35 explicit DevToolsClientHostImpl(HttpListenSocket* socket) | 35 explicit DevToolsClientHostImpl(HttpListenSocket* socket) |
| 36 : socket_(socket) {} | 36 : socket_(socket) {} |
| 37 ~DevToolsClientHostImpl() {} | 37 ~DevToolsClientHostImpl() {} |
| 38 | 38 |
| 39 // DevToolsClientHost interface | 39 // DevToolsClientHost interface |
| 40 virtual void InspectedTabClosing() {} | 40 virtual void InspectedTabClosing() { |
| 41 socket_->Close(); | |
| 42 } | |
| 43 | |
| 41 virtual void SendMessageToClient(const IPC::Message& msg) { | 44 virtual void SendMessageToClient(const IPC::Message& msg) { |
| 42 IPC_BEGIN_MESSAGE_MAP(DevToolsClientHostImpl, msg) | 45 IPC_BEGIN_MESSAGE_MAP(DevToolsClientHostImpl, msg) |
| 43 IPC_MESSAGE_HANDLER(DevToolsClientMsg_RpcMessage, OnRpcMessage); | 46 IPC_MESSAGE_HANDLER(DevToolsClientMsg_RpcMessage, OnRpcMessage); |
| 44 IPC_MESSAGE_UNHANDLED_ERROR() | 47 IPC_MESSAGE_UNHANDLED_ERROR() |
| 45 IPC_END_MESSAGE_MAP() | 48 IPC_END_MESSAGE_MAP() |
| 46 } | 49 } |
| 47 | 50 |
| 51 void NotifyCloseListener() { | |
| 52 DevToolsClientHost::NotifyCloseListener(); | |
| 53 } | |
| 48 private: | 54 private: |
| 49 // Message handling routines | 55 // Message handling routines |
| 50 void OnRpcMessage(const DevToolsMessageData& data) { | 56 void OnRpcMessage(const DevToolsMessageData& data) { |
| 51 std::string message; | 57 std::string message; |
| 52 message += "devtools$$dispatch(\"" + data.class_name + "\", \"" + | 58 message += "devtools$$dispatch(\"" + data.class_name + "\", \"" + |
| 53 data.method_name + "\""; | 59 data.method_name + "\""; |
| 54 for (std::vector<std::string>::const_iterator it = data.arguments.begin(); | 60 for (std::vector<std::string>::const_iterator it = data.arguments.begin(); |
| 55 it != data.arguments.end(); ++it) { | 61 it != data.arguments.end(); ++it) { |
| 56 std::string param = *it; | 62 std::string param = *it; |
| 57 if (!param.empty()) | 63 if (!param.empty()) |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 75 ChromeThread::IO, FROM_HERE, | 81 ChromeThread::IO, FROM_HERE, |
| 76 NewRunnableMethod(this, &DevToolsHttpProtocolHandler::Init)); | 82 NewRunnableMethod(this, &DevToolsHttpProtocolHandler::Init)); |
| 77 } | 83 } |
| 78 | 84 |
| 79 void DevToolsHttpProtocolHandler::Stop() { | 85 void DevToolsHttpProtocolHandler::Stop() { |
| 80 ChromeThread::PostTask( | 86 ChromeThread::PostTask( |
| 81 ChromeThread::IO, FROM_HERE, | 87 ChromeThread::IO, FROM_HERE, |
| 82 NewRunnableMethod(this, &DevToolsHttpProtocolHandler::Teardown)); | 88 NewRunnableMethod(this, &DevToolsHttpProtocolHandler::Teardown)); |
| 83 } | 89 } |
| 84 | 90 |
| 85 void DevToolsHttpProtocolHandler::OnHttpRequest(HttpListenSocket* socket, | 91 void DevToolsHttpProtocolHandler::OnHttpRequest( |
| 86 HttpServerRequestInfo* info) { | 92 HttpListenSocket* socket, |
| 87 URLRequest* request = new URLRequest(GURL("chrome:/" + info->path), this); | 93 const HttpServerRequestInfo& info) { |
| 94 size_t pos = info.path.find("/devtools/"); | |
| 95 if (pos != 0) { | |
| 96 socket->Send404(); | |
| 97 return; | |
| 98 } | |
| 99 | |
| 100 if (info.path == "/devtools/pages") { | |
| 101 // Pages discovery request. | |
| 102 ChromeThread::PostTask( | |
| 103 ChromeThread::UI, | |
| 104 FROM_HERE, | |
| 105 NewRunnableMethod(this, | |
| 106 &DevToolsHttpProtocolHandler::OnHttpRequestUI, | |
| 107 socket, | |
| 108 info)); | |
| 109 return; | |
| 110 } | |
| 111 | |
| 112 // Proxy static files from chrome://devtools/*. | |
| 113 URLRequest* request = new URLRequest(GURL("chrome:/" + info.path), this); | |
| 88 Bind(request, socket); | 114 Bind(request, socket); |
| 89 request->set_context( | 115 request->set_context( |
| 90 Profile::GetDefaultRequestContext()->GetURLRequestContext()); | 116 Profile::GetDefaultRequestContext()->GetURLRequestContext()); |
| 91 request->Start(); | 117 request->Start(); |
| 92 } | 118 } |
| 93 | 119 |
| 94 void DevToolsHttpProtocolHandler::OnWebSocketRequest( | 120 void DevToolsHttpProtocolHandler::OnWebSocketRequest( |
| 95 HttpListenSocket* socket, | 121 HttpListenSocket* socket, |
| 96 HttpServerRequestInfo* request) { | 122 const HttpServerRequestInfo& request) { |
| 97 socket->AcceptWebSocket(request); | 123 ChromeThread::PostTask( |
| 124 ChromeThread::UI, | |
| 125 FROM_HERE, | |
| 126 NewRunnableMethod( | |
| 127 this, | |
| 128 &DevToolsHttpProtocolHandler::OnWebSocketRequestUI, | |
| 129 socket, | |
| 130 request)); | |
| 98 } | 131 } |
| 99 | 132 |
| 100 void DevToolsHttpProtocolHandler::OnWebSocketMessage(HttpListenSocket* socket, | 133 void DevToolsHttpProtocolHandler::OnWebSocketMessage(HttpListenSocket* socket, |
| 101 const std::string& data) { | 134 const std::string& data) { |
| 102 ChromeThread::PostTask( | 135 ChromeThread::PostTask( |
| 103 ChromeThread::UI, | 136 ChromeThread::UI, |
| 104 FROM_HERE, | 137 FROM_HERE, |
| 105 NewRunnableMethod( | 138 NewRunnableMethod( |
| 106 this, | 139 this, |
| 107 &DevToolsHttpProtocolHandler::OnWebSocketMessageUI, | 140 &DevToolsHttpProtocolHandler::OnWebSocketMessageUI, |
| 108 socket, | 141 socket, |
| 109 data)); | 142 data)); |
| 110 } | 143 } |
| 111 | 144 |
| 145 void DevToolsHttpProtocolHandler::OnClose(HttpListenSocket* socket) { | |
| 146 SocketToRequestsMap::iterator it = socket_to_requests_io_.find(socket); | |
| 147 if (it != socket_to_requests_io_.end()) { | |
| 148 // Dispose delegating socket. | |
| 149 for (std::set<URLRequest*>::iterator it2 = it->second.begin(); | |
| 150 it2 != it->second.end(); ++it2) { | |
| 151 URLRequest* request = *it2; | |
| 152 request->Cancel(); | |
| 153 request_to_socket_io_.erase(request); | |
| 154 request_to_buffer_io_.erase(request); | |
| 155 delete request; | |
| 156 } | |
| 157 socket_to_requests_io_.erase(socket); | |
| 158 } | |
| 159 | |
| 160 ChromeThread::PostTask( | |
| 161 ChromeThread::UI, | |
| 162 FROM_HERE, | |
| 163 NewRunnableMethod( | |
| 164 this, | |
| 165 &DevToolsHttpProtocolHandler::OnCloseUI, | |
| 166 socket)); | |
| 167 } | |
| 168 | |
| 169 void DevToolsHttpProtocolHandler::OnHttpRequestUI( | |
| 170 HttpListenSocket* socket, | |
| 171 const HttpServerRequestInfo& info) { | |
| 172 std::string response = "<html><body>"; | |
| 173 for (BrowserList::const_iterator it = BrowserList::begin(), | |
| 174 end = BrowserList::end(); it != end; ++it) { | |
| 175 TabStripModel* model = (*it)->tabstrip_model(); | |
| 176 for (int i = 0, size = model->count(); i < size; ++i) { | |
| 177 TabContents* tab_contents = model->GetTabContentsAt(i); | |
| 178 NavigationController& controller = tab_contents->controller(); | |
| 179 NavigationEntry* entry = controller.GetActiveEntry(); | |
| 180 if (entry == NULL) | |
| 181 continue; | |
| 182 | |
| 183 if (!entry->url().is_valid()) | |
| 184 continue; | |
| 185 | |
| 186 DevToolsClientHost* client_host = DevToolsManager::GetInstance()-> | |
| 187 GetDevToolsClientHostFor(tab_contents->render_view_host()); | |
| 188 if (!client_host) { | |
| 189 response += StringPrintf( | |
| 190 "<a href='devtools.html?page=%d'>%s (%s)</a><br>", | |
|
yurys
2010/07/22 15:12:42
could you send raw data and format them on the cli
pfeldman
2010/07/26 12:10:57
So far I am using this handler for local testing.
| |
| 191 controller.session_id().id(), | |
| 192 UTF16ToUTF8(entry->title()).c_str(), | |
| 193 entry->url().spec().c_str()); | |
| 194 } else { | |
| 195 response += StringPrintf( | |
| 196 "%s (%s)<br>", | |
| 197 UTF16ToUTF8(entry->title()).c_str(), | |
| 198 entry->url().spec().c_str()); | |
| 199 } | |
| 200 } | |
| 201 } | |
| 202 response += "</body></html>"; | |
| 203 Send200(socket, response, "text/html"); | |
| 204 } | |
| 205 | |
| 206 void DevToolsHttpProtocolHandler::OnWebSocketRequestUI( | |
| 207 HttpListenSocket* socket, | |
| 208 const HttpServerRequestInfo& request) { | |
| 209 std::string prefix = "/devtools/page/"; | |
| 210 size_t pos = request.path.find(prefix); | |
| 211 if (pos != 0) { | |
| 212 Send404(socket); | |
| 213 return; | |
| 214 } | |
| 215 std::string page_id = request.path.substr(prefix.length()); | |
| 216 int id = 0; | |
| 217 if (!StringToInt(page_id, &id)) { | |
| 218 Send500(socket, "Invalid page id: " + page_id); | |
| 219 return; | |
| 220 } | |
| 221 | |
| 222 TabContents* tab_contents = GetTabContents(id); | |
| 223 if (tab_contents == NULL) { | |
| 224 Send500(socket, "No such page id: " + page_id); | |
| 225 return; | |
| 226 } | |
| 227 | |
| 228 DevToolsManager* manager = DevToolsManager::GetInstance(); | |
| 229 if (manager->GetDevToolsClientHostFor(tab_contents->render_view_host())) { | |
| 230 Send500(socket, "Page with given id is being inspected: " + page_id); | |
| 231 return; | |
| 232 } | |
| 233 | |
| 234 DevToolsClientHostImpl* client_host = new DevToolsClientHostImpl(socket); | |
| 235 socket_to_client_host_ui_[socket] = client_host; | |
| 236 | |
| 237 manager->RegisterDevToolsClientHostFor( | |
| 238 tab_contents->render_view_host(), | |
| 239 client_host); | |
| 240 AcceptWebSocket(socket, request); | |
| 241 } | |
| 242 | |
| 112 void DevToolsHttpProtocolHandler::OnWebSocketMessageUI( | 243 void DevToolsHttpProtocolHandler::OnWebSocketMessageUI( |
| 113 HttpListenSocket* socket, | 244 HttpListenSocket* socket, |
| 114 const std::string& d) { | 245 const std::string& d) { |
| 246 SocketToClientHostMap::iterator it = socket_to_client_host_ui_.find(socket); | |
| 247 if (it == socket_to_client_host_ui_.end()) | |
| 248 return; | |
| 249 | |
| 115 std::string data = d; | 250 std::string data = d; |
| 116 if (!client_host_.get() && data == "attach") { | 251 // TODO(pfeldman): Replace with proper parsing / dispatching. |
| 117 client_host_.reset(new DevToolsClientHostImpl(socket)); | 252 DevToolsMessageData message_data; |
| 118 BrowserList::const_iterator it = BrowserList::begin(); | 253 message_data.class_name = "ToolsAgent"; |
| 119 TabContents* tab_contents = (*it)->tabstrip_model()->GetTabContentsAt(0); | 254 message_data.method_name = "dispatchOnInspectorController"; |
| 120 DevToolsManager* manager = DevToolsManager::GetInstance(); | |
| 121 manager->RegisterDevToolsClientHostFor(tab_contents->render_view_host(), | |
| 122 client_host_.get()); | |
| 123 } else { | |
| 124 // TODO(pfeldman): Replace with proper parsing / dispatching. | |
| 125 DevToolsMessageData message_data; | |
| 126 message_data.class_name = "ToolsAgent"; | |
| 127 message_data.method_name = "dispatchOnInspectorController"; | |
| 128 | 255 |
| 129 size_t pos = data.find(" "); | 256 size_t pos = data.find(" "); |
| 130 message_data.arguments.push_back(data.substr(0, pos)); | 257 message_data.arguments.push_back(data.substr(0, pos)); |
| 131 data = data.substr(pos + 1); | 258 data = data.substr(pos + 1); |
| 132 | 259 |
| 133 pos = data.find(" "); | 260 pos = data.find(" "); |
| 134 message_data.arguments.push_back(data.substr(0, pos)); | 261 message_data.arguments.push_back(data.substr(0, pos)); |
| 135 data = data.substr(pos + 1); | 262 data = data.substr(pos + 1); |
| 136 | 263 |
| 137 message_data.arguments.push_back(data); | 264 message_data.arguments.push_back(data); |
| 138 | 265 |
| 139 DevToolsManager* manager = DevToolsManager::GetInstance(); | 266 DevToolsManager* manager = DevToolsManager::GetInstance(); |
| 140 manager->ForwardToDevToolsAgent(client_host_.get(), | 267 manager->ForwardToDevToolsAgent(it->second, |
| 141 DevToolsAgentMsg_RpcMessage(DevToolsMessageData(message_data))); | 268 DevToolsAgentMsg_RpcMessage(DevToolsMessageData(message_data))); |
| 142 } | |
| 143 } | 269 } |
| 144 | 270 |
| 145 void DevToolsHttpProtocolHandler::OnClose(HttpListenSocket* socket) { | 271 void DevToolsHttpProtocolHandler::OnCloseUI(HttpListenSocket* socket) { |
| 146 SocketToRequestsMap::iterator it = socket_to_requests_.find(socket); | 272 SocketToClientHostMap::iterator it = socket_to_client_host_ui_.find(socket); |
| 147 if (it == socket_to_requests_.end()) | 273 if (it == socket_to_client_host_ui_.end()) |
| 148 return; | 274 return; |
| 149 | 275 DevToolsClientHostImpl* client_host = |
| 150 for (std::set<URLRequest*>::iterator it2 = it->second.begin(); | 276 static_cast<DevToolsClientHostImpl*>(it->second); |
| 151 it2 != it->second.end(); ++it2) { | 277 client_host->NotifyCloseListener(); |
| 152 URLRequest* request = *it2; | 278 delete client_host; |
| 153 request->Cancel(); | 279 socket_to_client_host_ui_.erase(socket); |
| 154 request_to_socket_.erase(request); | |
| 155 request_to_buffer_.erase(request); | |
| 156 delete request; | |
| 157 } | |
| 158 socket_to_requests_.erase(socket); | |
| 159 } | 280 } |
| 160 | 281 |
| 161 void DevToolsHttpProtocolHandler::OnResponseStarted(URLRequest* request) { | 282 void DevToolsHttpProtocolHandler::OnResponseStarted(URLRequest* request) { |
| 162 RequestToSocketMap::iterator it = request_to_socket_.find(request); | 283 RequestToSocketMap::iterator it = request_to_socket_io_.find(request); |
| 163 if (it == request_to_socket_.end()) | 284 if (it == request_to_socket_io_.end()) |
| 164 return; | 285 return; |
| 165 | 286 |
| 166 HttpListenSocket* socket = it->second; | 287 HttpListenSocket* socket = it->second; |
| 167 | 288 |
| 168 int expected_size = static_cast<int>(request->GetExpectedContentSize()); | 289 int expected_size = static_cast<int>(request->GetExpectedContentSize()); |
| 169 | 290 |
| 170 std::string content_type; | 291 std::string content_type; |
| 171 request->GetMimeType(&content_type); | 292 request->GetMimeType(&content_type); |
| 172 | 293 |
| 173 if (request->status().is_success()) { | 294 if (request->status().is_success()) { |
| 174 socket->Send(StringPrintf("HTTP/1.1 200 OK\r\n" | 295 socket->Send(StringPrintf("HTTP/1.1 200 OK\r\n" |
| 175 "Content-Type:%s\r\n" | 296 "Content-Type:%s\r\n" |
| 176 "Content-Length:%d\r\n" | 297 "Content-Length:%d\r\n" |
| 177 "\r\n", | 298 "\r\n", |
| 178 content_type.c_str(), | 299 content_type.c_str(), |
| 179 expected_size)); | 300 expected_size)); |
| 180 } else { | 301 } else { |
| 181 socket->Send("HTTP/1.1 404 Not Found\r\n" | 302 socket->Send404(); |
| 182 "Content-Length: 0\r\n" | |
| 183 "\r\n"); | |
| 184 } | 303 } |
| 185 | 304 |
| 186 int bytes_read = 0; | 305 int bytes_read = 0; |
| 187 // Some servers may treat HEAD requests as GET requests. To free up the | 306 // Some servers may treat HEAD requests as GET requests. To free up the |
| 188 // network connection as soon as possible, signal that the request has | 307 // network connection as soon as possible, signal that the request has |
| 189 // completed immediately, without trying to read any data back (all we care | 308 // completed immediately, without trying to read any data back (all we care |
| 190 // about is the response code and headers, which we already have). | 309 // about is the response code and headers, which we already have). |
| 191 net::IOBuffer* buffer = request_to_buffer_[request].get(); | 310 net::IOBuffer* buffer = request_to_buffer_io_[request].get(); |
| 192 if (request->status().is_success()) | 311 if (request->status().is_success()) |
| 193 request->Read(buffer, kBufferSize, &bytes_read); | 312 request->Read(buffer, kBufferSize, &bytes_read); |
| 194 OnReadCompleted(request, bytes_read); | 313 OnReadCompleted(request, bytes_read); |
| 195 } | 314 } |
| 196 | 315 |
| 197 void DevToolsHttpProtocolHandler::OnReadCompleted(URLRequest* request, | 316 void DevToolsHttpProtocolHandler::OnReadCompleted(URLRequest* request, |
| 198 int bytes_read) { | 317 int bytes_read) { |
| 199 RequestToSocketMap::iterator it = request_to_socket_.find(request); | 318 RequestToSocketMap::iterator it = request_to_socket_io_.find(request); |
| 200 if (it == request_to_socket_.end()) | 319 if (it == request_to_socket_io_.end()) |
| 201 return; | 320 return; |
| 202 | 321 |
| 203 HttpListenSocket* socket = it->second; | 322 HttpListenSocket* socket = it->second; |
| 204 | 323 |
| 205 net::IOBuffer* buffer = request_to_buffer_[request].get(); | 324 net::IOBuffer* buffer = request_to_buffer_io_[request].get(); |
| 206 do { | 325 do { |
| 207 if (!request->status().is_success() || bytes_read <= 0) | 326 if (!request->status().is_success() || bytes_read <= 0) |
| 208 break; | 327 break; |
| 209 socket->Send(buffer->data(), bytes_read); | 328 socket->Send(buffer->data(), bytes_read); |
| 210 } while (request->Read(buffer, kBufferSize, &bytes_read)); | 329 } while (request->Read(buffer, kBufferSize, &bytes_read)); |
| 211 | 330 |
| 212 // See comments re: HEAD requests in OnResponseStarted(). | 331 // See comments re: HEAD requests in OnResponseStarted(). |
| 213 if (!request->status().is_io_pending()) | 332 if (!request->status().is_io_pending()) |
| 214 RequestCompleted(request); | 333 RequestCompleted(request); |
| 215 } | 334 } |
| 216 | 335 |
| 217 DevToolsHttpProtocolHandler::DevToolsHttpProtocolHandler(int port) | 336 DevToolsHttpProtocolHandler::DevToolsHttpProtocolHandler(int port) |
| 218 : port_(port), | 337 : port_(port), |
| 219 server_(NULL) { | 338 server_(NULL) { |
| 220 } | 339 } |
| 221 | 340 |
| 222 void DevToolsHttpProtocolHandler::Init() { | 341 void DevToolsHttpProtocolHandler::Init() { |
| 223 server_ = HttpListenSocket::Listen("127.0.0.1", port_, this); | 342 server_ = HttpListenSocket::Listen("127.0.0.1", port_, this); |
| 224 } | 343 } |
| 225 | 344 |
| 226 // Run on I/O thread | 345 // Run on I/O thread |
| 227 void DevToolsHttpProtocolHandler::Teardown() { | 346 void DevToolsHttpProtocolHandler::Teardown() { |
| 228 server_ = NULL; | 347 server_ = NULL; |
| 229 } | 348 } |
| 230 | 349 |
| 231 void DevToolsHttpProtocolHandler::Bind(URLRequest* request, | 350 void DevToolsHttpProtocolHandler::Bind(URLRequest* request, |
| 232 HttpListenSocket* socket) { | 351 HttpListenSocket* socket) { |
| 233 request_to_socket_[request] = socket; | 352 request_to_socket_io_[request] = socket; |
| 234 SocketToRequestsMap::iterator it = socket_to_requests_.find(socket); | 353 SocketToRequestsMap::iterator it = socket_to_requests_io_.find(socket); |
| 235 if (it == socket_to_requests_.end()) { | 354 if (it == socket_to_requests_io_.end()) { |
| 236 std::pair<HttpListenSocket*, std::set<URLRequest*> > value( | 355 std::pair<HttpListenSocket*, std::set<URLRequest*> > value( |
| 237 socket, | 356 socket, |
| 238 std::set<URLRequest*>()); | 357 std::set<URLRequest*>()); |
| 239 it = socket_to_requests_.insert(value).first; | 358 it = socket_to_requests_io_.insert(value).first; |
| 240 } | 359 } |
| 241 it->second.insert(request); | 360 it->second.insert(request); |
| 242 request_to_buffer_[request] = new net::IOBuffer(kBufferSize); | 361 request_to_buffer_io_[request] = new net::IOBuffer(kBufferSize); |
| 243 } | 362 } |
| 244 | 363 |
| 245 void DevToolsHttpProtocolHandler::RequestCompleted(URLRequest* request) { | 364 void DevToolsHttpProtocolHandler::RequestCompleted(URLRequest* request) { |
| 246 RequestToSocketMap::iterator it = request_to_socket_.find(request); | 365 RequestToSocketMap::iterator it = request_to_socket_io_.find(request); |
| 247 if (it == request_to_socket_.end()) | 366 if (it == request_to_socket_io_.end()) |
| 248 return; | 367 return; |
| 249 | 368 |
| 250 HttpListenSocket* socket = it->second; | 369 HttpListenSocket* socket = it->second; |
| 251 request_to_socket_.erase(request); | 370 request_to_socket_io_.erase(request); |
| 252 SocketToRequestsMap::iterator it2 = socket_to_requests_.find(socket); | 371 SocketToRequestsMap::iterator it2 = socket_to_requests_io_.find(socket); |
| 253 it2->second.erase(request); | 372 it2->second.erase(request); |
| 254 request_to_buffer_.erase(request); | 373 request_to_buffer_io_.erase(request); |
| 255 delete request; | 374 delete request; |
| 256 } | 375 } |
| 376 | |
| 377 void DevToolsHttpProtocolHandler::Send200(HttpListenSocket* socket, | |
| 378 const std::string& data, | |
| 379 const std::string& mime_type) { | |
| 380 ChromeThread::PostTask( | |
| 381 ChromeThread::IO, FROM_HERE, | |
| 382 NewRunnableMethod(socket, | |
| 383 &HttpListenSocket::Send200, | |
| 384 data, | |
| 385 mime_type)); | |
| 386 } | |
| 387 | |
| 388 void DevToolsHttpProtocolHandler::Send404(HttpListenSocket* socket) { | |
| 389 ChromeThread::PostTask( | |
| 390 ChromeThread::IO, FROM_HERE, | |
| 391 NewRunnableMethod(socket, | |
| 392 &HttpListenSocket::Send404)); | |
| 393 } | |
| 394 | |
| 395 void DevToolsHttpProtocolHandler::Send500(HttpListenSocket* socket, | |
| 396 const std::string& message) { | |
| 397 ChromeThread::PostTask( | |
| 398 ChromeThread::IO, FROM_HERE, | |
| 399 NewRunnableMethod(socket, | |
| 400 &HttpListenSocket::Send500, | |
| 401 message)); | |
| 402 } | |
| 403 | |
| 404 void DevToolsHttpProtocolHandler::AcceptWebSocket( | |
| 405 HttpListenSocket* socket, | |
| 406 const HttpServerRequestInfo& request) { | |
| 407 ChromeThread::PostTask( | |
| 408 ChromeThread::IO, FROM_HERE, | |
| 409 NewRunnableMethod(socket, | |
| 410 &HttpListenSocket::AcceptWebSocket, | |
| 411 request)); | |
| 412 } | |
| 413 | |
| 414 TabContents* DevToolsHttpProtocolHandler::GetTabContents(int session_id) { | |
| 415 for (BrowserList::const_iterator it = BrowserList::begin(), | |
| 416 end = BrowserList::end(); it != end; ++it) { | |
| 417 TabStripModel* model = (*it)->tabstrip_model(); | |
| 418 for (int i = 0, size = model->count(); i < size; ++i) { | |
| 419 NavigationController& controller = | |
| 420 model->GetTabContentsAt(i)->controller(); | |
| 421 if (controller.session_id().id() == session_id) | |
|
yurys
2010/07/22 15:12:42
the session id will change on navigation, won't it
pfeldman
2010/07/26 12:10:57
These are persistent!
| |
| 422 return controller.tab_contents(); | |
| 423 } | |
| 424 } | |
| 425 return NULL; | |
| 426 } | |
| OLD | NEW |