Index: content/browser/debugger/devtools_manager.cc |
diff --git a/content/browser/debugger/devtools_manager.cc b/content/browser/debugger/devtools_manager.cc |
index 383d6c4eba509262f3d1e2155eb33417c7c3daee..629ae7e8af79ee70e0fd9b6fc8b6e93dee689063 100644 |
--- a/content/browser/debugger/devtools_manager.cc |
+++ b/content/browser/debugger/devtools_manager.cc |
@@ -9,16 +9,14 @@ |
#include "base/message_loop.h" |
#include "content/browser/browser_thread.h" |
#include "content/browser/browsing_instance.h" |
-#include "content/browser/child_process_security_policy.h" |
#include "content/browser/content_browser_client.h" |
#include "content/browser/debugger/devtools_client_host.h" |
#include "content/browser/debugger/devtools_netlog_observer.h" |
+#include "content/browser/debugger/render_view_devtools_agent_host.h" |
#include "content/browser/renderer_host/render_view_host.h" |
-#include "content/browser/site_instance.h" |
#include "content/browser/tab_contents/tab_contents.h" |
#include "content/common/content_client.h" |
#include "content/common/devtools_messages.h" |
-#include "content/common/notification_service.h" |
#include "googleurl/src/gurl.h" |
// static |
@@ -28,13 +26,11 @@ DevToolsManager* DevToolsManager::GetInstance() { |
DevToolsManager::DevToolsManager() |
: last_orphan_cookie_(0) { |
- registrar_.Add(this, content::NOTIFICATION_RENDER_VIEW_HOST_DELETED, |
- NotificationService::AllSources()); |
} |
DevToolsManager::~DevToolsManager() { |
- DCHECK(inspected_rvh_to_client_host_.empty()); |
- DCHECK(client_host_to_inspected_rvh_.empty()); |
+ DCHECK(agent_to_client_host_.empty()); |
+ DCHECK(client_to_agent_host_.empty()); |
// By the time we destroy devtools manager, all orphan client hosts should |
// have been delelted, no need to notify them upon tab closing. |
DCHECK(orphan_client_hosts_.empty()); |
@@ -42,9 +38,17 @@ DevToolsManager::~DevToolsManager() { |
DevToolsClientHost* DevToolsManager::GetDevToolsClientHostFor( |
RenderViewHost* inspected_rvh) { |
- InspectedRvhToClientHostMap::iterator it = |
- inspected_rvh_to_client_host_.find(inspected_rvh); |
- if (it != inspected_rvh_to_client_host_.end()) |
+ DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::FindFor( |
+ inspected_rvh); |
+ if (!agent_host) |
+ return NULL; |
+ return GetDevToolsClientHostFor(agent_host); |
+} |
+ |
+DevToolsClientHost* DevToolsManager::GetDevToolsClientHostFor( |
+ DevToolsAgentHost* agent_host) { |
+ AgentToClientHostMap::iterator it = agent_to_client_host_.find(agent_host); |
+ if (it != agent_to_client_host_.end()) |
return it->second; |
return NULL; |
} |
@@ -62,13 +66,13 @@ void DevToolsManager::RegisterDevToolsClientHostFor( |
bool DevToolsManager::ForwardToDevToolsAgent(DevToolsClientHost* from, |
const IPC::Message& message) { |
- RenderViewHost* inspected_rvh = GetInspectedRenderViewHost(from); |
- if (!inspected_rvh) |
+ DevToolsAgentHost* agent_host = GetAgentHost(from); |
+ if (!agent_host) |
return false; |
IPC::Message* m = new IPC::Message(message); |
- m->set_routing_id(inspected_rvh->routing_id()); |
- inspected_rvh->Send(m); |
+ m->set_routing_id(agent_host->routing_id()); |
+ agent_host->SendMessageToAgent(m); |
return true; |
} |
@@ -86,11 +90,13 @@ void DevToolsManager::ForwardToDevToolsClient(RenderViewHost* inspected_rvh, |
void DevToolsManager::RuntimePropertyChanged(RenderViewHost* inspected_rvh, |
const std::string& name, |
const std::string& value) { |
+ DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::FindFor( |
+ inspected_rvh); |
RuntimePropertiesMap::iterator it = |
- runtime_properties_map_.find(inspected_rvh); |
+ runtime_properties_map_.find(agent_host); |
if (it == runtime_properties_map_.end()) { |
- std::pair<RenderViewHost*, DevToolsRuntimeProperties> value( |
- inspected_rvh, |
+ std::pair<DevToolsAgentHost*, DevToolsRuntimeProperties> value( |
+ agent_host, |
DevToolsRuntimeProperties()); |
it = runtime_properties_map_.insert(value).first; |
} |
@@ -106,13 +112,13 @@ void DevToolsManager::SendInspectElement(RenderViewHost* inspected_rvh, |
y)); |
} |
-void DevToolsManager::ClientHostClosing(DevToolsClientHost* host) { |
- RenderViewHost* inspected_rvh = GetInspectedRenderViewHost(host); |
- if (!inspected_rvh) { |
+void DevToolsManager::ClientHostClosing(DevToolsClientHost* client_host) { |
+ DevToolsAgentHost* agent_host = GetAgentHost(client_host); |
+ if (!agent_host) { |
// It might be in the list of orphan client hosts, remove it from there. |
for (OrphanClientHosts::iterator it = orphan_client_hosts_.begin(); |
it != orphan_client_hosts_.end(); ++it) { |
- if (it->second.first == host) { |
+ if (it->second.first == client_host) { |
orphan_client_hosts_.erase(it->first); |
return; |
} |
@@ -120,38 +126,35 @@ void DevToolsManager::ClientHostClosing(DevToolsClientHost* host) { |
return; |
} |
- NotificationService::current()->Notify( |
- content::NOTIFICATION_DEVTOOLS_WINDOW_CLOSING, |
- Source<content::BrowserContext>( |
- inspected_rvh->site_instance()->GetProcess()->browser_context()), |
- Details<RenderViewHost>(inspected_rvh)); |
+ agent_host->NotifyClientClosing(); |
- UnbindClientHost(inspected_rvh, host); |
+ UnbindClientHost(agent_host, client_host); |
} |
-void DevToolsManager::Observe(int type, |
- const NotificationSource& source, |
- const NotificationDetails& details) { |
- DCHECK(type == content::NOTIFICATION_RENDER_VIEW_HOST_DELETED); |
- UnregisterDevToolsClientHostFor(Source<RenderViewHost>(source).ptr()); |
-} |
- |
-RenderViewHost* DevToolsManager::GetInspectedRenderViewHost( |
+DevToolsAgentHost* DevToolsManager::GetAgentHost( |
DevToolsClientHost* client_host) { |
ClientHostToInspectedRvhMap::iterator it = |
- client_host_to_inspected_rvh_.find(client_host); |
- if (it != client_host_to_inspected_rvh_.end()) |
+ client_to_agent_host_.find(client_host); |
+ if (it != client_to_agent_host_.end()) |
return it->second; |
return NULL; |
} |
void DevToolsManager::UnregisterDevToolsClientHostFor( |
RenderViewHost* inspected_rvh) { |
- DevToolsClientHost* host = GetDevToolsClientHostFor(inspected_rvh); |
- if (!host) |
+ DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::FindFor( |
+ inspected_rvh); |
+ if (agent_host) |
+ UnregisterDevToolsClientHostFor(agent_host); |
+} |
+ |
+void DevToolsManager::UnregisterDevToolsClientHostFor( |
+ DevToolsAgentHost* agent_host) { |
+ DevToolsClientHost* client_host = GetDevToolsClientHostFor(agent_host); |
+ if (!client_host) |
return; |
- UnbindClientHost(inspected_rvh, host); |
- host->InspectedTabClosing(); |
+ UnbindClientHost(agent_host, client_host); |
+ client_host->InspectedTabClosing(); |
} |
void DevToolsManager::OnNavigatingToPendingEntry(RenderViewHost* rvh, |
@@ -182,16 +185,20 @@ void DevToolsManager::TabReplaced(TabContents* old_tab, |
} |
int DevToolsManager::DetachClientHost(RenderViewHost* from_rvh) { |
- DevToolsClientHost* client_host = GetDevToolsClientHostFor(from_rvh); |
+ DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::FindFor( |
+ from_rvh); |
+ if (!agent_host) |
+ return -1; |
+ DevToolsClientHost* client_host = GetDevToolsClientHostFor(agent_host); |
if (!client_host) |
return -1; |
int cookie = last_orphan_cookie_++; |
orphan_client_hosts_[cookie] = |
std::pair<DevToolsClientHost*, DevToolsRuntimeProperties>( |
- client_host, runtime_properties_map_[from_rvh]); |
+ client_host, runtime_properties_map_[agent_host]); |
- UnbindClientHost(from_rvh, client_host); |
+ UnbindClientHost(agent_host, client_host); |
return cookie; |
} |
@@ -211,26 +218,25 @@ void DevToolsManager::AttachClientHost(int client_host_cookie, |
void DevToolsManager::SendAttachToAgent(RenderViewHost* inspected_rvh) { |
if (inspected_rvh) { |
- ChildProcessSecurityPolicy::GetInstance()->GrantReadRawCookies( |
- inspected_rvh->process()->id()); |
- |
+ DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::FindFor( |
+ inspected_rvh); |
DevToolsRuntimeProperties properties; |
RuntimePropertiesMap::iterator it = |
- runtime_properties_map_.find(inspected_rvh); |
+ runtime_properties_map_.find(agent_host); |
if (it != runtime_properties_map_.end()) { |
properties = DevToolsRuntimeProperties(it->second.begin(), |
- it->second.end()); |
+ it->second.end()); |
} |
- inspected_rvh->Send(new DevToolsAgentMsg_Attach( |
- inspected_rvh->routing_id(), |
+ agent_host->SendMessageToAgent(new DevToolsAgentMsg_Attach( |
+ agent_host->routing_id(), |
properties)); |
} |
} |
-void DevToolsManager::SendDetachToAgent(RenderViewHost* inspected_rvh) { |
- if (inspected_rvh) { |
- inspected_rvh->Send(new DevToolsAgentMsg_Detach( |
- inspected_rvh->routing_id())); |
+void DevToolsManager::SendDetachToAgent(DevToolsAgentHost* agent_host) { |
+ if (agent_host) { |
+ agent_host->SendMessageToAgent(new DevToolsAgentMsg_Detach( |
+ agent_host->routing_id())); |
} |
} |
@@ -238,62 +244,55 @@ void DevToolsManager::BindClientHost( |
RenderViewHost* inspected_rvh, |
DevToolsClientHost* client_host, |
const DevToolsRuntimeProperties& runtime_properties) { |
- DCHECK(inspected_rvh_to_client_host_.find(inspected_rvh) == |
- inspected_rvh_to_client_host_.end()); |
- DCHECK(client_host_to_inspected_rvh_.find(client_host) == |
- client_host_to_inspected_rvh_.end()); |
+ DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::CreateFor( |
+ inspected_rvh); |
+ DCHECK(agent_to_client_host_.find(agent_host) == |
+ agent_to_client_host_.end()); |
+ DCHECK(client_to_agent_host_.find(client_host) == |
+ client_to_agent_host_.end()); |
- if (client_host_to_inspected_rvh_.empty()) { |
+ if (client_to_agent_host_.empty()) { |
BrowserThread::PostTask( |
BrowserThread::IO, |
FROM_HERE, |
NewRunnableFunction(&DevToolsNetLogObserver::Attach)); |
} |
- inspected_rvh_to_client_host_[inspected_rvh] = client_host; |
- client_host_to_inspected_rvh_[client_host] = inspected_rvh; |
- runtime_properties_map_[inspected_rvh] = runtime_properties; |
+ agent_to_client_host_[agent_host] = client_host; |
+ client_to_agent_host_[client_host] = agent_host; |
+ runtime_properties_map_[agent_host] = runtime_properties; |
} |
-void DevToolsManager::UnbindClientHost(RenderViewHost* inspected_rvh, |
+void DevToolsManager::UnbindClientHost(DevToolsAgentHost* agent_host, |
DevToolsClientHost* client_host) { |
- DCHECK(inspected_rvh_to_client_host_.find(inspected_rvh)->second == |
+ DCHECK(agent_host); |
+ DCHECK(agent_to_client_host_.find(agent_host)->second == |
client_host); |
- DCHECK(client_host_to_inspected_rvh_.find(client_host)->second == |
- inspected_rvh); |
+ DCHECK(client_to_agent_host_.find(client_host)->second == |
+ agent_host); |
- inspected_rvh_to_client_host_.erase(inspected_rvh); |
- client_host_to_inspected_rvh_.erase(client_host); |
- runtime_properties_map_.erase(inspected_rvh); |
+ agent_to_client_host_.erase(agent_host); |
+ client_to_agent_host_.erase(client_host); |
+ runtime_properties_map_.erase(agent_host); |
- if (client_host_to_inspected_rvh_.empty()) { |
+ if (client_to_agent_host_.empty()) { |
BrowserThread::PostTask( |
BrowserThread::IO, |
FROM_HERE, |
NewRunnableFunction(&DevToolsNetLogObserver::Detach)); |
} |
- SendDetachToAgent(inspected_rvh); |
- |
- int process_id = inspected_rvh->process()->id(); |
- for (InspectedRvhToClientHostMap::iterator it = |
- inspected_rvh_to_client_host_.begin(); |
- it != inspected_rvh_to_client_host_.end(); |
- ++it) { |
- if (it->first->process()->id() == process_id) |
- return; |
- } |
- // We've disconnected from the last renderer -> revoke cookie permissions. |
- ChildProcessSecurityPolicy::GetInstance()->RevokeReadRawCookies(process_id); |
+ SendDetachToAgent(agent_host); |
+ agent_host->ClientDetached(); |
} |
void DevToolsManager::CloseAllClientHosts() { |
- std::vector<RenderViewHost*> rhvs; |
- for (InspectedRvhToClientHostMap::iterator it = |
- inspected_rvh_to_client_host_.begin(); |
- it != inspected_rvh_to_client_host_.end(); ++it) { |
- rhvs.push_back(it->first); |
+ std::vector<DevToolsAgentHost*> agents; |
+ for (AgentToClientHostMap::iterator it = |
+ agent_to_client_host_.begin(); |
+ it != agent_to_client_host_.end(); ++it) { |
+ agents.push_back(it->first); |
} |
- for (std::vector<RenderViewHost*>::iterator it = rhvs.begin(); |
- it != rhvs.end(); ++it) { |
+ for (std::vector<DevToolsAgentHost*>::iterator it = agents.begin(); |
+ it != agents.end(); ++it) { |
UnregisterDevToolsClientHostFor(*it); |
} |
} |