Index: content/browser/devtools/render_frame_devtools_agent_host.cc |
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc |
index 3b6a2072432cdfb4936defbf0553de47d0d39fb0..a9c5b03a6bb1c738a79891977aa7d25a50b72021 100644 |
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc |
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc |
@@ -20,6 +20,7 @@ |
#include "content/browser/devtools/protocol/security_handler.h" |
#include "content/browser/devtools/protocol/service_worker_handler.h" |
#include "content/browser/devtools/protocol/tracing_handler.h" |
+#include "content/browser/frame_host/navigation_handle_impl.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" |
@@ -231,6 +232,7 @@ void RenderFrameDevToolsAgentHost::FrameHostHolder::Resume() { |
// RenderFrameDevToolsAgentHost ------------------------------------------------ |
+// static |
scoped_refptr<DevToolsAgentHost> |
DevToolsAgentHost::GetOrCreateFor(RenderFrameHost* frame_host) { |
while (frame_host && !ShouldCreateDevToolsFor(frame_host)) |
@@ -244,6 +246,7 @@ DevToolsAgentHost::GetOrCreateFor(RenderFrameHost* frame_host) { |
return result; |
} |
+// static |
scoped_refptr<DevToolsAgentHost> |
DevToolsAgentHost::GetOrCreateFor(WebContents* web_contents) { |
RenderFrameDevToolsAgentHost* result = FindAgentHost(web_contents); |
@@ -337,7 +340,8 @@ RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost( |
emulation_handler_(nullptr), |
frame_trace_recorder_(nullptr), |
protocol_handler_(new DevToolsProtocolHandler(this)), |
- current_frame_crashed_(false) { |
+ current_frame_crashed_(false), |
+ frame_tree_node_(host->frame_tree_node()) { |
DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); |
dispatcher->SetDOMHandler(dom_handler_.get()); |
dispatcher->SetInputHandler(input_handler_.get()); |
@@ -493,32 +497,51 @@ RenderFrameDevToolsAgentHost::~RenderFrameDevToolsAgentHost() { |
g_instances.Get().erase(it); |
} |
+void RenderFrameDevToolsAgentHost::DidFinishNavigation( |
+ NavigationHandle* navigation_handle) { |
+ if (MatchesMyTreeNode(navigation_handle) && pending_) { |
+ if (navigation_handle->HasCommitted() && |
+ !navigation_handle->IsErrorPage()) { |
+ // This was a successful navigation |
+ CommitPending(); |
+ CHECK(current_->host() == navigation_handle->GetRenderFrameHost()); |
+ } else { |
+ // This was an unsuccessful navigation (canceled, failed, interrupted...). |
+ DiscardPending(); |
+ } |
+ } |
+ service_worker_handler_->UpdateHosts(); |
+} |
+ |
void RenderFrameDevToolsAgentHost::AboutToNavigateRenderFrame( |
RenderFrameHost* old_host, |
RenderFrameHost* new_host) { |
- DCHECK(!pending_ || pending_->host() != old_host); |
- if (!current_ || current_->host() != old_host) |
+ if (!MatchesMyTreeNode(old_host)) |
return; |
+ DCHECK(!pending_ || pending_->host() != old_host); |
if (old_host == new_host && !current_frame_crashed_) |
return; |
DCHECK(!pending_); |
SetPending(static_cast<RenderFrameHostImpl*>(new_host)); |
} |
-void RenderFrameDevToolsAgentHost::RenderFrameHostChanged( |
- RenderFrameHost* old_host, |
- RenderFrameHost* new_host) { |
- DCHECK(!pending_ || pending_->host() != old_host); |
- if (!current_ || current_->host() != old_host) |
- return; |
+// void RenderFrameDevToolsAgentHost::RenderFrameHostChanged( |
+// RenderFrameHost* old_host, |
+// RenderFrameHost* new_host) { |
+// if (!MatchesMyTreeNode(old_host)) |
+// return; |
+// DCHECK(!pending_ || pending_->host() != old_host); |
- // AboutToNavigateRenderFrame was not called for renderer-initiated |
- // navigation. |
- if (!pending_) |
- SetPending(static_cast<RenderFrameHostImpl*>(new_host)); |
+// // AboutToNavigateRenderFrame was not called for renderer-initiated |
+// // navigation. |
+// if (!pending_) { |
+// SetPending(static_cast<RenderFrameHostImpl*>(new_host)); |
+// } else { |
+// DCHECK(pending_->host() == new_host); |
+// } |
- CommitPending(); |
-} |
+// CommitPending(); |
+// } |
void RenderFrameDevToolsAgentHost::FrameDeleted(RenderFrameHost* rfh) { |
if (pending_ && pending_->host() == rfh) { |
@@ -544,6 +567,8 @@ void RenderFrameDevToolsAgentHost::DestroyOnRenderFrameGone() { |
HostClosed(); |
pending_.reset(); |
current_.reset(); |
+ frame_tree_node_ = nullptr; |
+ WebContentsObserver::Observe(nullptr); |
Release(); |
} |
@@ -618,25 +643,6 @@ void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { |
page_handler_->DidDetachInterstitialPage(); |
} |
-void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame( |
- RenderFrameHost* render_frame_host, |
- const GURL& url, |
- ui::PageTransition transition_type) { |
- if (pending_ && pending_->host() == render_frame_host) |
- CommitPending(); |
- service_worker_handler_->UpdateHosts(); |
-} |
- |
-void RenderFrameDevToolsAgentHost::DidFailProvisionalLoad( |
- RenderFrameHost* render_frame_host, |
- const GURL& validated_url, |
- int error_code, |
- const base::string16& error_description, |
- bool was_ignored_by_handler) { |
- if (pending_ && pending_->host() == render_frame_host) |
- DiscardPending(); |
-} |
- |
void RenderFrameDevToolsAgentHost::UpdateProtocolHandlers( |
RenderFrameHostImpl* host) { |
dom_handler_->SetRenderFrameHost(host); |
@@ -659,6 +665,7 @@ void RenderFrameDevToolsAgentHost::DisconnectWebContents() { |
UpdateProtocolHandlers(nullptr); |
disconnected_ = current_.Pass(); |
disconnected_->Detach(); |
+ frame_tree_node_ = nullptr; |
WebContentsObserver::Observe(nullptr); |
} |
@@ -668,6 +675,7 @@ void RenderFrameDevToolsAgentHost::ConnectWebContents(WebContents* wc) { |
RenderFrameHostImpl* host = |
static_cast<RenderFrameHostImpl*>(wc->GetMainFrame()); |
DCHECK(host); |
+ frame_tree_node_ = host->frame_tree_node(); |
current_ = disconnected_.Pass(); |
SetPending(host); |
CommitPending(); |
@@ -754,4 +762,18 @@ bool RenderFrameDevToolsAgentHost::IsChildFrame() { |
return current_ && current_->host()->GetParent(); |
} |
+bool RenderFrameDevToolsAgentHost::MatchesMyTreeNode( |
+ NavigationHandle* navigation_handle) { |
+ return frame_tree_node_ == |
+ static_cast<NavigationHandleImpl*>(navigation_handle) |
+ ->frame_tree_node(); |
+} |
+ |
+bool RenderFrameDevToolsAgentHost::MatchesMyTreeNode( |
+ RenderFrameHost* render_frame_host) { |
+ return frame_tree_node_ == |
+ static_cast<RenderFrameHostImpl*>(render_frame_host) |
+ ->frame_tree_node(); |
+} |
+ |
} // namespace content |