OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |