Chromium Code Reviews| 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_manager.h" | 5 #include "content/browser/frame_host/render_frame_host_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 114 delegate_->IsHidden()); | 114 delegate_->IsHidden()); |
| 115 | 115 |
| 116 // Keep track of renderer processes as they start to shut down or are | 116 // Keep track of renderer processes as they start to shut down or are |
| 117 // crashed/killed. | 117 // crashed/killed. |
| 118 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, | 118 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, |
| 119 NotificationService::AllSources()); | 119 NotificationService::AllSources()); |
| 120 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, | 120 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, |
| 121 NotificationService::AllSources()); | 121 NotificationService::AllSources()); |
| 122 } | 122 } |
| 123 | 123 |
| 124 void RenderFrameHostManager::ShutdownRenderFrameHostsInSiteInstance( | |
| 125 int32 site_instance_id) { | |
| 126 // Use the safe RenderWidgetHost iterator for now to find all RenderViewHosts | |
| 127 // in the SiteInstance, then tell their respective FrameTrees to remove all | |
| 128 // swapped out RenderFrameHosts corresponding to them. | |
| 129 // TODO(creis): Replace this with a RenderFrameHostIterator that protects | |
| 130 // against use-after-frees if a later element is deleted before getting to it. | |
| 131 scoped_ptr<RenderWidgetHostIterator> widgets( | |
| 132 RenderWidgetHostImpl::GetAllRenderWidgetHosts()); | |
| 133 while (RenderWidgetHost* widget = widgets->GetNextHost()) { | |
| 134 if (!widget->IsRenderView()) | |
| 135 continue; | |
| 136 RenderViewHostImpl* rvh = | |
| 137 static_cast<RenderViewHostImpl*>(RenderViewHost::From(widget)); | |
| 138 if (site_instance_id == rvh->GetSiteInstance()->GetId()) { | |
| 139 // This deletes all RenderFrameHosts using the |rvh|, which then causes | |
| 140 // |rvh| to Shutdown. | |
| 141 FrameTree* tree = rvh->GetDelegate()->GetFrameTree(); | |
| 142 tree->ForEach(base::Bind( | |
| 143 &RenderFrameHostManager::ClearSwappedOutRFHsInSiteInstance, | |
| 144 site_instance_id)); | |
| 145 } | |
| 146 } | |
| 147 } | |
| 148 | |
| 124 RenderViewHostImpl* RenderFrameHostManager::current_host() const { | 149 RenderViewHostImpl* RenderFrameHostManager::current_host() const { |
| 125 if (!render_frame_host_) | 150 if (!render_frame_host_) |
| 126 return NULL; | 151 return NULL; |
| 127 return render_frame_host_->render_view_host(); | 152 return render_frame_host_->render_view_host(); |
| 128 } | 153 } |
| 129 | 154 |
| 130 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { | 155 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { |
| 131 if (!pending_render_frame_host_) | 156 if (!pending_render_frame_host_) |
| 132 return NULL; | 157 return NULL; |
| 133 return pending_render_frame_host_->render_view_host(); | 158 return pending_render_frame_host_->render_view_host(); |
| (...skipping 1026 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1160 active_view_count()) { | 1185 active_view_count()) { |
| 1161 ShutdownRenderFrameHostsInSiteInstance(old_site_instance_id); | 1186 ShutdownRenderFrameHostsInSiteInstance(old_site_instance_id); |
| 1162 // This is deleted while cleaning up the SiteInstance's views. | 1187 // This is deleted while cleaning up the SiteInstance's views. |
| 1163 old_render_frame_host = NULL; | 1188 old_render_frame_host = NULL; |
| 1164 } | 1189 } |
| 1165 } else { | 1190 } else { |
| 1166 delete old_render_frame_host; | 1191 delete old_render_frame_host; |
| 1167 } | 1192 } |
| 1168 } | 1193 } |
| 1169 | 1194 |
| 1170 void RenderFrameHostManager::ShutdownRenderFrameHostsInSiteInstance( | |
| 1171 int32 site_instance_id) { | |
| 1172 // First remove any swapped out RFH for this SiteInstance from our own list. | |
| 1173 ClearSwappedOutRFHsInSiteInstance(site_instance_id, frame_tree_node_); | |
|
sadrul
2014/02/21 03:51:17
This line is removed from the static version. From
| |
| 1174 | |
| 1175 // Use the safe RenderWidgetHost iterator for now to find all RenderViewHosts | |
| 1176 // in the SiteInstance, then tell their respective FrameTrees to remove all | |
| 1177 // swapped out RenderFrameHosts corresponding to them. | |
| 1178 // TODO(creis): Replace this with a RenderFrameHostIterator that protects | |
| 1179 // against use-after-frees if a later element is deleted before getting to it. | |
| 1180 scoped_ptr<RenderWidgetHostIterator> widgets( | |
| 1181 RenderWidgetHostImpl::GetAllRenderWidgetHosts()); | |
| 1182 while (RenderWidgetHost* widget = widgets->GetNextHost()) { | |
| 1183 if (!widget->IsRenderView()) | |
| 1184 continue; | |
| 1185 RenderViewHostImpl* rvh = | |
| 1186 static_cast<RenderViewHostImpl*>(RenderViewHost::From(widget)); | |
| 1187 if (site_instance_id == rvh->GetSiteInstance()->GetId()) { | |
| 1188 // This deletes all RenderFrameHosts using the |rvh|, which then causes | |
| 1189 // |rvh| to Shutdown. | |
| 1190 FrameTree* tree = rvh->GetDelegate()->GetFrameTree(); | |
| 1191 tree->ForEach(base::Bind( | |
| 1192 &RenderFrameHostManager::ClearSwappedOutRFHsInSiteInstance, | |
| 1193 site_instance_id)); | |
| 1194 } | |
| 1195 } | |
| 1196 } | |
| 1197 | |
| 1198 RenderFrameHostImpl* RenderFrameHostManager::UpdateRendererStateForNavigate( | 1195 RenderFrameHostImpl* RenderFrameHostManager::UpdateRendererStateForNavigate( |
| 1199 const NavigationEntryImpl& entry) { | 1196 const NavigationEntryImpl& entry) { |
| 1200 // If we are currently navigating cross-process, we want to get back to normal | 1197 // If we are currently navigating cross-process, we want to get back to normal |
| 1201 // and then navigate as usual. | 1198 // and then navigate as usual. |
| 1202 if (cross_navigation_pending_) { | 1199 if (cross_navigation_pending_) { |
| 1203 if (pending_render_frame_host_) | 1200 if (pending_render_frame_host_) |
| 1204 CancelPending(); | 1201 CancelPending(); |
| 1205 cross_navigation_pending_ = false; | 1202 cross_navigation_pending_ = false; |
| 1206 } | 1203 } |
| 1207 | 1204 |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1452 SiteInstance* instance) const { | 1449 SiteInstance* instance) const { |
| 1453 RenderFrameHostMap::const_iterator iter = | 1450 RenderFrameHostMap::const_iterator iter = |
| 1454 swapped_out_hosts_.find(instance->GetId()); | 1451 swapped_out_hosts_.find(instance->GetId()); |
| 1455 if (iter != swapped_out_hosts_.end()) | 1452 if (iter != swapped_out_hosts_.end()) |
| 1456 return iter->second; | 1453 return iter->second; |
| 1457 | 1454 |
| 1458 return NULL; | 1455 return NULL; |
| 1459 } | 1456 } |
| 1460 | 1457 |
| 1461 } // namespace content | 1458 } // namespace content |
| OLD | NEW |