summaryrefslogtreecommitdiff
path: root/chromium/content/browser/devtools/render_view_devtools_agent_host.cc
diff options
context:
space:
mode:
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.cc65
1 files changed, 52 insertions, 13 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 7455c160d8e..5570ee839ed 100644
--- a/chromium/content/browser/devtools/render_view_devtools_agent_host.cc
+++ b/chromium/content/browser/devtools/render_view_devtools_agent_host.cc
@@ -17,9 +17,11 @@
#include "content/browser/site_instance_impl.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/common/devtools_messages.h"
+#include "content/common/view_messages.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h"
+#include "content/public/browser/render_widget_host_iterator.h"
namespace content {
@@ -100,15 +102,16 @@ bool DevToolsAgentHost::IsDebuggerAttached(WebContents* web_contents) {
//static
std::vector<RenderViewHost*> DevToolsAgentHost::GetValidRenderViewHosts() {
std::vector<RenderViewHost*> result;
- RenderWidgetHost::List widgets = RenderWidgetHost::GetRenderWidgetHosts();
- for (size_t i = 0; i < widgets.size(); ++i) {
+ scoped_ptr<RenderWidgetHostIterator> widgets(
+ RenderWidgetHost::GetRenderWidgetHosts());
+ while (RenderWidgetHost* widget = widgets->GetNextHost()) {
// Ignore processes that don't have a connection, such as crashed contents.
- if (!widgets[i]->GetProcess()->HasConnection())
+ if (!widget->GetProcess()->HasConnection())
continue;
- if (!widgets[i]->IsRenderView())
+ if (!widget->IsRenderView())
continue;
- RenderViewHost* rvh = RenderViewHost::From(widgets[i]);
+ RenderViewHost* rvh = RenderViewHost::From(widget);
WebContents* web_contents = WebContents::FromRenderViewHost(rvh);
// Don't report a RenderViewHost if it is not the current RenderViewHost
// for some WebContents.
@@ -133,7 +136,8 @@ void RenderViewDevToolsAgentHost::OnCancelPendingNavigation(
RenderViewDevToolsAgentHost::RenderViewDevToolsAgentHost(
RenderViewHost* rvh)
- : overrides_handler_(new RendererOverridesHandler(this)),
+ : render_view_host_(NULL),
+ overrides_handler_(new RendererOverridesHandler(this)),
tracing_handler_(new DevToolsTracingHandler())
{
SetRenderViewHost(rvh);
@@ -145,7 +149,7 @@ RenderViewDevToolsAgentHost::RenderViewDevToolsAgentHost(
g_instances.Get().push_back(this);
RenderViewHostDelegate* delegate = render_view_host_->GetDelegate();
if (delegate && delegate->GetAsWebContents())
- Observe(delegate->GetAsWebContents());
+ WebContentsObserver::Observe(delegate->GetAsWebContents());
AddRef(); // Balanced in RenderViewHostDestroyed.
}
@@ -194,6 +198,11 @@ void RenderViewDevToolsAgentHost::OnClientAttached() {
}
void RenderViewDevToolsAgentHost::OnClientDetached() {
+ overrides_handler_->OnClientDetached();
+ ClientDetachedFromRenderer();
+}
+
+void RenderViewDevToolsAgentHost::ClientDetachedFromRenderer() {
if (!render_view_host_)
return;
@@ -266,9 +275,33 @@ void RenderViewDevToolsAgentHost::DidAttachInterstitialPage() {
ConnectRenderViewHost(web_contents->GetRenderViewHost());
}
+void RenderViewDevToolsAgentHost::Observe(int type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ if (type == content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) {
+ bool visible = *Details<bool>(details).ptr();
+ overrides_handler_->OnVisibilityChanged(visible);
+ }
+}
+
void RenderViewDevToolsAgentHost::SetRenderViewHost(RenderViewHost* rvh) {
+ DCHECK(!render_view_host_);
render_view_host_ = rvh;
rvh_observer_.reset(new DevToolsAgentHostRvhObserver(rvh, this));
+ registrar_.Add(
+ this,
+ content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED,
+ content::Source<RenderWidgetHost>(render_view_host_));
+}
+
+void RenderViewDevToolsAgentHost::ClearRenderViewHost() {
+ DCHECK(render_view_host_);
+ registrar_.Remove(
+ this,
+ content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED,
+ content::Source<RenderWidgetHost>(render_view_host_));
+ rvh_observer_.reset(NULL);
+ render_view_host_ = NULL;
}
void RenderViewDevToolsAgentHost::ConnectRenderViewHost(RenderViewHost* rvh) {
@@ -278,9 +311,8 @@ void RenderViewDevToolsAgentHost::ConnectRenderViewHost(RenderViewHost* rvh) {
}
void RenderViewDevToolsAgentHost::DisconnectRenderViewHost() {
- OnClientDetached();
- rvh_observer_.reset();
- render_view_host_ = NULL;
+ ClientDetachedFromRenderer();
+ ClearRenderViewHost();
}
void RenderViewDevToolsAgentHost::RenderViewHostDestroyed(
@@ -288,7 +320,7 @@ void RenderViewDevToolsAgentHost::RenderViewHostDestroyed(
DCHECK(render_view_host_);
scoped_refptr<RenderViewDevToolsAgentHost> protect(this);
NotifyCloseListener();
- render_view_host_ = NULL;
+ ClearRenderViewHost();
Release();
}
@@ -301,9 +333,9 @@ void RenderViewDevToolsAgentHost::RenderViewCrashed() {
}
bool RenderViewDevToolsAgentHost::OnRvhMessageReceived(
- const IPC::Message& message) {
+ const IPC::Message& msg) {
bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(RenderViewDevToolsAgentHost, message)
+ IPC_BEGIN_MESSAGE_MAP(RenderViewDevToolsAgentHost, msg)
IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend,
OnDispatchOnInspectorFrontend)
IPC_MESSAGE_HANDLER(DevToolsHostMsg_SaveAgentRuntimeState,
@@ -311,11 +343,18 @@ bool RenderViewDevToolsAgentHost::OnRvhMessageReceived(
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)
IPC_END_MESSAGE_MAP()
return handled;
}
+void RenderViewDevToolsAgentHost::OnSwapCompositorFrame(
+ const IPC::Message& message) {
+ overrides_handler_->OnSwapCompositorFrame(message);
+}
+
void RenderViewDevToolsAgentHost::OnSaveAgentRuntimeState(
const std::string& state) {
if (!render_view_host_)