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

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

Issue 869533004: Fix WCO::RenderFrameCreated and WCO::RenderFrameDeleted notifications. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes for RenderFrameHostChanged. 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 641793ea6e1c8ad720f71c07612c5f853d77365b..91bc9223fe7f8e65c6db55a06b47094106a50969 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -155,6 +155,11 @@ RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance,
weak_ptr_factory_(this) {
bool is_swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT);
bool hidden = !!(flags & CREATE_RF_HIDDEN);
+
+ LOG(ERROR) << "RFH[" << this << "]::RFH: "
+ << "(" << GetProcess()->GetID() << ", " << GetRoutingID() << ")"
+ << " swapped_out:" << is_swapped_out;
+
frame_tree_->RegisterRenderFrameHost(this);
GetProcess()->AddRoute(routing_id_, this);
g_routing_id_frame_map.Get().insert(std::make_pair(
@@ -184,7 +189,11 @@ RenderFrameHostImpl::~RenderFrameHostImpl() {
g_routing_id_frame_map.Get().erase(
RenderFrameHostID(GetProcess()->GetID(), routing_id_));
- if (delegate_)
+ // Notify the FrameTree that this RFH is going away, allowing it to shut down
+ // the corresponding RenderViewHost if it is no longer needed.
+ frame_tree_->UnregisterRenderFrameHost(this);
+
+ if (delegate_ && render_frame_created_)
delegate_->RenderFrameDeleted(this);
FrameAccessibility::GetInstance()->OnRenderFrameHostDestroyed(this);
@@ -194,10 +203,6 @@ RenderFrameHostImpl::~RenderFrameHostImpl() {
if (IsRFHStateActive(rfh_state_))
GetSiteInstance()->decrement_active_frame_count();
- // Notify the FrameTree that this RFH is going away, allowing it to shut down
- // the corresponding RenderViewHost if it is no longer needed.
- frame_tree_->UnregisterRenderFrameHost(this);
-
// NULL out the swapout timer; in crash dumps this member will be null only if
// the dtor has run.
swapout_event_monitor_timeout_.reset();
@@ -208,6 +213,8 @@ RenderFrameHostImpl::~RenderFrameHostImpl() {
if (render_widget_host_)
render_widget_host_->Cleanup();
+
+ LOG(ERROR) << "RFH[" << this << "]::~RFH: ";
}
int RenderFrameHostImpl::GetRoutingID() {
@@ -324,6 +331,7 @@ bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) {
}
}
+
if (delegate_->OnMessageReceived(this, msg))
return true;
@@ -575,6 +583,9 @@ bool RenderFrameHostImpl::CreateRenderFrame(int parent_routing_id,
widget_params.hidden = true;
}
+ LOG(ERROR) << "RFH[" << this << "]::CreateRenderFrame:"
+ << " sending IPC to create RenderFrame";
+
Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id, proxy_routing_id,
frame_tree_node()->current_replication_state(),
widget_params));
@@ -619,6 +630,19 @@ bool RenderFrameHostImpl::IsRenderFrameLive() {
}
void RenderFrameHostImpl::SetRenderFrameCreated(bool created) {
+ // If the current status is different than the new status, the delegate
+ // needs to be notified.
+ LOG(ERROR) << "RFH[" << this << "]::SetRenderFrameCreated: "
+ << " render_frame_created_:" << render_frame_created_
+ << " created:" << created;
+
+ 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();
@@ -658,19 +682,21 @@ void RenderFrameHostImpl::OnCreateChildFrame(int new_routing_id,
if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT)
return;
+ LOG(ERROR) << "RFH[" << this << "]::OnCreateChildFrame: "
+ << " new frame: ("
+ << GetProcess()->GetID() << ", " << new_routing_id
+ << ")";
+
RenderFrameHostImpl* new_frame = frame_tree_->AddFrame(
frame_tree_node_, GetProcess()->GetID(), new_routing_id, frame_name);
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() {
@@ -1036,6 +1062,10 @@ void RenderFrameHostImpl::OnSwapOutACK() {
}
void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) {
+ LOG(ERROR) << "RFH[" << this << "]::OnRenderProcessGone: "
+ << " main_frame:" << frame_tree_node_->IsMainFrame()
+ << " created:" << render_frame_created_;
+
if (frame_tree_node_->IsMainFrame()) {
// Keep the termination status so we can get at it later when we
// need to know why it died.
@@ -1043,9 +1073,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.
@@ -1055,6 +1082,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(
« 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