Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(914)

Unified Diff: content/browser/frame_host/render_frame_host_impl.cc

Issue 921443003: Fix RenderFrameCreated and RenderFrameDeleted WebContentsObserver methods (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Delete pending callbacks in ManifestManagerHost destructor. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 e6cc05197d3a25613468d2938787f3f54da90757..6b248ecd6ea08ebf59e807c44023c5d515d60916 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_)) {
+ if (created)
+ delegate_->RenderFrameCreated(this);
+ else
+ delegate_->RenderFrameDeleted(this);
+ }
+
render_frame_created_ = created;
if (created && render_widget_host_)
render_widget_host_->InitForFrame();
@@ -669,14 +678,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() {
@@ -1049,9 +1055,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
// affected frames to be cleared first.
@@ -1061,6 +1064,11 @@ void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) {
if (!is_swapped_out())
frame_tree_node_->ResetForNewProcess();
+ // Reset state for the current RenderFrameHost once the FrameTreeNode has been
+ // reset.
+ SetRenderFrameCreated(false);
+ InvalidateMojoConnection();
+
if (frame_tree_node_->IsMainFrame()) {
// RenderViewHost/RenderWidgetHost needs to reset some stuff.
render_view_host_->RendererExited(
« no previous file with comments | « content/browser/frame_host/frame_tree_unittest.cc ('k') | content/browser/frame_host/render_frame_host_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698