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 c3e2ec9c556dab330b1a0c9ef6ed2ed4f95dd76e..1d9caebdb47d510a634c0e2ffc6f9ebe8528851d 100644 |
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc |
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc |
@@ -304,7 +304,8 @@ RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost( |
protocol_handler_(new DevToolsProtocolHandler( |
this, |
base::Bind(&RenderFrameDevToolsAgentHost::SendMessageToClient, |
- base::Unretained(this)))) { |
+ base::Unretained(this)))), |
+ frame_crashed_(false) { |
DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); |
dispatcher->SetDOMHandler(dom_handler_.get()); |
dispatcher->SetInputHandler(input_handler_.get()); |
@@ -332,6 +333,7 @@ RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost( |
void RenderFrameDevToolsAgentHost::SetPending(RenderFrameHostImpl* host) { |
DCHECK(!pending_); |
+ frame_crashed_ = false; |
pending_.reset(new FrameHostHolder(this, host)); |
if (IsAttached()) |
pending_->Reattach(current_.get()); |
@@ -346,6 +348,7 @@ void RenderFrameDevToolsAgentHost::SetPending(RenderFrameHostImpl* host) { |
void RenderFrameDevToolsAgentHost::CommitPending() { |
DCHECK(pending_); |
+ frame_crashed_ = false; |
if (!ShouldCreateDevToolsFor(pending_->host())) { |
DestroyOnRenderFrameGone(); |
@@ -361,6 +364,7 @@ void RenderFrameDevToolsAgentHost::CommitPending() { |
void RenderFrameDevToolsAgentHost::DiscardPending() { |
DCHECK(pending_); |
DCHECK(current_); |
+ frame_crashed_ = false; |
nasko
2015/06/11 16:56:12
Does this boolean track the pending or the current
dgozman
2015/06/15 14:59:06
It's intended to be the current one. RenderProcess
|
pending_.reset(); |
UpdateProtocolHandlers(current_->host()); |
current_->Resume(); |
@@ -463,7 +467,7 @@ void RenderFrameDevToolsAgentHost::AboutToNavigateRenderFrame( |
DCHECK(!pending_ || pending_->host() != old_host); |
if (!current_ || current_->host() != old_host) |
return; |
- if (old_host == new_host) |
+ if (old_host == new_host && !frame_crashed_) |
return; |
DCHECK(!pending_); |
SetPending(static_cast<RenderFrameHostImpl*>(new_host)); |
@@ -495,7 +499,8 @@ void RenderFrameDevToolsAgentHost::FrameDeleted(RenderFrameHost* rfh) { |
} |
void RenderFrameDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) { |
- FrameDeleted(rfh); |
+ if (!frame_crashed_) |
+ FrameDeleted(rfh); |
} |
void RenderFrameDevToolsAgentHost::DestroyOnRenderFrameGone() { |
@@ -522,6 +527,7 @@ void RenderFrameDevToolsAgentHost::RenderProcessGone( |
case base::TERMINATION_STATUS_OOM_PROTECTED: |
#endif |
inspector_handler_->TargetCrashed(); |
+ frame_crashed_ = true; |
break; |
default: |
break; |
@@ -581,6 +587,8 @@ 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(); |
} |