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 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 rwh_delegate, GetProcess(), MSG_ROUTING_NONE, hidden)); | 177 rwh_delegate, GetProcess(), MSG_ROUTING_NONE, hidden)); |
178 render_widget_host_->set_owned_by_render_frame_host(true); | 178 render_widget_host_->set_owned_by_render_frame_host(true); |
179 } | 179 } |
180 } | 180 } |
181 | 181 |
182 RenderFrameHostImpl::~RenderFrameHostImpl() { | 182 RenderFrameHostImpl::~RenderFrameHostImpl() { |
183 GetProcess()->RemoveRoute(routing_id_); | 183 GetProcess()->RemoveRoute(routing_id_); |
184 g_routing_id_frame_map.Get().erase( | 184 g_routing_id_frame_map.Get().erase( |
185 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); | 185 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); |
186 | 186 |
187 if (delegate_) | 187 if (delegate_ && render_frame_created_) |
188 delegate_->RenderFrameDeleted(this); | 188 delegate_->RenderFrameDeleted(this); |
189 | 189 |
190 FrameAccessibility::GetInstance()->OnRenderFrameHostDestroyed(this); | 190 FrameAccessibility::GetInstance()->OnRenderFrameHostDestroyed(this); |
191 | 191 |
192 // If this was swapped out, it already decremented the active frame count of | 192 // If this was swapped out, it already decremented the active frame count of |
193 // the SiteInstance it belongs to. | 193 // the SiteInstance it belongs to. |
194 if (IsRFHStateActive(rfh_state_)) | 194 if (IsRFHStateActive(rfh_state_)) |
195 GetSiteInstance()->decrement_active_frame_count(); | 195 GetSiteInstance()->decrement_active_frame_count(); |
196 | 196 |
197 // Notify the FrameTree that this RFH is going away, allowing it to shut down | 197 // Notify the FrameTree that this RFH is going away, allowing it to shut down |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 render_view_host_->IsRenderViewLive() : | 612 render_view_host_->IsRenderViewLive() : |
613 GetProcess()->HasConnection() && render_frame_created_; | 613 GetProcess()->HasConnection() && render_frame_created_; |
614 | 614 |
615 // Sanity check: the RenderView should always be live if the RenderFrame is. | 615 // Sanity check: the RenderView should always be live if the RenderFrame is. |
616 DCHECK(!is_live || render_view_host_->IsRenderViewLive()); | 616 DCHECK(!is_live || render_view_host_->IsRenderViewLive()); |
617 | 617 |
618 return is_live; | 618 return is_live; |
619 } | 619 } |
620 | 620 |
621 void RenderFrameHostImpl::SetRenderFrameCreated(bool created) { | 621 void RenderFrameHostImpl::SetRenderFrameCreated(bool created) { |
| 622 // If the current status is different than the new status, the delegate |
| 623 // needs to be notified. |
| 624 if (delegate_ && (created != render_frame_created_)) { |
| 625 if (created) |
| 626 delegate_->RenderFrameCreated(this); |
| 627 else |
| 628 delegate_->RenderFrameDeleted(this); |
| 629 } |
| 630 |
622 render_frame_created_ = created; | 631 render_frame_created_ = created; |
623 if (created && render_widget_host_) | 632 if (created && render_widget_host_) |
624 render_widget_host_->InitForFrame(); | 633 render_widget_host_->InitForFrame(); |
625 } | 634 } |
626 | 635 |
627 void RenderFrameHostImpl::Init() { | 636 void RenderFrameHostImpl::Init() { |
628 GetProcess()->ResumeRequestsForView(routing_id_); | 637 GetProcess()->ResumeRequestsForView(routing_id_); |
629 } | 638 } |
630 | 639 |
631 void RenderFrameHostImpl::OnAddMessageToConsole( | 640 void RenderFrameHostImpl::OnAddMessageToConsole( |
(...skipping 30 matching lines...) Expand all Loading... |
662 // frame and it is delivered after this host is swapped out. | 671 // frame and it is delivered after this host is swapped out. |
663 // Ignore such messages, as we know this RenderFrameHost is going away. | 672 // Ignore such messages, as we know this RenderFrameHost is going away. |
664 if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT) | 673 if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT) |
665 return; | 674 return; |
666 | 675 |
667 RenderFrameHostImpl* new_frame = frame_tree_->AddFrame( | 676 RenderFrameHostImpl* new_frame = frame_tree_->AddFrame( |
668 frame_tree_node_, GetProcess()->GetID(), new_routing_id, frame_name); | 677 frame_tree_node_, GetProcess()->GetID(), new_routing_id, frame_name); |
669 if (!new_frame) | 678 if (!new_frame) |
670 return; | 679 return; |
671 | 680 |
| 681 new_frame->frame_tree_node()->set_sandbox_flags(sandbox_flags); |
| 682 |
672 // We know that the RenderFrame has been created in this case, immediately | 683 // We know that the RenderFrame has been created in this case, immediately |
673 // after the CreateChildFrame IPC was sent. | 684 // after the CreateChildFrame IPC was sent. |
674 new_frame->SetRenderFrameCreated(true); | 685 new_frame->SetRenderFrameCreated(true); |
675 | |
676 new_frame->frame_tree_node()->set_sandbox_flags(sandbox_flags); | |
677 | |
678 if (delegate_) | |
679 delegate_->RenderFrameCreated(new_frame); | |
680 } | 686 } |
681 | 687 |
682 void RenderFrameHostImpl::OnDetach() { | 688 void RenderFrameHostImpl::OnDetach() { |
683 frame_tree_->RemoveFrame(frame_tree_node_); | 689 frame_tree_->RemoveFrame(frame_tree_node_); |
684 } | 690 } |
685 | 691 |
686 void RenderFrameHostImpl::OnFrameFocused() { | 692 void RenderFrameHostImpl::OnFrameFocused() { |
687 frame_tree_->SetFocusedFrame(frame_tree_node_); | 693 frame_tree_->SetFocusedFrame(frame_tree_node_); |
688 } | 694 } |
689 | 695 |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1042 } | 1048 } |
1043 | 1049 |
1044 void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) { | 1050 void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) { |
1045 if (frame_tree_node_->IsMainFrame()) { | 1051 if (frame_tree_node_->IsMainFrame()) { |
1046 // Keep the termination status so we can get at it later when we | 1052 // Keep the termination status so we can get at it later when we |
1047 // need to know why it died. | 1053 // need to know why it died. |
1048 render_view_host_->render_view_termination_status_ = | 1054 render_view_host_->render_view_termination_status_ = |
1049 static_cast<base::TerminationStatus>(status); | 1055 static_cast<base::TerminationStatus>(status); |
1050 } | 1056 } |
1051 | 1057 |
1052 SetRenderFrameCreated(false); | |
1053 InvalidateMojoConnection(); | |
1054 | |
1055 // Reset frame tree state associated with this process. This must happen | 1058 // Reset frame tree state associated with this process. This must happen |
1056 // before RenderViewTerminated because observers expect the subframes of any | 1059 // before RenderViewTerminated because observers expect the subframes of any |
1057 // affected frames to be cleared first. | 1060 // affected frames to be cleared first. |
1058 // Note: When a RenderFrameHost is swapped out there is a different one | 1061 // Note: When a RenderFrameHost is swapped out there is a different one |
1059 // which is the current host. In this case, the FrameTreeNode state must | 1062 // which is the current host. In this case, the FrameTreeNode state must |
1060 // not be reset. | 1063 // not be reset. |
1061 if (!is_swapped_out()) | 1064 if (!is_swapped_out()) |
1062 frame_tree_node_->ResetForNewProcess(); | 1065 frame_tree_node_->ResetForNewProcess(); |
1063 | 1066 |
| 1067 // Reset state for the current RenderFrameHost once the FrameTreeNode has been |
| 1068 // reset. |
| 1069 SetRenderFrameCreated(false); |
| 1070 InvalidateMojoConnection(); |
| 1071 |
1064 if (frame_tree_node_->IsMainFrame()) { | 1072 if (frame_tree_node_->IsMainFrame()) { |
1065 // RenderViewHost/RenderWidgetHost needs to reset some stuff. | 1073 // RenderViewHost/RenderWidgetHost needs to reset some stuff. |
1066 render_view_host_->RendererExited( | 1074 render_view_host_->RendererExited( |
1067 render_view_host_->render_view_termination_status_, exit_code); | 1075 render_view_host_->render_view_termination_status_, exit_code); |
1068 | 1076 |
1069 render_view_host_->delegate_->RenderViewTerminated( | 1077 render_view_host_->delegate_->RenderViewTerminated( |
1070 render_view_host_, static_cast<base::TerminationStatus>(status), | 1078 render_view_host_, static_cast<base::TerminationStatus>(status), |
1071 exit_code); | 1079 exit_code); |
1072 } | 1080 } |
1073 } | 1081 } |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1886 void RenderFrameHostImpl::DidUseGeolocationPermission() { | 1894 void RenderFrameHostImpl::DidUseGeolocationPermission() { |
1887 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame(); | 1895 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame(); |
1888 GetContentClient()->browser()->RegisterPermissionUsage( | 1896 GetContentClient()->browser()->RegisterPermissionUsage( |
1889 PERMISSION_GEOLOCATION, | 1897 PERMISSION_GEOLOCATION, |
1890 delegate_->GetAsWebContents(), | 1898 delegate_->GetAsWebContents(), |
1891 GetLastCommittedURL().GetOrigin(), | 1899 GetLastCommittedURL().GetOrigin(), |
1892 top_frame->GetLastCommittedURL().GetOrigin()); | 1900 top_frame->GetLastCommittedURL().GetOrigin()); |
1893 } | 1901 } |
1894 | 1902 |
1895 } // namespace content | 1903 } // namespace content |
OLD | NEW |