diff options
Diffstat (limited to 'chromium/content/browser/devtools/render_view_devtools_agent_host.cc')
-rw-r--r-- | chromium/content/browser/devtools/render_view_devtools_agent_host.cc | 138 |
1 files changed, 104 insertions, 34 deletions
diff --git a/chromium/content/browser/devtools/render_view_devtools_agent_host.cc b/chromium/content/browser/devtools/render_view_devtools_agent_host.cc index 39ced5eb581..82df7ed2f0d 100644 --- a/chromium/content/browser/devtools/render_view_devtools_agent_host.cc +++ b/chromium/content/browser/devtools/render_view_devtools_agent_host.cc @@ -8,6 +8,7 @@ #include "base/lazy_instance.h" #include "content/browser/child_process_security_policy_impl.h" #include "content/browser/devtools/devtools_manager_impl.h" +#include "content/browser/devtools/devtools_power_handler.h" #include "content/browser/devtools/devtools_protocol.h" #include "content/browser/devtools/devtools_protocol_constants.h" #include "content/browser/devtools/devtools_tracing_handler.h" @@ -19,6 +20,7 @@ #include "content/common/devtools_messages.h" #include "content/common/view_messages.h" #include "content/public/browser/content_browser_client.h" +#include "content/public/browser/devtools_manager_delegate.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_types.h" #include "content/public/browser/render_widget_host_iterator.h" @@ -35,6 +37,22 @@ typedef std::vector<RenderViewDevToolsAgentHost*> Instances; namespace { base::LazyInstance<Instances>::Leaky g_instances = LAZY_INSTANCE_INITIALIZER; +//Returns RenderViewDevToolsAgentHost attached to any of RenderViewHost +//instances associated with |web_contents| +static RenderViewDevToolsAgentHost* FindAgentHost(WebContents* web_contents) { + if (g_instances == NULL) + return NULL; + RenderViewHostDelegate* delegate = + static_cast<WebContentsImpl*>(web_contents); + for (Instances::iterator it = g_instances.Get().begin(); + it != g_instances.Get().end(); ++it) { + RenderViewHost* rvh = (*it)->render_view_host(); + if (rvh && rvh->GetDelegate() == delegate) + return *it; + } + return NULL; +} + static RenderViewDevToolsAgentHost* FindAgentHost(RenderViewHost* rvh) { if (g_instances == NULL) return NULL; @@ -48,6 +66,14 @@ static RenderViewDevToolsAgentHost* FindAgentHost(RenderViewHost* rvh) { } // namespace +scoped_refptr<DevToolsAgentHost> +DevToolsAgentHost::GetOrCreateFor(WebContents* web_contents) { + RenderViewDevToolsAgentHost* result = FindAgentHost(web_contents); + if (!result) + result = new RenderViewDevToolsAgentHost(web_contents->GetRenderViewHost()); + return result; +} + // static scoped_refptr<DevToolsAgentHost> DevToolsAgentHost::GetOrCreateFor(RenderViewHost* rvh) { @@ -96,10 +122,20 @@ std::vector<RenderViewHost*> DevToolsAgentHost::GetValidRenderViewHosts() { RenderViewHost* rvh = RenderViewHost::From(widget); WebContents* web_contents = WebContents::FromRenderViewHost(rvh); + if (!web_contents) + continue; + // Don't report a RenderViewHost if it is not the current RenderViewHost - // for some WebContents. - if (!web_contents || rvh != web_contents->GetRenderViewHost()) + // for some WebContents (this filters out pre-render RVHs and similar). + // However report a RenderViewHost created for an out of process iframe. + // TODO (kaznacheev): Revisit this when it is clear how OOP iframes + // interact with pre-rendering. + // TODO (kaznacheev): GetMainFrame() call is a temporary hack. Iterate over + // all RenderFrameHost instances when multiple OOP frames are supported. + if (rvh != web_contents->GetRenderViewHost() && + !rvh->GetMainFrame()->IsCrossProcessSubframe()) { continue; + } result.push_back(rvh); } @@ -117,18 +153,28 @@ void RenderViewDevToolsAgentHost::OnCancelPendingNavigation( agent_host->ConnectRenderViewHost(current); } -RenderViewDevToolsAgentHost::RenderViewDevToolsAgentHost( - RenderViewHost* rvh) +// static +bool RenderViewDevToolsAgentHost::DispatchIPCMessage( + RenderViewHost* source, + const IPC::Message& message) { + RenderViewDevToolsAgentHost* agent_host = FindAgentHost(source); + return agent_host && agent_host->DispatchIPCMessage(message); +} + +RenderViewDevToolsAgentHost::RenderViewDevToolsAgentHost(RenderViewHost* rvh) : render_view_host_(NULL), overrides_handler_(new RendererOverridesHandler(this)), - tracing_handler_(new DevToolsTracingHandler()) - { + tracing_handler_( + new DevToolsTracingHandler(DevToolsTracingHandler::Renderer)), + power_handler_(new DevToolsPowerHandler()), + reattaching_(false) { SetRenderViewHost(rvh); DevToolsProtocol::Notifier notifier(base::Bind( &RenderViewDevToolsAgentHost::OnDispatchOnInspectorFrontend, base::Unretained(this))); overrides_handler_->SetNotifier(notifier); tracing_handler_->SetNotifier(notifier); + power_handler_->SetNotifier(notifier); g_instances.Get().push_back(this); AddRef(); // Balanced in RenderViewHostDestroyed. } @@ -140,14 +186,30 @@ RenderViewHost* RenderViewDevToolsAgentHost::GetRenderViewHost() { void RenderViewDevToolsAgentHost::DispatchOnInspectorBackend( const std::string& message) { std::string error_message; + + scoped_ptr<base::DictionaryValue> message_dict( + DevToolsProtocol::ParseMessage(message, &error_message)); scoped_refptr<DevToolsProtocol::Command> command = - DevToolsProtocol::ParseCommand(message, &error_message); + DevToolsProtocol::ParseCommand(message_dict.get(), &error_message); if (command) { - scoped_refptr<DevToolsProtocol::Response> overridden_response = - overrides_handler_->HandleCommand(command); + scoped_refptr<DevToolsProtocol::Response> overridden_response; + + DevToolsManagerDelegate* delegate = + DevToolsManagerImpl::GetInstance()->delegate(); + if (delegate) { + scoped_ptr<base::DictionaryValue> overridden_response_value( + delegate->HandleCommand(this, message_dict.get())); + if (overridden_response_value) + overridden_response = DevToolsProtocol::ParseResponse( + overridden_response_value.get()); + } + if (!overridden_response) + overridden_response = overrides_handler_->HandleCommand(command); if (!overridden_response) overridden_response = tracing_handler_->HandleCommand(command); + if (!overridden_response) + overridden_response = power_handler_->HandleCommand(command); if (overridden_response) { if (!overridden_response->is_async_promise()) OnDispatchOnInspectorFrontend(overridden_response->Serialize()); @@ -169,12 +231,17 @@ void RenderViewDevToolsAgentHost::OnClientAttached() { if (!render_view_host_) return; - ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadRawCookies( - render_view_host_->GetProcess()->GetID()); + InnerOnClientAttached(); // TODO(kaznacheev): Move this call back to DevToolsManagerImpl when // extensions::ProcessManager no longer relies on this notification. - DevToolsManagerImpl::GetInstance()->NotifyObservers(this, true); + if (!reattaching_) + DevToolsManagerImpl::GetInstance()->NotifyObservers(this, true); +} + +void RenderViewDevToolsAgentHost::InnerOnClientAttached() { + ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadRawCookies( + render_view_host_->GetProcess()->GetID()); #if defined(OS_ANDROID) power_save_blocker_.reset( @@ -194,6 +261,7 @@ void RenderViewDevToolsAgentHost::OnClientDetached() { power_save_blocker_.reset(); #endif overrides_handler_->OnClientDetached(); + tracing_handler_->OnClientDetached(); ClientDetachedFromRenderer(); } @@ -201,6 +269,15 @@ void RenderViewDevToolsAgentHost::ClientDetachedFromRenderer() { if (!render_view_host_) return; + InnerClientDetachedFromRenderer(); + + // TODO(kaznacheev): Move this call back to DevToolsManagerImpl when + // extensions::ProcessManager no longer relies on this notification. + if (!reattaching_) + DevToolsManagerImpl::GetInstance()->NotifyObservers(this, false); +} + +void RenderViewDevToolsAgentHost::InnerClientDetachedFromRenderer() { bool process_has_agents = false; RenderProcessHost* render_process_host = render_view_host_->GetProcess(); for (Instances::iterator it = g_instances.Get().begin(); @@ -217,10 +294,6 @@ void RenderViewDevToolsAgentHost::ClientDetachedFromRenderer() { ChildProcessSecurityPolicyImpl::GetInstance()->RevokeReadRawCookies( render_process_host->GetID()); } - - // TODO(kaznacheev): Move this call back to DevToolsManagerImpl when - // extensions::ProcessManager no longer relies on this notification. - DevToolsManagerImpl::GetInstance()->NotifyObservers(this, false); } RenderViewDevToolsAgentHost::~RenderViewDevToolsAgentHost() { @@ -240,8 +313,7 @@ void RenderViewDevToolsAgentHost::AboutToNavigateRenderView( render_view_host_)->render_view_termination_status() == base::TERMINATION_STATUS_STILL_RUNNING) return; - DisconnectRenderViewHost(); - ConnectRenderViewHost(dest_rvh); + ReattachToRenderViewHost(dest_rvh); } void RenderViewDevToolsAgentHost::RenderViewHostChanged( @@ -250,11 +322,19 @@ void RenderViewDevToolsAgentHost::RenderViewHostChanged( if (new_host != render_view_host_) { // AboutToNavigateRenderView was not called for renderer-initiated // navigation. - DisconnectRenderViewHost(); - ConnectRenderViewHost(new_host); + ReattachToRenderViewHost(new_host); } } +void +RenderViewDevToolsAgentHost::ReattachToRenderViewHost(RenderViewHost* rvh) { + DCHECK(!reattaching_); + reattaching_ = true; + DisconnectRenderViewHost(); + ConnectRenderViewHost(rvh); + reattaching_ = false; +} + void RenderViewDevToolsAgentHost::RenderViewDeleted(RenderViewHost* rvh) { if (rvh != render_view_host_) return; @@ -272,6 +352,9 @@ void RenderViewDevToolsAgentHost::RenderProcessGone( case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: case base::TERMINATION_STATUS_PROCESS_CRASHED: +#if defined(OS_ANDROID) + case base::TERMINATION_STATUS_OOM_PROTECTED: +#endif RenderViewCrashed(); break; default: @@ -341,7 +424,7 @@ void RenderViewDevToolsAgentHost::RenderViewCrashed() { DispatchOnInspectorFrontend(this, notification->Serialize()); } -bool RenderViewDevToolsAgentHost::OnMessageReceived( +bool RenderViewDevToolsAgentHost::DispatchIPCMessage( const IPC::Message& msg) { if (!render_view_host_) return false; @@ -352,9 +435,6 @@ bool RenderViewDevToolsAgentHost::OnMessageReceived( OnDispatchOnInspectorFrontend) IPC_MESSAGE_HANDLER(DevToolsHostMsg_SaveAgentRuntimeState, OnSaveAgentRuntimeState) - IPC_MESSAGE_HANDLER(DevToolsHostMsg_ClearBrowserCache, OnClearBrowserCache) - IPC_MESSAGE_HANDLER(DevToolsHostMsg_ClearBrowserCookies, - OnClearBrowserCookies) IPC_MESSAGE_HANDLER_GENERIC(ViewHostMsg_SwapCompositorFrame, handled = false; OnSwapCompositorFrame(msg)) IPC_MESSAGE_UNHANDLED(handled = false) @@ -392,14 +472,4 @@ void RenderViewDevToolsAgentHost::OnDispatchOnInspectorFrontend( this, message); } -void RenderViewDevToolsAgentHost::OnClearBrowserCache() { - if (render_view_host_) - GetContentClient()->browser()->ClearCache(render_view_host_); -} - -void RenderViewDevToolsAgentHost::OnClearBrowserCookies() { - if (render_view_host_) - GetContentClient()->browser()->ClearCookies(render_view_host_); -} - } // namespace content |