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 <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 // Message handling routines | 64 // Message handling routines |
65 void OnDispatchOnInspectorFrontend(const std::string& data) { | 65 void OnDispatchOnInspectorFrontend(const std::string& data) { |
66 socket_->SendOverWebSocket(data); | 66 socket_->SendOverWebSocket(data); |
67 } | 67 } |
68 virtual void FrameNavigating(const std::string& url) {} | 68 virtual void FrameNavigating(const std::string& url) {} |
69 HttpListenSocket* socket_; | 69 HttpListenSocket* socket_; |
70 }; | 70 }; |
71 | 71 |
72 } // namespace | 72 } // namespace |
73 | 73 |
| 74 |
| 75 // static |
| 76 scoped_refptr<DevToolsHttpProtocolHandler> DevToolsHttpProtocolHandler::Start( |
| 77 int port, |
| 78 const std::string& frontend_url) { |
| 79 scoped_refptr<DevToolsHttpProtocolHandler> http_handler = |
| 80 new DevToolsHttpProtocolHandler(port, frontend_url); |
| 81 http_handler->Start(); |
| 82 return http_handler; |
| 83 } |
| 84 |
74 DevToolsHttpProtocolHandler::~DevToolsHttpProtocolHandler() { | 85 DevToolsHttpProtocolHandler::~DevToolsHttpProtocolHandler() { |
75 // Stop() must be called prior to this being called | 86 // Stop() must be called prior to this being called |
76 DCHECK(server_.get() == NULL); | 87 DCHECK(server_.get() == NULL); |
77 } | 88 } |
78 | 89 |
79 void DevToolsHttpProtocolHandler::Start() { | 90 void DevToolsHttpProtocolHandler::Start() { |
80 BrowserThread::PostTask( | 91 BrowserThread::PostTask( |
81 BrowserThread::IO, FROM_HERE, | 92 BrowserThread::IO, FROM_HERE, |
82 NewRunnableMethod(this, &DevToolsHttpProtocolHandler::Init)); | 93 NewRunnableMethod(this, &DevToolsHttpProtocolHandler::Init)); |
83 } | 94 } |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 FROM_HERE, | 174 FROM_HERE, |
164 NewRunnableMethod( | 175 NewRunnableMethod( |
165 this, | 176 this, |
166 &DevToolsHttpProtocolHandler::OnCloseUI, | 177 &DevToolsHttpProtocolHandler::OnCloseUI, |
167 make_scoped_refptr(socket))); | 178 make_scoped_refptr(socket))); |
168 } | 179 } |
169 | 180 |
170 void DevToolsHttpProtocolHandler::OnHttpRequestUI( | 181 void DevToolsHttpProtocolHandler::OnHttpRequestUI( |
171 HttpListenSocket* socket, | 182 HttpListenSocket* socket, |
172 const HttpServerRequestInfo& info) { | 183 const HttpServerRequestInfo& info) { |
173 std::string response = "<html><body>"; | 184 std::string response = "<html><body><script>" |
| 185 "function addTab(id, url, attached, frontendUrl) {" |
| 186 " if (!attached) {" |
| 187 " var a = document.createElement('a');" |
| 188 " a.textContent = url;" |
| 189 " a.href = frontendUrl + '?remotehost=' + window.location.host +" |
| 190 " '&page=' + id;" |
| 191 " document.body.appendChild(a);" |
| 192 " } else {" |
| 193 " var span = document.createElement('span');" |
| 194 " span.textContent = url + ' (attached)';" |
| 195 " document.body.appendChild(span);" |
| 196 " }" |
| 197 " document.body.appendChild(document.createElement('br'));" |
| 198 "}"; |
| 199 |
174 for (BrowserList::const_iterator it = BrowserList::begin(), | 200 for (BrowserList::const_iterator it = BrowserList::begin(), |
175 end = BrowserList::end(); it != end; ++it) { | 201 end = BrowserList::end(); it != end; ++it) { |
176 TabStripModel* model = (*it)->tabstrip_model(); | 202 TabStripModel* model = (*it)->tabstrip_model(); |
177 for (int i = 0, size = model->count(); i < size; ++i) { | 203 for (int i = 0, size = model->count(); i < size; ++i) { |
178 TabContentsWrapper* tab_contents = model->GetTabContentsAt(i); | 204 TabContentsWrapper* tab_contents = model->GetTabContentsAt(i); |
179 NavigationController& controller = tab_contents->controller(); | 205 NavigationController& controller = tab_contents->controller(); |
180 NavigationEntry* entry = controller.GetActiveEntry(); | 206 NavigationEntry* entry = controller.GetActiveEntry(); |
181 if (entry == NULL) | 207 if (entry == NULL) |
182 continue; | 208 continue; |
183 | 209 |
184 if (!entry->url().is_valid()) | 210 if (!entry->url().is_valid()) |
185 continue; | 211 continue; |
186 | 212 |
187 DevToolsClientHost* client_host = DevToolsManager::GetInstance()-> | 213 DevToolsClientHost* client_host = DevToolsManager::GetInstance()-> |
188 GetDevToolsClientHostFor(tab_contents->tab_contents()-> | 214 GetDevToolsClientHostFor(tab_contents->tab_contents()-> |
189 render_view_host()); | 215 render_view_host()); |
190 if (!client_host) { | 216 response += StringPrintf( |
191 response += StringPrintf( | 217 "addTab(%d, '%s', %s, '%s');\n", |
192 "<a href='/devtools/devtools.html?page=%d'>%s (%s)</a><br>", | 218 controller.session_id().id(), |
193 controller.session_id().id(), | 219 entry->url().spec().c_str(), |
194 UTF16ToUTF8(entry->title()).c_str(), | 220 client_host ? "true" : "false", |
195 entry->url().spec().c_str()); | 221 overriden_frontend_url_.c_str()); |
196 } else { | |
197 response += StringPrintf( | |
198 "%s (%s)<br>", | |
199 UTF16ToUTF8(entry->title()).c_str(), | |
200 entry->url().spec().c_str()); | |
201 } | |
202 } | 222 } |
203 } | 223 } |
204 response += "</body></html>"; | 224 response += "</script></body></html>"; |
205 Send200(socket, response, "text/html; charset=UTF-8"); | 225 Send200(socket, response, "text/html; charset=UTF-8"); |
206 } | 226 } |
207 | 227 |
208 void DevToolsHttpProtocolHandler::OnWebSocketRequestUI( | 228 void DevToolsHttpProtocolHandler::OnWebSocketRequestUI( |
209 HttpListenSocket* socket, | 229 HttpListenSocket* socket, |
210 const HttpServerRequestInfo& request) { | 230 const HttpServerRequestInfo& request) { |
211 std::string prefix = "/devtools/page/"; | 231 std::string prefix = "/devtools/page/"; |
212 size_t pos = request.path.find(prefix); | 232 size_t pos = request.path.find(prefix); |
213 if (pos != 0) { | 233 if (pos != 0) { |
214 Send404(socket); | 234 Send404(socket); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 if (!request->status().is_success() || bytes_read <= 0) | 353 if (!request->status().is_success() || bytes_read <= 0) |
334 break; | 354 break; |
335 socket->Send(buffer->data(), bytes_read); | 355 socket->Send(buffer->data(), bytes_read); |
336 } while (request->Read(buffer, kBufferSize, &bytes_read)); | 356 } while (request->Read(buffer, kBufferSize, &bytes_read)); |
337 | 357 |
338 // See comments re: HEAD requests in OnResponseStarted(). | 358 // See comments re: HEAD requests in OnResponseStarted(). |
339 if (!request->status().is_io_pending()) | 359 if (!request->status().is_io_pending()) |
340 RequestCompleted(request); | 360 RequestCompleted(request); |
341 } | 361 } |
342 | 362 |
343 DevToolsHttpProtocolHandler::DevToolsHttpProtocolHandler(int port) | 363 DevToolsHttpProtocolHandler::DevToolsHttpProtocolHandler( |
| 364 int port, |
| 365 const std::string& frontend_host) |
344 : port_(port), | 366 : port_(port), |
| 367 overriden_frontend_url_(frontend_host), |
345 server_(NULL) { | 368 server_(NULL) { |
| 369 if (overriden_frontend_url_.empty()) |
| 370 overriden_frontend_url_ = "/devtools/devtools.html"; |
346 } | 371 } |
347 | 372 |
348 void DevToolsHttpProtocolHandler::Init() { | 373 void DevToolsHttpProtocolHandler::Init() { |
349 server_ = HttpListenSocket::Listen("127.0.0.1", port_, this); | 374 server_ = HttpListenSocket::Listen("127.0.0.1", port_, this); |
350 } | 375 } |
351 | 376 |
352 // Run on I/O thread | 377 // Run on I/O thread |
353 void DevToolsHttpProtocolHandler::Teardown() { | 378 void DevToolsHttpProtocolHandler::Teardown() { |
354 server_ = NULL; | 379 server_ = NULL; |
355 } | 380 } |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 void DevToolsHttpProtocolHandler::ReleaseSocket( | 446 void DevToolsHttpProtocolHandler::ReleaseSocket( |
422 HttpListenSocket* socket) { | 447 HttpListenSocket* socket) { |
423 // This in fact is scoped ref ptr. It'll get nuked on exit. | 448 // This in fact is scoped ref ptr. It'll get nuked on exit. |
424 } | 449 } |
425 | 450 |
426 TabContents* DevToolsHttpProtocolHandler::GetTabContents(int session_id) { | 451 TabContents* DevToolsHttpProtocolHandler::GetTabContents(int session_id) { |
427 for (BrowserList::const_iterator it = BrowserList::begin(), | 452 for (BrowserList::const_iterator it = BrowserList::begin(), |
428 end = BrowserList::end(); it != end; ++it) { | 453 end = BrowserList::end(); it != end; ++it) { |
429 TabStripModel* model = (*it)->tabstrip_model(); | 454 TabStripModel* model = (*it)->tabstrip_model(); |
430 for (int i = 0, size = model->count(); i < size; ++i) { | 455 for (int i = 0, size = model->count(); i < size; ++i) { |
| 456 TabContentsWrapper* tab_contents = model->GetTabContentsAt(i); |
431 NavigationController& controller = | 457 NavigationController& controller = |
432 model->GetTabContentsAt(i)->controller(); | 458 tab_contents->controller(); |
433 if (controller.session_id().id() == session_id) | 459 if (controller.session_id().id() == session_id) |
434 return controller.tab_contents(); | 460 return controller.tab_contents(); |
435 } | 461 } |
436 } | 462 } |
437 return NULL; | 463 return NULL; |
438 } | 464 } |
OLD | NEW |