Chromium Code Reviews| 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(); |
| } |