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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/frame_host/render_frame_host_impl.h" 5 #include "content/browser/frame_host/render_frame_host_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/containers/hash_tables.h" 9 #include "base/containers/hash_tables.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 has_unload_handlers_(false), 148 has_unload_handlers_(false),
149 override_sudden_termination_status_(false), 149 override_sudden_termination_status_(false),
150 is_waiting_for_beforeunload_ack_(false), 150 is_waiting_for_beforeunload_ack_(false),
151 unload_ack_is_for_navigation_(false), 151 unload_ack_is_for_navigation_(false),
152 accessibility_reset_token_(0), 152 accessibility_reset_token_(0),
153 accessibility_reset_count_(0), 153 accessibility_reset_count_(0),
154 no_create_browser_accessibility_manager_for_testing_(false), 154 no_create_browser_accessibility_manager_for_testing_(false),
155 weak_ptr_factory_(this) { 155 weak_ptr_factory_(this) {
156 bool is_swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); 156 bool is_swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT);
157 bool hidden = !!(flags & CREATE_RF_HIDDEN); 157 bool hidden = !!(flags & CREATE_RF_HIDDEN);
158
159 LOG(ERROR) << "RFH[" << this << "]::RFH: "
160 << "(" << GetProcess()->GetID() << ", " << GetRoutingID() << ")"
161 << " swapped_out:" << is_swapped_out;
162
158 frame_tree_->RegisterRenderFrameHost(this); 163 frame_tree_->RegisterRenderFrameHost(this);
159 GetProcess()->AddRoute(routing_id_, this); 164 GetProcess()->AddRoute(routing_id_, this);
160 g_routing_id_frame_map.Get().insert(std::make_pair( 165 g_routing_id_frame_map.Get().insert(std::make_pair(
161 RenderFrameHostID(GetProcess()->GetID(), routing_id_), 166 RenderFrameHostID(GetProcess()->GetID(), routing_id_),
162 this)); 167 this));
163 168
164 if (is_swapped_out) { 169 if (is_swapped_out) {
165 rfh_state_ = STATE_SWAPPED_OUT; 170 rfh_state_ = STATE_SWAPPED_OUT;
166 } else { 171 } else {
167 rfh_state_ = STATE_DEFAULT; 172 rfh_state_ = STATE_DEFAULT;
168 GetSiteInstance()->increment_active_frame_count(); 173 GetSiteInstance()->increment_active_frame_count();
169 } 174 }
170 175
171 SetUpMojoIfNeeded(); 176 SetUpMojoIfNeeded();
172 swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind( 177 swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind(
173 &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr()))); 178 &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr())));
174 179
175 if (flags & CREATE_RF_NEEDS_RENDER_WIDGET_HOST) { 180 if (flags & CREATE_RF_NEEDS_RENDER_WIDGET_HOST) {
176 render_widget_host_.reset(new RenderWidgetHostImpl( 181 render_widget_host_.reset(new RenderWidgetHostImpl(
177 rwh_delegate, GetProcess(), MSG_ROUTING_NONE, hidden)); 182 rwh_delegate, GetProcess(), MSG_ROUTING_NONE, hidden));
178 render_widget_host_->set_owned_by_render_frame_host(true); 183 render_widget_host_->set_owned_by_render_frame_host(true);
179 } 184 }
180 } 185 }
181 186
182 RenderFrameHostImpl::~RenderFrameHostImpl() { 187 RenderFrameHostImpl::~RenderFrameHostImpl() {
183 GetProcess()->RemoveRoute(routing_id_); 188 GetProcess()->RemoveRoute(routing_id_);
184 g_routing_id_frame_map.Get().erase( 189 g_routing_id_frame_map.Get().erase(
185 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); 190 RenderFrameHostID(GetProcess()->GetID(), routing_id_));
186 191
187 if (delegate_) 192 // Notify the FrameTree that this RFH is going away, allowing it to shut down
193 // the corresponding RenderViewHost if it is no longer needed.
194 frame_tree_->UnregisterRenderFrameHost(this);
195
196 if (delegate_ && render_frame_created_)
188 delegate_->RenderFrameDeleted(this); 197 delegate_->RenderFrameDeleted(this);
189 198
190 FrameAccessibility::GetInstance()->OnRenderFrameHostDestroyed(this); 199 FrameAccessibility::GetInstance()->OnRenderFrameHostDestroyed(this);
191 200
192 // If this was swapped out, it already decremented the active frame count of 201 // If this was swapped out, it already decremented the active frame count of
193 // the SiteInstance it belongs to. 202 // the SiteInstance it belongs to.
194 if (IsRFHStateActive(rfh_state_)) 203 if (IsRFHStateActive(rfh_state_))
195 GetSiteInstance()->decrement_active_frame_count(); 204 GetSiteInstance()->decrement_active_frame_count();
196 205
197 // Notify the FrameTree that this RFH is going away, allowing it to shut down
198 // the corresponding RenderViewHost if it is no longer needed.
199 frame_tree_->UnregisterRenderFrameHost(this);
200
201 // NULL out the swapout timer; in crash dumps this member will be null only if 206 // NULL out the swapout timer; in crash dumps this member will be null only if
202 // the dtor has run. 207 // the dtor has run.
203 swapout_event_monitor_timeout_.reset(); 208 swapout_event_monitor_timeout_.reset();
204 209
205 for (const auto& iter: flush_visual_state_callbacks_) { 210 for (const auto& iter: flush_visual_state_callbacks_) {
206 iter.second.Run(false); 211 iter.second.Run(false);
207 } 212 }
208 213
209 if (render_widget_host_) 214 if (render_widget_host_)
210 render_widget_host_->Cleanup(); 215 render_widget_host_->Cleanup();
216
217 LOG(ERROR) << "RFH[" << this << "]::~RFH: ";
211 } 218 }
212 219
213 int RenderFrameHostImpl::GetRoutingID() { 220 int RenderFrameHostImpl::GetRoutingID() {
214 return routing_id_; 221 return routing_id_;
215 } 222 }
216 223
217 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { 224 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() {
218 return site_instance_.get(); 225 return site_instance_.get();
219 } 226 }
220 227
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 if (msg.is_sync()) { 324 if (msg.is_sync()) {
318 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); 325 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg);
319 reply->set_reply_error(); 326 reply->set_reply_error();
320 Send(reply); 327 Send(reply);
321 } 328 }
322 // Don't continue looking for someone to handle it. 329 // Don't continue looking for someone to handle it.
323 return true; 330 return true;
324 } 331 }
325 } 332 }
326 333
334
327 if (delegate_->OnMessageReceived(this, msg)) 335 if (delegate_->OnMessageReceived(this, msg))
328 return true; 336 return true;
329 337
330 RenderFrameProxyHost* proxy = 338 RenderFrameProxyHost* proxy =
331 frame_tree_node_->render_manager()->GetProxyToParent(); 339 frame_tree_node_->render_manager()->GetProxyToParent();
332 if (proxy && proxy->cross_process_frame_connector() && 340 if (proxy && proxy->cross_process_frame_connector() &&
333 proxy->cross_process_frame_connector()->OnMessageReceived(msg)) 341 proxy->cross_process_frame_connector()->OnMessageReceived(msg))
334 return true; 342 return true;
335 343
336 bool handled = true; 344 bool handled = true;
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 widget_params.surface_id = render_widget_host_->surface_id(); 576 widget_params.surface_id = render_widget_host_->surface_id();
569 widget_params.hidden = render_widget_host_->is_hidden(); 577 widget_params.hidden = render_widget_host_->is_hidden();
570 } else { 578 } else {
571 // MSG_ROUTING_NONE will prevent a new RenderWidget from being created in 579 // MSG_ROUTING_NONE will prevent a new RenderWidget from being created in
572 // the renderer process. 580 // the renderer process.
573 widget_params.routing_id = MSG_ROUTING_NONE; 581 widget_params.routing_id = MSG_ROUTING_NONE;
574 widget_params.surface_id = 0; 582 widget_params.surface_id = 0;
575 widget_params.hidden = true; 583 widget_params.hidden = true;
576 } 584 }
577 585
586 LOG(ERROR) << "RFH[" << this << "]::CreateRenderFrame:"
587 << " sending IPC to create RenderFrame";
588
578 Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id, proxy_routing_id, 589 Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id, proxy_routing_id,
579 frame_tree_node()->current_replication_state(), 590 frame_tree_node()->current_replication_state(),
580 widget_params)); 591 widget_params));
581 592
582 // The RenderWidgetHost takes ownership of its view. It is tied to the 593 // The RenderWidgetHost takes ownership of its view. It is tied to the
583 // lifetime of the current RenderProcessHost for this RenderFrameHost. 594 // lifetime of the current RenderProcessHost for this RenderFrameHost.
584 if (render_widget_host_) { 595 if (render_widget_host_) {
585 RenderWidgetHostView* rwhv = 596 RenderWidgetHostView* rwhv =
586 new RenderWidgetHostViewChildFrame(render_widget_host_.get()); 597 new RenderWidgetHostViewChildFrame(render_widget_host_.get());
587 rwhv->Hide(); 598 rwhv->Hide();
(...skipping 24 matching lines...) Expand all
612 render_view_host_->IsRenderViewLive() : 623 render_view_host_->IsRenderViewLive() :
613 GetProcess()->HasConnection() && render_frame_created_; 624 GetProcess()->HasConnection() && render_frame_created_;
614 625
615 // Sanity check: the RenderView should always be live if the RenderFrame is. 626 // Sanity check: the RenderView should always be live if the RenderFrame is.
616 DCHECK(!is_live || render_view_host_->IsRenderViewLive()); 627 DCHECK(!is_live || render_view_host_->IsRenderViewLive());
617 628
618 return is_live; 629 return is_live;
619 } 630 }
620 631
621 void RenderFrameHostImpl::SetRenderFrameCreated(bool created) { 632 void RenderFrameHostImpl::SetRenderFrameCreated(bool created) {
633 // If the current status is different than the new status, the delegate
634 // needs to be notified.
635 LOG(ERROR) << "RFH[" << this << "]::SetRenderFrameCreated: "
636 << " render_frame_created_:" << render_frame_created_
637 << " created:" << created;
638
639 if (delegate_ && created ^ render_frame_created_) {
640 if (created)
641 delegate_->RenderFrameCreated(this);
642 else
643 delegate_->RenderFrameDeleted(this);
644 }
645
622 render_frame_created_ = created; 646 render_frame_created_ = created;
623 if (created && render_widget_host_) 647 if (created && render_widget_host_)
624 render_widget_host_->InitForFrame(); 648 render_widget_host_->InitForFrame();
625 } 649 }
626 650
627 void RenderFrameHostImpl::Init() { 651 void RenderFrameHostImpl::Init() {
628 GetProcess()->ResumeRequestsForView(routing_id_); 652 GetProcess()->ResumeRequestsForView(routing_id_);
629 } 653 }
630 654
631 void RenderFrameHostImpl::OnAddMessageToConsole( 655 void RenderFrameHostImpl::OnAddMessageToConsole(
(...skipping 19 matching lines...) Expand all
651 void RenderFrameHostImpl::OnCreateChildFrame(int new_routing_id, 675 void RenderFrameHostImpl::OnCreateChildFrame(int new_routing_id,
652 const std::string& frame_name, 676 const std::string& frame_name,
653 SandboxFlags sandbox_flags) { 677 SandboxFlags sandbox_flags) {
654 // It is possible that while a new RenderFrameHost was committed, the 678 // It is possible that while a new RenderFrameHost was committed, the
655 // RenderFrame corresponding to this host sent an IPC message to create a 679 // RenderFrame corresponding to this host sent an IPC message to create a
656 // frame and it is delivered after this host is swapped out. 680 // frame and it is delivered after this host is swapped out.
657 // Ignore such messages, as we know this RenderFrameHost is going away. 681 // Ignore such messages, as we know this RenderFrameHost is going away.
658 if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT) 682 if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT)
659 return; 683 return;
660 684
685 LOG(ERROR) << "RFH[" << this << "]::OnCreateChildFrame: "
686 << " new frame: ("
687 << GetProcess()->GetID() << ", " << new_routing_id
688 << ")";
689
661 RenderFrameHostImpl* new_frame = frame_tree_->AddFrame( 690 RenderFrameHostImpl* new_frame = frame_tree_->AddFrame(
662 frame_tree_node_, GetProcess()->GetID(), new_routing_id, frame_name); 691 frame_tree_node_, GetProcess()->GetID(), new_routing_id, frame_name);
663 if (!new_frame) 692 if (!new_frame)
664 return; 693 return;
665 694
695 new_frame->frame_tree_node()->set_sandbox_flags(sandbox_flags);
696
666 // We know that the RenderFrame has been created in this case, immediately 697 // We know that the RenderFrame has been created in this case, immediately
667 // after the CreateChildFrame IPC was sent. 698 // after the CreateChildFrame IPC was sent.
668 new_frame->SetRenderFrameCreated(true); 699 new_frame->SetRenderFrameCreated(true);
669
670 new_frame->frame_tree_node()->set_sandbox_flags(sandbox_flags);
671
672 if (delegate_)
673 delegate_->RenderFrameCreated(new_frame);
674 } 700 }
675 701
676 void RenderFrameHostImpl::OnDetach() { 702 void RenderFrameHostImpl::OnDetach() {
677 frame_tree_->RemoveFrame(frame_tree_node_); 703 frame_tree_->RemoveFrame(frame_tree_node_);
678 } 704 }
679 705
680 void RenderFrameHostImpl::OnFrameFocused() { 706 void RenderFrameHostImpl::OnFrameFocused() {
681 frame_tree_->SetFocusedFrame(frame_tree_node_); 707 frame_tree_->SetFocusedFrame(frame_tree_node_);
682 } 708 }
683 709
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
1029 bool RenderFrameHostImpl::SuddenTerminationAllowed() const { 1055 bool RenderFrameHostImpl::SuddenTerminationAllowed() const {
1030 return override_sudden_termination_status_ || 1056 return override_sudden_termination_status_ ||
1031 (!has_beforeunload_handlers_ && !has_unload_handlers_); 1057 (!has_beforeunload_handlers_ && !has_unload_handlers_);
1032 } 1058 }
1033 1059
1034 void RenderFrameHostImpl::OnSwapOutACK() { 1060 void RenderFrameHostImpl::OnSwapOutACK() {
1035 OnSwappedOut(); 1061 OnSwappedOut();
1036 } 1062 }
1037 1063
1038 void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) { 1064 void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) {
1065 LOG(ERROR) << "RFH[" << this << "]::OnRenderProcessGone: "
1066 << " main_frame:" << frame_tree_node_->IsMainFrame()
1067 << " created:" << render_frame_created_;
1068
1039 if (frame_tree_node_->IsMainFrame()) { 1069 if (frame_tree_node_->IsMainFrame()) {
1040 // Keep the termination status so we can get at it later when we 1070 // Keep the termination status so we can get at it later when we
1041 // need to know why it died. 1071 // need to know why it died.
1042 render_view_host_->render_view_termination_status_ = 1072 render_view_host_->render_view_termination_status_ =
1043 static_cast<base::TerminationStatus>(status); 1073 static_cast<base::TerminationStatus>(status);
1044 } 1074 }
1045 1075
1046 SetRenderFrameCreated(false);
1047 InvalidateMojoConnection();
1048
1049 // Reset frame tree state associated with this process. This must happen 1076 // Reset frame tree state associated with this process. This must happen
1050 // before RenderViewTerminated because observers expect the subframes of any 1077 // before RenderViewTerminated because observers expect the subframes of any
1051 // affected frames to be cleared first. 1078 // affected frames to be cleared first.
1052 // Note: When a RenderFrameHost is swapped out there is a different one 1079 // Note: When a RenderFrameHost is swapped out there is a different one
1053 // which is the current host. In this case, the FrameTreeNode state must 1080 // which is the current host. In this case, the FrameTreeNode state must
1054 // not be reset. 1081 // not be reset.
1055 if (!is_swapped_out()) 1082 if (!is_swapped_out())
1056 frame_tree_node_->ResetForNewProcess(); 1083 frame_tree_node_->ResetForNewProcess();
1057 1084
1085 SetRenderFrameCreated(false);
1086 InvalidateMojoConnection();
1087
1058 if (frame_tree_node_->IsMainFrame()) { 1088 if (frame_tree_node_->IsMainFrame()) {
1059 // RenderViewHost/RenderWidgetHost needs to reset some stuff. 1089 // RenderViewHost/RenderWidgetHost needs to reset some stuff.
1060 render_view_host_->RendererExited( 1090 render_view_host_->RendererExited(
1061 render_view_host_->render_view_termination_status_, exit_code); 1091 render_view_host_->render_view_termination_status_, exit_code);
1062 1092
1063 render_view_host_->delegate_->RenderViewTerminated( 1093 render_view_host_->delegate_->RenderViewTerminated(
1064 render_view_host_, static_cast<base::TerminationStatus>(status), 1094 render_view_host_, static_cast<base::TerminationStatus>(status),
1065 exit_code); 1095 exit_code);
1066 } 1096 }
1067 } 1097 }
(...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after
1879 void RenderFrameHostImpl::DidUseGeolocationPermission() { 1909 void RenderFrameHostImpl::DidUseGeolocationPermission() {
1880 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame(); 1910 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame();
1881 GetContentClient()->browser()->RegisterPermissionUsage( 1911 GetContentClient()->browser()->RegisterPermissionUsage(
1882 PERMISSION_GEOLOCATION, 1912 PERMISSION_GEOLOCATION,
1883 delegate_->GetAsWebContents(), 1913 delegate_->GetAsWebContents(),
1884 GetLastCommittedURL().GetOrigin(), 1914 GetLastCommittedURL().GetOrigin(),
1885 top_frame->GetLastCommittedURL().GetOrigin()); 1915 top_frame->GetLastCommittedURL().GetOrigin());
1886 } 1916 }
1887 1917
1888 } // namespace content 1918 } // namespace content
OLDNEW
« 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