Index: content/browser/frame_host/render_frame_host_impl.cc |
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc |
index 641793ea6e1c8ad720f71c07612c5f853d77365b..700379f04ed1e626c44b8c645f5664345082b8a9 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -184,7 +184,7 @@ RenderFrameHostImpl::~RenderFrameHostImpl() { |
g_routing_id_frame_map.Get().erase( |
RenderFrameHostID(GetProcess()->GetID(), routing_id_)); |
- if (delegate_) |
+ if (delegate_ && render_frame_created_) |
delegate_->RenderFrameDeleted(this); |
FrameAccessibility::GetInstance()->OnRenderFrameHostDestroyed(this); |
@@ -619,6 +619,15 @@ bool RenderFrameHostImpl::IsRenderFrameLive() { |
} |
void RenderFrameHostImpl::SetRenderFrameCreated(bool created) { |
+ // If the current status is different than the new status, the delegate |
+ // needs to be notified. |
+ if (delegate_ && (created ^ render_frame_created_)) { |
Charlie Reis
2015/02/12 00:29:31
I feel like != would be clearer than ^.
nasko
2015/02/12 17:52:26
I think so too :)
|
+ if (created) |
+ delegate_->RenderFrameCreated(this); |
+ else |
+ delegate_->RenderFrameDeleted(this); |
+ } |
+ |
render_frame_created_ = created; |
if (created && render_widget_host_) |
render_widget_host_->InitForFrame(); |
@@ -663,14 +672,11 @@ void RenderFrameHostImpl::OnCreateChildFrame(int new_routing_id, |
if (!new_frame) |
return; |
+ new_frame->frame_tree_node()->set_sandbox_flags(sandbox_flags); |
+ |
// We know that the RenderFrame has been created in this case, immediately |
// after the CreateChildFrame IPC was sent. |
new_frame->SetRenderFrameCreated(true); |
- |
- new_frame->frame_tree_node()->set_sandbox_flags(sandbox_flags); |
- |
- if (delegate_) |
- delegate_->RenderFrameCreated(new_frame); |
} |
void RenderFrameHostImpl::OnDetach() { |
@@ -1043,9 +1049,6 @@ void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) { |
static_cast<base::TerminationStatus>(status); |
} |
- SetRenderFrameCreated(false); |
- InvalidateMojoConnection(); |
- |
// Reset frame tree state associated with this process. This must happen |
// before RenderViewTerminated because observers expect the subframes of any |
Charlie Reis
2015/02/12 00:29:31
I'm not sure why these lines were moved lower. If
nasko
2015/02/12 17:52:26
The reason I moved them is that it doesn't make se
|
// affected frames to be cleared first. |
@@ -1055,6 +1058,9 @@ void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) { |
if (!is_swapped_out()) |
frame_tree_node_->ResetForNewProcess(); |
+ SetRenderFrameCreated(false); |
+ InvalidateMojoConnection(); |
+ |
if (frame_tree_node_->IsMainFrame()) { |
// RenderViewHost/RenderWidgetHost needs to reset some stuff. |
render_view_host_->RendererExited( |