| 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 |