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

Side by Side Diff: content/browser/debugger/devtools_manager.cc

Issue 7648032: DevTools: introduce DevToolsAgentHost (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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_manager.h" 5 #include "content/browser/debugger/devtools_manager.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "content/browser/browser_thread.h" 10 #include "content/browser/browser_thread.h"
11 #include "content/browser/browsing_instance.h" 11 #include "content/browser/browsing_instance.h"
12 #include "content/browser/child_process_security_policy.h"
13 #include "content/browser/content_browser_client.h" 12 #include "content/browser/content_browser_client.h"
14 #include "content/browser/debugger/devtools_client_host.h" 13 #include "content/browser/debugger/devtools_client_host.h"
15 #include "content/browser/debugger/devtools_netlog_observer.h" 14 #include "content/browser/debugger/devtools_netlog_observer.h"
15 #include "content/browser/debugger/render_view_devtools_agent_host.h"
16 #include "content/browser/renderer_host/render_view_host.h" 16 #include "content/browser/renderer_host/render_view_host.h"
17 #include "content/browser/site_instance.h"
18 #include "content/browser/tab_contents/tab_contents.h" 17 #include "content/browser/tab_contents/tab_contents.h"
19 #include "content/common/content_client.h" 18 #include "content/common/content_client.h"
20 #include "content/common/devtools_messages.h" 19 #include "content/common/devtools_messages.h"
21 #include "content/common/notification_service.h"
22 #include "googleurl/src/gurl.h" 20 #include "googleurl/src/gurl.h"
23 21
24 // static 22 // static
25 DevToolsManager* DevToolsManager::GetInstance() { 23 DevToolsManager* DevToolsManager::GetInstance() {
26 return content::GetContentClient()->browser()->GetDevToolsManager(); 24 return content::GetContentClient()->browser()->GetDevToolsManager();
27 } 25 }
28 26
29 DevToolsManager::DevToolsManager() 27 DevToolsManager::DevToolsManager()
30 : last_orphan_cookie_(0) { 28 : last_orphan_cookie_(0) {
31 registrar_.Add(this, content::NOTIFICATION_RENDER_VIEW_HOST_DELETED,
32 NotificationService::AllSources());
33 } 29 }
34 30
35 DevToolsManager::~DevToolsManager() { 31 DevToolsManager::~DevToolsManager() {
36 DCHECK(inspected_rvh_to_client_host_.empty()); 32 DCHECK(agent_to_client_host_.empty());
37 DCHECK(client_host_to_inspected_rvh_.empty()); 33 DCHECK(client_to_agent_host_.empty());
38 // By the time we destroy devtools manager, all orphan client hosts should 34 // By the time we destroy devtools manager, all orphan client hosts should
39 // have been delelted, no need to notify them upon tab closing. 35 // have been delelted, no need to notify them upon tab closing.
40 DCHECK(orphan_client_hosts_.empty()); 36 DCHECK(orphan_client_hosts_.empty());
41 } 37 }
42 38
43 DevToolsClientHost* DevToolsManager::GetDevToolsClientHostFor( 39 DevToolsClientHost* DevToolsManager::GetDevToolsClientHostFor(
44 RenderViewHost* inspected_rvh) { 40 RenderViewHost* inspected_rvh) {
45 InspectedRvhToClientHostMap::iterator it = 41 DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::FindFor(
46 inspected_rvh_to_client_host_.find(inspected_rvh); 42 inspected_rvh);
47 if (it != inspected_rvh_to_client_host_.end()) 43 if (!agent_host)
44 return NULL;
45 return GetDevToolsClientHostFor(agent_host);
46 }
47
48 DevToolsClientHost* DevToolsManager::GetDevToolsClientHostFor(
49 DevToolsAgentHost* agent_host) {
50 AgentToClientHostMap::iterator it = agent_to_client_host_.find(agent_host);
51 if (it != agent_to_client_host_.end())
48 return it->second; 52 return it->second;
49 return NULL; 53 return NULL;
50 } 54 }
51 55
52 void DevToolsManager::RegisterDevToolsClientHostFor( 56 void DevToolsManager::RegisterDevToolsClientHostFor(
53 RenderViewHost* inspected_rvh, 57 RenderViewHost* inspected_rvh,
54 DevToolsClientHost* client_host) { 58 DevToolsClientHost* client_host) {
55 DCHECK(!GetDevToolsClientHostFor(inspected_rvh)); 59 DCHECK(!GetDevToolsClientHostFor(inspected_rvh));
56 60
57 DevToolsRuntimeProperties initial_properties; 61 DevToolsRuntimeProperties initial_properties;
58 BindClientHost(inspected_rvh, client_host, initial_properties); 62 BindClientHost(inspected_rvh, client_host, initial_properties);
59 client_host->set_close_listener(this); 63 client_host->set_close_listener(this);
60 SendAttachToAgent(inspected_rvh); 64 SendAttachToAgent(inspected_rvh);
61 } 65 }
62 66
63 bool DevToolsManager::ForwardToDevToolsAgent(DevToolsClientHost* from, 67 bool DevToolsManager::ForwardToDevToolsAgent(DevToolsClientHost* from,
64 const IPC::Message& message) { 68 const IPC::Message& message) {
65 RenderViewHost* inspected_rvh = GetInspectedRenderViewHost(from); 69 DevToolsAgentHost* agent_host = GetAgentHost(from);
66 if (!inspected_rvh) 70 if (!agent_host)
67 return false; 71 return false;
68 72
69 IPC::Message* m = new IPC::Message(message); 73 IPC::Message* m = new IPC::Message(message);
70 m->set_routing_id(inspected_rvh->routing_id()); 74 m->set_routing_id(agent_host->routing_id());
71 inspected_rvh->Send(m); 75 agent_host->SendMessageToAgent(m);
72 return true; 76 return true;
73 } 77 }
74 78
75 void DevToolsManager::ForwardToDevToolsClient(RenderViewHost* inspected_rvh, 79 void DevToolsManager::ForwardToDevToolsClient(RenderViewHost* inspected_rvh,
76 const IPC::Message& message) { 80 const IPC::Message& message) {
77 DevToolsClientHost* client_host = GetDevToolsClientHostFor(inspected_rvh); 81 DevToolsClientHost* client_host = GetDevToolsClientHostFor(inspected_rvh);
78 if (!client_host) { 82 if (!client_host) {
79 // Client window was closed while there were messages 83 // Client window was closed while there were messages
80 // being sent to it. 84 // being sent to it.
81 return; 85 return;
82 } 86 }
83 client_host->SendMessageToClient(message); 87 client_host->SendMessageToClient(message);
84 } 88 }
85 89
86 void DevToolsManager::RuntimePropertyChanged(RenderViewHost* inspected_rvh, 90 void DevToolsManager::RuntimePropertyChanged(RenderViewHost* inspected_rvh,
87 const std::string& name, 91 const std::string& name,
88 const std::string& value) { 92 const std::string& value) {
93 DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::FindFor(
94 inspected_rvh);
89 RuntimePropertiesMap::iterator it = 95 RuntimePropertiesMap::iterator it =
90 runtime_properties_map_.find(inspected_rvh); 96 runtime_properties_map_.find(agent_host);
91 if (it == runtime_properties_map_.end()) { 97 if (it == runtime_properties_map_.end()) {
92 std::pair<RenderViewHost*, DevToolsRuntimeProperties> value( 98 std::pair<DevToolsAgentHost*, DevToolsRuntimeProperties> value(
93 inspected_rvh, 99 agent_host,
94 DevToolsRuntimeProperties()); 100 DevToolsRuntimeProperties());
95 it = runtime_properties_map_.insert(value).first; 101 it = runtime_properties_map_.insert(value).first;
96 } 102 }
97 it->second[name] = value; 103 it->second[name] = value;
98 } 104 }
99 105
100 void DevToolsManager::SendInspectElement(RenderViewHost* inspected_rvh, 106 void DevToolsManager::SendInspectElement(RenderViewHost* inspected_rvh,
101 int x, 107 int x,
102 int y) { 108 int y) {
103 inspected_rvh->Send(new DevToolsAgentMsg_InspectElement( 109 inspected_rvh->Send(new DevToolsAgentMsg_InspectElement(
104 inspected_rvh->routing_id(), 110 inspected_rvh->routing_id(),
105 x, 111 x,
106 y)); 112 y));
107 } 113 }
108 114
109 void DevToolsManager::ClientHostClosing(DevToolsClientHost* host) { 115 void DevToolsManager::ClientHostClosing(DevToolsClientHost* client_host) {
110 RenderViewHost* inspected_rvh = GetInspectedRenderViewHost(host); 116 DevToolsAgentHost* agent_host = GetAgentHost(client_host);
111 if (!inspected_rvh) { 117 if (!agent_host) {
112 // It might be in the list of orphan client hosts, remove it from there. 118 // It might be in the list of orphan client hosts, remove it from there.
113 for (OrphanClientHosts::iterator it = orphan_client_hosts_.begin(); 119 for (OrphanClientHosts::iterator it = orphan_client_hosts_.begin();
114 it != orphan_client_hosts_.end(); ++it) { 120 it != orphan_client_hosts_.end(); ++it) {
115 if (it->second.first == host) { 121 if (it->second.first == client_host) {
116 orphan_client_hosts_.erase(it->first); 122 orphan_client_hosts_.erase(it->first);
117 return; 123 return;
118 } 124 }
119 } 125 }
120 return; 126 return;
121 } 127 }
122 128
123 NotificationService::current()->Notify( 129 agent_host->NotifyClientClosing();
124 content::NOTIFICATION_DEVTOOLS_WINDOW_CLOSING,
125 Source<content::BrowserContext>(
126 inspected_rvh->site_instance()->GetProcess()->browser_context()),
127 Details<RenderViewHost>(inspected_rvh));
128 130
129 UnbindClientHost(inspected_rvh, host); 131 UnbindClientHost(agent_host, client_host);
130 } 132 }
131 133
132 void DevToolsManager::Observe(int type, 134 DevToolsAgentHost* DevToolsManager::GetAgentHost(
133 const NotificationSource& source,
134 const NotificationDetails& details) {
135 DCHECK(type == content::NOTIFICATION_RENDER_VIEW_HOST_DELETED);
136 UnregisterDevToolsClientHostFor(Source<RenderViewHost>(source).ptr());
137 }
138
139 RenderViewHost* DevToolsManager::GetInspectedRenderViewHost(
140 DevToolsClientHost* client_host) { 135 DevToolsClientHost* client_host) {
141 ClientHostToInspectedRvhMap::iterator it = 136 ClientHostToInspectedRvhMap::iterator it =
142 client_host_to_inspected_rvh_.find(client_host); 137 client_to_agent_host_.find(client_host);
143 if (it != client_host_to_inspected_rvh_.end()) 138 if (it != client_to_agent_host_.end())
144 return it->second; 139 return it->second;
145 return NULL; 140 return NULL;
146 } 141 }
147 142
148 void DevToolsManager::UnregisterDevToolsClientHostFor( 143 void DevToolsManager::UnregisterDevToolsClientHostFor(
149 RenderViewHost* inspected_rvh) { 144 RenderViewHost* inspected_rvh) {
150 DevToolsClientHost* host = GetDevToolsClientHostFor(inspected_rvh); 145 DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::FindFor(
151 if (!host) 146 inspected_rvh);
147 if (agent_host)
148 UnregisterDevToolsClientHostFor(agent_host);
149 }
150
151 void DevToolsManager::UnregisterDevToolsClientHostFor(
152 DevToolsAgentHost* agent_host) {
153 DevToolsClientHost* client_host = GetDevToolsClientHostFor(agent_host);
154 if (!client_host)
152 return; 155 return;
153 UnbindClientHost(inspected_rvh, host); 156 UnbindClientHost(agent_host, client_host);
154 host->InspectedTabClosing(); 157 client_host->InspectedTabClosing();
155 } 158 }
156 159
157 void DevToolsManager::OnNavigatingToPendingEntry(RenderViewHost* rvh, 160 void DevToolsManager::OnNavigatingToPendingEntry(RenderViewHost* rvh,
158 RenderViewHost* dest_rvh, 161 RenderViewHost* dest_rvh,
159 const GURL& gurl) { 162 const GURL& gurl) {
160 int cookie = DetachClientHost(rvh); 163 int cookie = DetachClientHost(rvh);
161 if (cookie != -1) { 164 if (cookie != -1) {
162 // Navigating to URL in the inspected window. 165 // Navigating to URL in the inspected window.
163 AttachClientHost(cookie, dest_rvh); 166 AttachClientHost(cookie, dest_rvh);
164 167
(...skipping 10 matching lines...) Expand all
175 return; // Didn't know about old_tab. 178 return; // Didn't know about old_tab.
176 int cookie = DetachClientHost(old_rvh); 179 int cookie = DetachClientHost(old_rvh);
177 if (cookie == -1) 180 if (cookie == -1)
178 return; // Didn't know about old_tab. 181 return; // Didn't know about old_tab.
179 182
180 client_host->TabReplaced(new_tab); 183 client_host->TabReplaced(new_tab);
181 AttachClientHost(cookie, new_tab->render_view_host()); 184 AttachClientHost(cookie, new_tab->render_view_host());
182 } 185 }
183 186
184 int DevToolsManager::DetachClientHost(RenderViewHost* from_rvh) { 187 int DevToolsManager::DetachClientHost(RenderViewHost* from_rvh) {
185 DevToolsClientHost* client_host = GetDevToolsClientHostFor(from_rvh); 188 DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::FindFor(
189 from_rvh);
190 if (!agent_host)
191 return -1;
192 DevToolsClientHost* client_host = GetDevToolsClientHostFor(agent_host);
186 if (!client_host) 193 if (!client_host)
187 return -1; 194 return -1;
188 195
189 int cookie = last_orphan_cookie_++; 196 int cookie = last_orphan_cookie_++;
190 orphan_client_hosts_[cookie] = 197 orphan_client_hosts_[cookie] =
191 std::pair<DevToolsClientHost*, DevToolsRuntimeProperties>( 198 std::pair<DevToolsClientHost*, DevToolsRuntimeProperties>(
192 client_host, runtime_properties_map_[from_rvh]); 199 client_host, runtime_properties_map_[agent_host]);
193 200
194 UnbindClientHost(from_rvh, client_host); 201 UnbindClientHost(agent_host, client_host);
195 return cookie; 202 return cookie;
196 } 203 }
197 204
198 void DevToolsManager::AttachClientHost(int client_host_cookie, 205 void DevToolsManager::AttachClientHost(int client_host_cookie,
199 RenderViewHost* to_rvh) { 206 RenderViewHost* to_rvh) {
200 OrphanClientHosts::iterator it = orphan_client_hosts_.find( 207 OrphanClientHosts::iterator it = orphan_client_hosts_.find(
201 client_host_cookie); 208 client_host_cookie);
202 if (it == orphan_client_hosts_.end()) 209 if (it == orphan_client_hosts_.end())
203 return; 210 return;
204 211
205 DevToolsClientHost* client_host = (*it).second.first; 212 DevToolsClientHost* client_host = (*it).second.first;
206 BindClientHost(to_rvh, client_host, (*it).second.second); 213 BindClientHost(to_rvh, client_host, (*it).second.second);
207 SendAttachToAgent(to_rvh); 214 SendAttachToAgent(to_rvh);
208 215
209 orphan_client_hosts_.erase(client_host_cookie); 216 orphan_client_hosts_.erase(client_host_cookie);
210 } 217 }
211 218
212 void DevToolsManager::SendAttachToAgent(RenderViewHost* inspected_rvh) { 219 void DevToolsManager::SendAttachToAgent(RenderViewHost* inspected_rvh) {
213 if (inspected_rvh) { 220 if (inspected_rvh) {
214 ChildProcessSecurityPolicy::GetInstance()->GrantReadRawCookies( 221 DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::FindFor(
215 inspected_rvh->process()->id()); 222 inspected_rvh);
216
217 DevToolsRuntimeProperties properties; 223 DevToolsRuntimeProperties properties;
218 RuntimePropertiesMap::iterator it = 224 RuntimePropertiesMap::iterator it =
219 runtime_properties_map_.find(inspected_rvh); 225 runtime_properties_map_.find(agent_host);
220 if (it != runtime_properties_map_.end()) { 226 if (it != runtime_properties_map_.end()) {
221 properties = DevToolsRuntimeProperties(it->second.begin(), 227 properties = DevToolsRuntimeProperties(it->second.begin(),
222 it->second.end()); 228 it->second.end());
223 } 229 }
224 inspected_rvh->Send(new DevToolsAgentMsg_Attach( 230 agent_host->SendMessageToAgent(new DevToolsAgentMsg_Attach(
225 inspected_rvh->routing_id(), 231 agent_host->routing_id(),
226 properties)); 232 properties));
227 } 233 }
228 } 234 }
229 235
230 void DevToolsManager::SendDetachToAgent(RenderViewHost* inspected_rvh) { 236 void DevToolsManager::SendDetachToAgent(DevToolsAgentHost* agent_host) {
231 if (inspected_rvh) { 237 if (agent_host) {
232 inspected_rvh->Send(new DevToolsAgentMsg_Detach( 238 agent_host->SendMessageToAgent(new DevToolsAgentMsg_Detach(
233 inspected_rvh->routing_id())); 239 agent_host->routing_id()));
234 } 240 }
235 } 241 }
236 242
237 void DevToolsManager::BindClientHost( 243 void DevToolsManager::BindClientHost(
238 RenderViewHost* inspected_rvh, 244 RenderViewHost* inspected_rvh,
239 DevToolsClientHost* client_host, 245 DevToolsClientHost* client_host,
240 const DevToolsRuntimeProperties& runtime_properties) { 246 const DevToolsRuntimeProperties& runtime_properties) {
241 DCHECK(inspected_rvh_to_client_host_.find(inspected_rvh) == 247 DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::CreateFor(
242 inspected_rvh_to_client_host_.end()); 248 inspected_rvh);
243 DCHECK(client_host_to_inspected_rvh_.find(client_host) == 249 DCHECK(agent_to_client_host_.find(agent_host) ==
244 client_host_to_inspected_rvh_.end()); 250 agent_to_client_host_.end());
251 DCHECK(client_to_agent_host_.find(client_host) ==
252 client_to_agent_host_.end());
245 253
246 if (client_host_to_inspected_rvh_.empty()) { 254 if (client_to_agent_host_.empty()) {
247 BrowserThread::PostTask( 255 BrowserThread::PostTask(
248 BrowserThread::IO, 256 BrowserThread::IO,
249 FROM_HERE, 257 FROM_HERE,
250 NewRunnableFunction(&DevToolsNetLogObserver::Attach)); 258 NewRunnableFunction(&DevToolsNetLogObserver::Attach));
251 } 259 }
252 inspected_rvh_to_client_host_[inspected_rvh] = client_host; 260 agent_to_client_host_[agent_host] = client_host;
253 client_host_to_inspected_rvh_[client_host] = inspected_rvh; 261 client_to_agent_host_[client_host] = agent_host;
254 runtime_properties_map_[inspected_rvh] = runtime_properties; 262 runtime_properties_map_[agent_host] = runtime_properties;
255 } 263 }
256 264
257 void DevToolsManager::UnbindClientHost(RenderViewHost* inspected_rvh, 265 void DevToolsManager::UnbindClientHost(DevToolsAgentHost* agent_host,
258 DevToolsClientHost* client_host) { 266 DevToolsClientHost* client_host) {
259 DCHECK(inspected_rvh_to_client_host_.find(inspected_rvh)->second == 267 DCHECK(agent_host);
268 DCHECK(agent_to_client_host_.find(agent_host)->second ==
260 client_host); 269 client_host);
261 DCHECK(client_host_to_inspected_rvh_.find(client_host)->second == 270 DCHECK(client_to_agent_host_.find(client_host)->second ==
262 inspected_rvh); 271 agent_host);
263 272
264 inspected_rvh_to_client_host_.erase(inspected_rvh); 273 agent_to_client_host_.erase(agent_host);
265 client_host_to_inspected_rvh_.erase(client_host); 274 client_to_agent_host_.erase(client_host);
266 runtime_properties_map_.erase(inspected_rvh); 275 runtime_properties_map_.erase(agent_host);
267 276
268 if (client_host_to_inspected_rvh_.empty()) { 277 if (client_to_agent_host_.empty()) {
269 BrowserThread::PostTask( 278 BrowserThread::PostTask(
270 BrowserThread::IO, 279 BrowserThread::IO,
271 FROM_HERE, 280 FROM_HERE,
272 NewRunnableFunction(&DevToolsNetLogObserver::Detach)); 281 NewRunnableFunction(&DevToolsNetLogObserver::Detach));
273 } 282 }
274 SendDetachToAgent(inspected_rvh); 283 SendDetachToAgent(agent_host);
275 284 agent_host->ClientDetached();
276 int process_id = inspected_rvh->process()->id();
277 for (InspectedRvhToClientHostMap::iterator it =
278 inspected_rvh_to_client_host_.begin();
279 it != inspected_rvh_to_client_host_.end();
280 ++it) {
281 if (it->first->process()->id() == process_id)
282 return;
283 }
284 // We've disconnected from the last renderer -> revoke cookie permissions.
285 ChildProcessSecurityPolicy::GetInstance()->RevokeReadRawCookies(process_id);
286 } 285 }
287 286
288 void DevToolsManager::CloseAllClientHosts() { 287 void DevToolsManager::CloseAllClientHosts() {
289 std::vector<RenderViewHost*> rhvs; 288 std::vector<DevToolsAgentHost*> agents;
290 for (InspectedRvhToClientHostMap::iterator it = 289 for (AgentToClientHostMap::iterator it =
291 inspected_rvh_to_client_host_.begin(); 290 agent_to_client_host_.begin();
292 it != inspected_rvh_to_client_host_.end(); ++it) { 291 it != agent_to_client_host_.end(); ++it) {
293 rhvs.push_back(it->first); 292 agents.push_back(it->first);
294 } 293 }
295 for (std::vector<RenderViewHost*>::iterator it = rhvs.begin(); 294 for (std::vector<DevToolsAgentHost*>::iterator it = agents.begin();
296 it != rhvs.end(); ++it) { 295 it != agents.end(); ++it) {
297 UnregisterDevToolsClientHostFor(*it); 296 UnregisterDevToolsClientHostFor(*it);
298 } 297 }
299 } 298 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698