Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/debugger/devtools_http_handler_impl.h" | 5 #include "content/browser/debugger/devtools_http_handler_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 21 #include "base/values.h" | 21 #include "base/values.h" |
| 22 #include "content/browser/web_contents/web_contents_impl.h" | 22 #include "content/browser/web_contents/web_contents_impl.h" |
| 23 #include "content/common/devtools_messages.h" | 23 #include "content/common/devtools_messages.h" |
| 24 #include "content/public/browser/browser_thread.h" | 24 #include "content/public/browser/browser_thread.h" |
| 25 #include "content/public/browser/devtools_agent_host_registry.h" | 25 #include "content/public/browser/devtools_agent_host_registry.h" |
| 26 #include "content/public/browser/devtools_client_host.h" | 26 #include "content/public/browser/devtools_client_host.h" |
| 27 #include "content/public/browser/devtools_http_handler_delegate.h" | 27 #include "content/public/browser/devtools_http_handler_delegate.h" |
| 28 #include "content/public/browser/devtools_manager.h" | 28 #include "content/public/browser/devtools_manager.h" |
| 29 #include "content/public/browser/favicon_status.h" | 29 #include "content/public/browser/favicon_status.h" |
| 30 #include "content/public/browser/navigation_entry.h" | 30 #include "content/public/browser/navigation_entry.h" |
| 31 #include "content/public/browser/notification_service.h" | |
| 32 #include "content/public/browser/notification_types.h" | |
| 31 #include "content/public/browser/render_process_host.h" | 33 #include "content/public/browser/render_process_host.h" |
| 32 #include "content/public/browser/render_view_host.h" | 34 #include "content/public/browser/render_view_host.h" |
| 33 #include "content/public/browser/render_widget_host.h" | 35 #include "content/public/browser/render_widget_host.h" |
| 34 #include "content/public/common/content_client.h" | 36 #include "content/public/common/content_client.h" |
| 35 #include "googleurl/src/gurl.h" | 37 #include "googleurl/src/gurl.h" |
| 36 #include "grit/devtools_resources_map.h" | 38 #include "grit/devtools_resources_map.h" |
| 37 #include "net/base/escape.h" | 39 #include "net/base/escape.h" |
| 38 #include "net/base/io_buffer.h" | 40 #include "net/base/io_buffer.h" |
| 39 #include "net/base/ip_endpoint.h" | 41 #include "net/base/ip_endpoint.h" |
| 40 #include "net/server/http_server_request_info.h" | 42 #include "net/server/http_server_request_info.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 74 if (!base::StringToInt(identifier.substr(pos+1), &routing_id)) | 76 if (!base::StringToInt(identifier.substr(pos+1), &routing_id)) |
| 75 return NULL; | 77 return NULL; |
| 76 | 78 |
| 77 return RenderViewHost::FromID(process_id, routing_id); | 79 return RenderViewHost::FromID(process_id, routing_id); |
| 78 } | 80 } |
| 79 }; | 81 }; |
| 80 | 82 |
| 81 | 83 |
| 82 // An internal implementation of DevToolsClientHost that delegates | 84 // An internal implementation of DevToolsClientHost that delegates |
| 83 // messages sent for DevToolsClient to a DebuggerShell instance. | 85 // messages sent for DevToolsClient to a DebuggerShell instance. |
| 84 class DevToolsClientHostImpl : public DevToolsClientHost { | 86 class DevToolsClientHostImpl : public DevToolsClientHost, |
| 87 public NotificationObserver { | |
| 85 public: | 88 public: |
| 86 DevToolsClientHostImpl( | 89 DevToolsClientHostImpl( |
| 87 MessageLoop* message_loop, | 90 MessageLoop* message_loop, |
| 88 net::HttpServer* server, | 91 net::HttpServer* server, |
| 89 int connection_id) | 92 int connection_id, |
| 93 RenderProcessHost* process_host) | |
| 90 : message_loop_(message_loop), | 94 : message_loop_(message_loop), |
| 91 server_(server), | 95 server_(server), |
| 92 connection_id_(connection_id) { | 96 connection_id_(connection_id), |
| 97 is_closed_(false) { | |
| 98 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_TERMINATED, | |
| 99 Source<RenderProcessHost>(process_host)); | |
| 100 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, | |
|
yurys
2012/10/16 06:18:20
We listen to the termination of the render process
pfeldman
2012/10/16 08:35:28
We maintain WebSocket connection (And DevToolsClie
| |
| 101 Source<RenderProcessHost>(process_host)); | |
| 93 } | 102 } |
| 103 | |
| 94 ~DevToolsClientHostImpl() {} | 104 ~DevToolsClientHostImpl() {} |
| 95 | 105 |
| 96 // DevToolsClientHost interface | 106 // DevToolsClientHost interface |
| 97 virtual void InspectedContentsClosing() { | 107 virtual void InspectedContentsClosing() { |
| 108 if (is_closed_) | |
| 109 return; | |
| 110 is_closed_ = true; | |
| 98 message_loop_->PostTask( | 111 message_loop_->PostTask( |
| 99 FROM_HERE, | 112 FROM_HERE, |
| 100 base::Bind(&net::HttpServer::Close, server_, connection_id_)); | 113 base::Bind(&net::HttpServer::Close, server_, connection_id_)); |
| 101 } | 114 } |
| 102 | 115 |
| 103 virtual void DispatchOnInspectorFrontend(const std::string& data) { | 116 virtual void DispatchOnInspectorFrontend(const std::string& data) { |
| 104 message_loop_->PostTask( | 117 message_loop_->PostTask( |
| 105 FROM_HERE, | 118 FROM_HERE, |
| 106 base::Bind(&net::HttpServer::SendOverWebSocket, | 119 base::Bind(&net::HttpServer::SendOverWebSocket, |
| 107 server_, | 120 server_, |
| 108 connection_id_, | 121 connection_id_, |
| 109 data)); | 122 data)); |
| 110 } | 123 } |
| 111 | 124 |
| 112 virtual void ContentsReplaced(WebContents* new_contents) { | 125 virtual void ContentsReplaced(WebContents* new_contents) { |
| 113 } | 126 } |
| 114 | 127 |
| 115 private: | 128 private: |
| 129 virtual void Observe(int type, | |
| 130 const NotificationSource& source, | |
| 131 const NotificationDetails& details) { | |
| 132 InspectedContentsClosing(); | |
| 133 } | |
| 134 | |
| 116 virtual void FrameNavigating(const std::string& url) {} | 135 virtual void FrameNavigating(const std::string& url) {} |
| 117 MessageLoop* message_loop_; | 136 MessageLoop* message_loop_; |
| 118 net::HttpServer* server_; | 137 net::HttpServer* server_; |
| 119 int connection_id_; | 138 int connection_id_; |
| 139 bool is_closed_; | |
| 140 NotificationRegistrar registrar_; | |
| 120 }; | 141 }; |
| 121 | 142 |
| 122 } // namespace | 143 } // namespace |
| 123 | 144 |
| 124 // static | 145 // static |
| 125 int DevToolsHttpHandler::GetFrontendResourceId(const std::string& name) { | 146 int DevToolsHttpHandler::GetFrontendResourceId(const std::string& name) { |
| 126 for (size_t i = 0; i < kDevtoolsResourcesSize; ++i) { | 147 for (size_t i = 0; i < kDevtoolsResourcesSize; ++i) { |
| 127 if (name == kDevtoolsResources[i].name) | 148 if (name == kDevtoolsResources[i].name) |
| 128 return kDevtoolsResources[i].value; | 149 return kDevtoolsResources[i].value; |
| 129 } | 150 } |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 479 rvh); | 500 rvh); |
| 480 if (manager->GetDevToolsClientHostFor(agent)) { | 501 if (manager->GetDevToolsClientHostFor(agent)) { |
| 481 Send500(connection_id, "Target with given id is being inspected: " + | 502 Send500(connection_id, "Target with given id is being inspected: " + |
| 482 page_id); | 503 page_id); |
| 483 return; | 504 return; |
| 484 } | 505 } |
| 485 | 506 |
| 486 DevToolsClientHostImpl* client_host = | 507 DevToolsClientHostImpl* client_host = |
| 487 new DevToolsClientHostImpl(thread_->message_loop(), | 508 new DevToolsClientHostImpl(thread_->message_loop(), |
| 488 server_, | 509 server_, |
| 489 connection_id); | 510 connection_id, |
| 511 rvh->GetProcess()); | |
|
yurys
2012/10/16 06:18:20
This will not work for clients attached to instanc
pfeldman
2012/10/16 08:35:28
Allowing workers will require a major rewrite of d
| |
| 490 connection_to_client_host_ui_[connection_id] = client_host; | 512 connection_to_client_host_ui_[connection_id] = client_host; |
| 491 | 513 |
| 492 manager->RegisterDevToolsClientHostFor(agent, client_host); | 514 manager->RegisterDevToolsClientHostFor(agent, client_host); |
| 493 | 515 |
| 494 AcceptWebSocket(connection_id, request); | 516 AcceptWebSocket(connection_id, request); |
| 495 } | 517 } |
| 496 | 518 |
| 497 void DevToolsHttpHandlerImpl::OnWebSocketMessageUI( | 519 void DevToolsHttpHandlerImpl::OnWebSocketMessageUI( |
| 498 int connection_id, | 520 int connection_id, |
| 499 const std::string& data) { | 521 const std::string& data) { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 645 page_info.id.c_str())); | 667 page_info.id.c_str())); |
| 646 std::string devtools_frontend_url = GetFrontendURLInternal( | 668 std::string devtools_frontend_url = GetFrontendURLInternal( |
| 647 page_info.id.c_str(), | 669 page_info.id.c_str(), |
| 648 host); | 670 host); |
| 649 dictionary->SetString("devtoolsFrontendUrl", devtools_frontend_url); | 671 dictionary->SetString("devtoolsFrontendUrl", devtools_frontend_url); |
| 650 } | 672 } |
| 651 return dictionary; | 673 return dictionary; |
| 652 } | 674 } |
| 653 | 675 |
| 654 } // namespace content | 676 } // namespace content |
| OLD | NEW |