| Index: content/browser/devtools/render_view_devtools_agent_host.cc
|
| diff --git a/content/browser/devtools/render_view_devtools_agent_host.cc b/content/browser/devtools/render_view_devtools_agent_host.cc
|
| deleted file mode 100644
|
| index 1f1edec7a22ab2fffb1969583daafbac56ece12c..0000000000000000000000000000000000000000
|
| --- a/content/browser/devtools/render_view_devtools_agent_host.cc
|
| +++ /dev/null
|
| @@ -1,526 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/browser/devtools/render_view_devtools_agent_host.h"
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/json/json_writer.h"
|
| -#include "base/lazy_instance.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "content/browser/child_process_security_policy_impl.h"
|
| -#include "content/browser/devtools/devtools_manager.h"
|
| -#include "content/browser/devtools/protocol/devtools_protocol_handler.h"
|
| -#include "content/browser/devtools/protocol/dom_handler.h"
|
| -#include "content/browser/devtools/protocol/input_handler.h"
|
| -#include "content/browser/devtools/protocol/inspector_handler.h"
|
| -#include "content/browser/devtools/protocol/network_handler.h"
|
| -#include "content/browser/devtools/protocol/page_handler.h"
|
| -#include "content/browser/devtools/protocol/power_handler.h"
|
| -#include "content/browser/devtools/protocol/tracing_handler.h"
|
| -#include "content/browser/frame_host/render_frame_host_impl.h"
|
| -#include "content/browser/renderer_host/render_process_host_impl.h"
|
| -#include "content/browser/renderer_host/render_view_host_impl.h"
|
| -#include "content/browser/site_instance_impl.h"
|
| -#include "content/browser/web_contents/web_contents_impl.h"
|
| -#include "content/common/view_messages.h"
|
| -#include "content/public/browser/browser_context.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"
|
| -#include "content/public/browser/web_contents_delegate.h"
|
| -
|
| -#if defined(OS_ANDROID)
|
| -#include "content/browser/power_save_blocker_impl.h"
|
| -#include "content/public/browser/render_widget_host_view.h"
|
| -#endif
|
| -
|
| -namespace content {
|
| -
|
| -typedef std::vector<RenderViewDevToolsAgentHost*> Instances;
|
| -
|
| -namespace {
|
| -base::LazyInstance<Instances>::Leaky g_instances = LAZY_INSTANCE_INITIALIZER;
|
| -
|
| -static RenderViewDevToolsAgentHost* FindAgentHost(RenderFrameHost* host) {
|
| - if (g_instances == NULL)
|
| - return NULL;
|
| - for (Instances::iterator it = g_instances.Get().begin();
|
| - it != g_instances.Get().end(); ++it) {
|
| - if ((*it)->HasRenderFrameHost(host))
|
| - return *it;
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -// Returns RenderViewDevToolsAgentHost attached to any of RenderFrameHost
|
| -// instances associated with |web_contents|
|
| -static RenderViewDevToolsAgentHost* FindAgentHost(WebContents* web_contents) {
|
| - if (g_instances == NULL)
|
| - return NULL;
|
| - for (Instances::iterator it = g_instances.Get().begin();
|
| - it != g_instances.Get().end(); ++it) {
|
| - if ((*it)->GetWebContents() == web_contents)
|
| - return *it;
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -scoped_refptr<DevToolsAgentHost>
|
| -DevToolsAgentHost::GetOrCreateFor(WebContents* web_contents) {
|
| - RenderViewDevToolsAgentHost* result = FindAgentHost(web_contents);
|
| - if (!result)
|
| - result = new RenderViewDevToolsAgentHost(web_contents->GetMainFrame());
|
| - return result;
|
| -}
|
| -
|
| -// static
|
| -bool DevToolsAgentHost::HasFor(WebContents* web_contents) {
|
| - return FindAgentHost(web_contents) != NULL;
|
| -}
|
| -
|
| -// static
|
| -bool DevToolsAgentHost::IsDebuggerAttached(WebContents* web_contents) {
|
| - RenderViewDevToolsAgentHost* agent_host = FindAgentHost(web_contents);
|
| - return agent_host && agent_host->IsAttached();
|
| -}
|
| -
|
| -//static
|
| -std::vector<WebContents*> DevToolsAgentHostImpl::GetInspectableWebContents() {
|
| - std::set<WebContents*> set;
|
| - scoped_ptr<RenderWidgetHostIterator> widgets(
|
| - RenderWidgetHost::GetRenderWidgetHosts());
|
| - while (RenderWidgetHost* widget = widgets->GetNextHost()) {
|
| - // Ignore processes that don't have a connection, such as crashed contents.
|
| - if (!widget->GetProcess()->HasConnection())
|
| - continue;
|
| - if (!widget->IsRenderView())
|
| - continue;
|
| -
|
| - RenderViewHost* rvh = RenderViewHost::From(widget);
|
| - WebContents* web_contents = WebContents::FromRenderViewHost(rvh);
|
| - if (web_contents)
|
| - set.insert(web_contents);
|
| - }
|
| - std::vector<WebContents*> result(set.size());
|
| - std::copy(set.begin(), set.end(), result.begin());
|
| - return result;
|
| -}
|
| -
|
| -// static
|
| -void RenderViewDevToolsAgentHost::OnCancelPendingNavigation(
|
| - RenderFrameHost* pending,
|
| - RenderFrameHost* current) {
|
| - RenderViewDevToolsAgentHost* agent_host = FindAgentHost(pending);
|
| - if (!agent_host)
|
| - return;
|
| - agent_host->DisconnectRenderFrameHost();
|
| - agent_host->ConnectRenderFrameHost(current);
|
| -}
|
| -
|
| -RenderViewDevToolsAgentHost::RenderViewDevToolsAgentHost(RenderFrameHost* rfh)
|
| - : render_frame_host_(NULL),
|
| - dom_handler_(new devtools::dom::DOMHandler()),
|
| - input_handler_(new devtools::input::InputHandler()),
|
| - inspector_handler_(new devtools::inspector::InspectorHandler()),
|
| - network_handler_(new devtools::network::NetworkHandler()),
|
| - page_handler_(new devtools::page::PageHandler()),
|
| - power_handler_(new devtools::power::PowerHandler()),
|
| - tracing_handler_(new devtools::tracing::TracingHandler(
|
| - devtools::tracing::TracingHandler::Renderer)),
|
| - protocol_handler_(new DevToolsProtocolHandler(
|
| - base::Bind(&RenderViewDevToolsAgentHost::DispatchOnInspectorFrontend,
|
| - base::Unretained(this)))),
|
| - reattaching_(false) {
|
| - DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher();
|
| - dispatcher->SetDOMHandler(dom_handler_.get());
|
| - dispatcher->SetInputHandler(input_handler_.get());
|
| - dispatcher->SetInspectorHandler(inspector_handler_.get());
|
| - dispatcher->SetNetworkHandler(network_handler_.get());
|
| - dispatcher->SetPageHandler(page_handler_.get());
|
| - dispatcher->SetPowerHandler(power_handler_.get());
|
| - dispatcher->SetTracingHandler(tracing_handler_.get());
|
| - SetRenderFrameHost(rfh);
|
| - g_instances.Get().push_back(this);
|
| - AddRef(); // Balanced in RenderFrameHostDestroyed.
|
| - DevToolsManager::GetInstance()->AgentHostChanged(this);
|
| -}
|
| -
|
| -BrowserContext* RenderViewDevToolsAgentHost::GetBrowserContext() {
|
| - WebContents* contents = web_contents();
|
| - return contents ? contents->GetBrowserContext() : nullptr;
|
| -}
|
| -
|
| -WebContents* RenderViewDevToolsAgentHost::GetWebContents() {
|
| - return web_contents();
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::DispatchProtocolMessage(
|
| - const std::string& message) {
|
| - scoped_ptr<base::DictionaryValue> command =
|
| - protocol_handler_->ParseCommand(message);
|
| - if (!command)
|
| - return;
|
| -
|
| - DevToolsManagerDelegate* delegate =
|
| - DevToolsManager::GetInstance()->delegate();
|
| - if (delegate) {
|
| - scoped_ptr<base::DictionaryValue> response(
|
| - delegate->HandleCommand(this, command.get()));
|
| - if (response) {
|
| - std::string json_response;
|
| - base::JSONWriter::Write(response.get(), &json_response);
|
| - DispatchOnInspectorFrontend(json_response);
|
| - return;
|
| - }
|
| - }
|
| -
|
| - if (protocol_handler_->HandleOptionalCommand(command.Pass()))
|
| - return;
|
| -
|
| - IPCDevToolsAgentHost::DispatchProtocolMessage(message);
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::SendMessageToAgent(IPC::Message* msg) {
|
| - if (!render_frame_host_)
|
| - return;
|
| - msg->set_routing_id(render_frame_host_->GetRoutingID());
|
| - render_frame_host_->Send(msg);
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::OnClientAttached() {
|
| - if (!render_frame_host_)
|
| - return;
|
| -
|
| - InnerOnClientAttached();
|
| -
|
| - // TODO(kaznacheev): Move this call back to DevToolsManager when
|
| - // extensions::ProcessManager no longer relies on this notification.
|
| - if (!reattaching_)
|
| - DevToolsAgentHostImpl::NotifyCallbacks(this, true);
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::InnerOnClientAttached() {
|
| - ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadRawCookies(
|
| - render_frame_host_->GetProcess()->GetID());
|
| -
|
| -#if defined(OS_ANDROID)
|
| - power_save_blocker_.reset(
|
| - static_cast<PowerSaveBlockerImpl*>(
|
| - PowerSaveBlocker::Create(
|
| - PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
|
| - "DevTools").release()));
|
| - RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
|
| - render_frame_host_->GetRenderViewHost());
|
| - if (rvh->GetView()) {
|
| - power_save_blocker_.get()->
|
| - InitDisplaySleepBlocker(rvh->GetView()->GetNativeView());
|
| - }
|
| -#endif
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::OnClientDetached() {
|
| -#if defined(OS_ANDROID)
|
| - power_save_blocker_.reset();
|
| -#endif
|
| - page_handler_->Detached();
|
| - power_handler_->Detached();
|
| - tracing_handler_->Detached();
|
| - ClientDetachedFromRenderer();
|
| -
|
| - // TODO(kaznacheev): Move this call back to DevToolsManager when
|
| - // extensions::ProcessManager no longer relies on this notification.
|
| - if (!reattaching_)
|
| - DevToolsAgentHostImpl::NotifyCallbacks(this, false);
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::ClientDetachedFromRenderer() {
|
| - if (!render_frame_host_)
|
| - return;
|
| -
|
| - InnerClientDetachedFromRenderer();
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::InnerClientDetachedFromRenderer() {
|
| - bool process_has_agents = false;
|
| - RenderProcessHost* render_process_host = render_frame_host_->GetProcess();
|
| - for (Instances::iterator it = g_instances.Get().begin();
|
| - it != g_instances.Get().end(); ++it) {
|
| - if (*it == this || !(*it)->IsAttached())
|
| - continue;
|
| - RenderFrameHost* rfh = (*it)->render_frame_host_;
|
| - if (rfh && rfh->GetProcess() == render_process_host)
|
| - process_has_agents = true;
|
| - }
|
| -
|
| - // We are the last to disconnect from the renderer -> revoke permissions.
|
| - if (!process_has_agents) {
|
| - ChildProcessSecurityPolicyImpl::GetInstance()->RevokeReadRawCookies(
|
| - render_process_host->GetID());
|
| - }
|
| -}
|
| -
|
| -RenderViewDevToolsAgentHost::~RenderViewDevToolsAgentHost() {
|
| - Instances::iterator it = std::find(g_instances.Get().begin(),
|
| - g_instances.Get().end(),
|
| - this);
|
| - if (it != g_instances.Get().end())
|
| - g_instances.Get().erase(it);
|
| -}
|
| -
|
| -// TODO(creis): Consider removing this in favor of RenderFrameHostChanged.
|
| -void RenderViewDevToolsAgentHost::AboutToNavigateRenderFrame(
|
| - RenderFrameHost* old_host,
|
| - RenderFrameHost* new_host) {
|
| - if (render_frame_host_ != old_host)
|
| - return;
|
| -
|
| - // TODO(creis): This will need to be updated for --site-per-process, since
|
| - // RenderViewHost is going away and navigations could happen in any frame.
|
| - if (render_frame_host_ == new_host) {
|
| - RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
|
| - render_frame_host_->GetRenderViewHost());
|
| - if (rvh->render_view_termination_status() ==
|
| - base::TERMINATION_STATUS_STILL_RUNNING)
|
| - return;
|
| - }
|
| - ReattachToRenderFrameHost(new_host);
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::RenderFrameHostChanged(
|
| - RenderFrameHost* old_host,
|
| - RenderFrameHost* new_host) {
|
| - if (old_host == render_frame_host_ && new_host != render_frame_host_) {
|
| - // AboutToNavigateRenderFrame was not called for renderer-initiated
|
| - // navigation.
|
| - ReattachToRenderFrameHost(new_host);
|
| - }
|
| -}
|
| -
|
| -void
|
| -RenderViewDevToolsAgentHost::ReattachToRenderFrameHost(RenderFrameHost* rfh) {
|
| - DCHECK(!reattaching_);
|
| - reattaching_ = true;
|
| - DisconnectRenderFrameHost();
|
| - ConnectRenderFrameHost(rfh);
|
| - reattaching_ = false;
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) {
|
| - if (rfh != render_frame_host_)
|
| - return;
|
| -
|
| - DCHECK(render_frame_host_);
|
| - scoped_refptr<RenderViewDevToolsAgentHost> protect(this);
|
| - HostClosed();
|
| - ClearRenderFrameHost();
|
| - DevToolsManager::GetInstance()->AgentHostChanged(this);
|
| - Release();
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::RenderProcessGone(
|
| - base::TerminationStatus status) {
|
| - switch(status) {
|
| - 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
|
| - RenderFrameCrashed();
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| -}
|
| -
|
| -bool RenderViewDevToolsAgentHost::OnMessageReceived(
|
| - const IPC::Message& message) {
|
| - if (!render_frame_host_)
|
| - return false;
|
| - if (message.type() == ViewHostMsg_SwapCompositorFrame::ID)
|
| - OnSwapCompositorFrame(message);
|
| - return false;
|
| -}
|
| -
|
| -bool RenderViewDevToolsAgentHost::OnMessageReceived(
|
| - const IPC::Message& message,
|
| - RenderFrameHost* render_frame_host) {
|
| - if (!render_frame_host_ || render_frame_host != render_frame_host_)
|
| - return false;
|
| -
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(RenderViewDevToolsAgentHost, message)
|
| - IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend,
|
| - OnDispatchOnInspectorFrontend)
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP()
|
| - return handled;
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::DidAttachInterstitialPage() {
|
| - page_handler_->DidAttachInterstitialPage();
|
| -
|
| - if (!render_frame_host_)
|
| - return;
|
| - // The rvh set in AboutToNavigateRenderFrame turned out to be interstitial.
|
| - // Connect back to the real one.
|
| - WebContents* web_contents =
|
| - WebContents::FromRenderFrameHost(render_frame_host_);
|
| - if (!web_contents)
|
| - return;
|
| - DisconnectRenderFrameHost();
|
| - ConnectRenderFrameHost(web_contents->GetMainFrame());
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::DidDetachInterstitialPage() {
|
| - page_handler_->DidDetachInterstitialPage();
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::TitleWasSet(
|
| - NavigationEntry* entry, bool explicit_set) {
|
| - DevToolsManager::GetInstance()->AgentHostChanged(this);
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::NavigationEntryCommitted(
|
| - const LoadCommittedDetails& load_details) {
|
| - DevToolsManager::GetInstance()->AgentHostChanged(this);
|
| -}
|
| -
|
| -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();
|
| - page_handler_->OnVisibilityChanged(visible);
|
| - }
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::SetRenderFrameHost(RenderFrameHost* rfh) {
|
| - DCHECK(!render_frame_host_);
|
| - render_frame_host_ = static_cast<RenderFrameHostImpl*>(rfh);
|
| -
|
| - WebContentsObserver::Observe(WebContents::FromRenderFrameHost(rfh));
|
| - RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
|
| - rfh->GetRenderViewHost());
|
| - dom_handler_->SetRenderViewHost(rvh);
|
| - input_handler_->SetRenderViewHost(rvh);
|
| - network_handler_->SetRenderViewHost(rvh);
|
| - page_handler_->SetRenderViewHost(rvh);
|
| -
|
| - registrar_.Add(
|
| - this,
|
| - content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED,
|
| - content::Source<RenderWidgetHost>(rvh));
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::ClearRenderFrameHost() {
|
| - DCHECK(render_frame_host_);
|
| - RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
|
| - render_frame_host_->GetRenderViewHost());
|
| - registrar_.Remove(
|
| - this,
|
| - content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED,
|
| - content::Source<RenderWidgetHost>(rvh));
|
| - render_frame_host_ = nullptr;
|
| - dom_handler_->SetRenderViewHost(nullptr);
|
| - input_handler_->SetRenderViewHost(nullptr);
|
| - network_handler_->SetRenderViewHost(nullptr);
|
| - page_handler_->SetRenderViewHost(nullptr);
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::DisconnectWebContents() {
|
| - DisconnectRenderFrameHost();
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::ConnectWebContents(WebContents* wc) {
|
| - ConnectRenderFrameHost(wc->GetMainFrame());
|
| -}
|
| -
|
| -DevToolsAgentHost::Type RenderViewDevToolsAgentHost::GetType() {
|
| - return TYPE_WEB_CONTENTS;
|
| -}
|
| -
|
| -std::string RenderViewDevToolsAgentHost::GetTitle() {
|
| - if (WebContents* web_contents = GetWebContents())
|
| - return base::UTF16ToUTF8(web_contents->GetTitle());
|
| - return "";
|
| -}
|
| -
|
| -GURL RenderViewDevToolsAgentHost::GetURL() {
|
| - if (WebContents* web_contents = GetWebContents())
|
| - return web_contents->GetVisibleURL();
|
| - return render_frame_host_ ?
|
| - render_frame_host_->GetLastCommittedURL() : GURL();
|
| -}
|
| -
|
| -bool RenderViewDevToolsAgentHost::Activate() {
|
| - if (render_frame_host_) {
|
| - render_frame_host_->GetRenderViewHost()->GetDelegate()->Activate();
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool RenderViewDevToolsAgentHost::Close() {
|
| - if (render_frame_host_) {
|
| - render_frame_host_->GetRenderViewHost()->ClosePage();
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::ConnectRenderFrameHost(RenderFrameHost* rfh) {
|
| - SetRenderFrameHost(rfh);
|
| - if (IsAttached())
|
| - Reattach();
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::DisconnectRenderFrameHost() {
|
| - ClientDetachedFromRenderer();
|
| - ClearRenderFrameHost();
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::RenderFrameCrashed() {
|
| - inspector_handler_->TargetCrashed();
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::OnSwapCompositorFrame(
|
| - const IPC::Message& message) {
|
| - ViewHostMsg_SwapCompositorFrame::Param param;
|
| - if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m))
|
| - return;
|
| - page_handler_->OnSwapCompositorFrame(get<1>(param).metadata);
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::SynchronousSwapCompositorFrame(
|
| - const cc::CompositorFrameMetadata& frame_metadata) {
|
| - if (!render_frame_host_)
|
| - return;
|
| - page_handler_->OnSwapCompositorFrame(frame_metadata);
|
| -}
|
| -
|
| -bool RenderViewDevToolsAgentHost::HasRenderFrameHost(
|
| - RenderFrameHost* host) {
|
| - return host == render_frame_host_;
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::OnDispatchOnInspectorFrontend(
|
| - const DevToolsMessageChunk& message) {
|
| - if (!IsAttached() || !render_frame_host_)
|
| - return;
|
| - ProcessChunkedMessageFromAgent(message);
|
| -}
|
| -
|
| -void RenderViewDevToolsAgentHost::DispatchOnInspectorFrontend(
|
| - const std::string& message) {
|
| - if (!IsAttached() || !render_frame_host_)
|
| - return;
|
| - SendMessageToClient(message);
|
| -}
|
| -
|
| -} // namespace content
|
|
|