| 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/logging.h" | 10 #include "base/logging.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 Delegate* delegate) | 57 Delegate* delegate) |
| 58 : frame_tree_node_(frame_tree_node), | 58 : frame_tree_node_(frame_tree_node), |
| 59 delegate_(delegate), | 59 delegate_(delegate), |
| 60 cross_navigation_pending_(false), | 60 cross_navigation_pending_(false), |
| 61 render_frame_delegate_(render_frame_delegate), | 61 render_frame_delegate_(render_frame_delegate), |
| 62 render_view_delegate_(render_view_delegate), | 62 render_view_delegate_(render_view_delegate), |
| 63 render_widget_delegate_(render_widget_delegate), | 63 render_widget_delegate_(render_widget_delegate), |
| 64 interstitial_page_(nullptr), | 64 interstitial_page_(nullptr), |
| 65 should_reuse_web_ui_(false), | 65 should_reuse_web_ui_(false), |
| 66 weak_factory_(this) { | 66 weak_factory_(this) { |
| 67 LOG(ERROR) << "RFHM[" << this << "]::RFHM"; |
| 67 DCHECK(frame_tree_node_); | 68 DCHECK(frame_tree_node_); |
| 68 } | 69 } |
| 69 | 70 |
| 70 RenderFrameHostManager::~RenderFrameHostManager() { | 71 RenderFrameHostManager::~RenderFrameHostManager() { |
| 71 if (pending_render_frame_host_) | 72 if (pending_render_frame_host_) |
| 72 UnsetPendingRenderFrameHost(); | 73 UnsetPendingRenderFrameHost(); |
| 73 | 74 |
| 74 if (speculative_render_frame_host_) | 75 if (speculative_render_frame_host_) |
| 75 UnsetSpeculativeRenderFrameHost(); | 76 UnsetSpeculativeRenderFrameHost(); |
| 76 | 77 |
| 77 if (render_frame_host_ && | 78 if (render_frame_host_ && |
| 78 render_frame_host_->GetSiteInstance()->active_frame_count() <= 1U) { | 79 render_frame_host_->GetSiteInstance()->active_frame_count() <= 1U) { |
| 79 ShutdownRenderFrameProxyHostsInSiteInstance( | 80 ShutdownRenderFrameProxyHostsInSiteInstance( |
| 80 render_frame_host_->GetSiteInstance()->GetId()); | 81 render_frame_host_->GetSiteInstance()->GetId()); |
| 81 } | 82 } |
| 82 | 83 |
| 83 // Delete any RenderFrameProxyHosts and swapped out RenderFrameHosts. | 84 // Delete any RenderFrameProxyHosts and swapped out RenderFrameHosts. |
| 84 // It is important to delete those prior to deleting the current | 85 // It is important to delete those prior to deleting the current |
| 85 // RenderFrameHost, since the CrossProcessFrameConnector (owned by | 86 // RenderFrameHost, since the CrossProcessFrameConnector (owned by |
| 86 // RenderFrameProxyHost) points to the RenderWidgetHostView associated with | 87 // RenderFrameProxyHost) points to the RenderWidgetHostView associated with |
| 87 // the current RenderFrameHost and uses it during its destructor. | 88 // the current RenderFrameHost and uses it during its destructor. |
| 88 STLDeleteValues(&proxy_hosts_); | 89 STLDeleteValues(&proxy_hosts_); |
| 89 | 90 |
| 90 // We should always have a current RenderFrameHost except in some tests. | 91 // We should always have a current RenderFrameHost except in some tests. |
| 91 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); | 92 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); |
| 93 |
| 94 LOG(ERROR) << "RFHM[" << this << "]::~RFHM"; |
| 92 } | 95 } |
| 93 | 96 |
| 94 void RenderFrameHostManager::Init(BrowserContext* browser_context, | 97 void RenderFrameHostManager::Init(BrowserContext* browser_context, |
| 95 SiteInstance* site_instance, | 98 SiteInstance* site_instance, |
| 96 int view_routing_id, | 99 int view_routing_id, |
| 97 int frame_routing_id) { | 100 int frame_routing_id) { |
| 101 LOG(ERROR) << "RFHM[" << this << "]::Init"; |
| 102 |
| 98 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It | 103 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It |
| 99 // is important to immediately give this SiteInstance to a RenderViewHost so | 104 // is important to immediately give this SiteInstance to a RenderViewHost so |
| 100 // that the SiteInstance is ref counted. | 105 // that the SiteInstance is ref counted. |
| 101 if (!site_instance) | 106 if (!site_instance) |
| 102 site_instance = SiteInstance::Create(browser_context); | 107 site_instance = SiteInstance::Create(browser_context); |
| 103 | 108 |
| 104 int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0; | 109 int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0; |
| 105 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, | 110 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, |
| 106 frame_routing_id, flags)); | 111 frame_routing_id, flags)); |
| 107 | 112 |
| 113 if (!frame_tree_node_->IsMainFrame()) { |
| 114 delegate_->NotifySwappedFromRenderManager( |
| 115 nullptr, render_frame_host_.get(), false); |
| 116 } |
| 117 |
| 108 // Keep track of renderer processes as they start to shut down or are | 118 // Keep track of renderer processes as they start to shut down or are |
| 109 // crashed/killed. | 119 // crashed/killed. |
| 110 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, | 120 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, |
| 111 NotificationService::AllSources()); | 121 NotificationService::AllSources()); |
| 112 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, | 122 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, |
| 113 NotificationService::AllSources()); | 123 NotificationService::AllSources()); |
| 114 } | 124 } |
| 115 | 125 |
| 116 RenderViewHostImpl* RenderFrameHostManager::current_host() const { | 126 RenderViewHostImpl* RenderFrameHostManager::current_host() const { |
| 117 if (!render_frame_host_) | 127 if (!render_frame_host_) |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 RecordAction(base::UserMetricsAction("ProcessSwapBindingsMismatch_RVHM")); | 177 RecordAction(base::UserMetricsAction("ProcessSwapBindingsMismatch_RVHM")); |
| 168 return nullptr; | 178 return nullptr; |
| 169 } | 179 } |
| 170 return new_web_ui.Pass(); | 180 return new_web_ui.Pass(); |
| 171 } | 181 } |
| 172 | 182 |
| 173 RenderFrameHostImpl* RenderFrameHostManager::Navigate( | 183 RenderFrameHostImpl* RenderFrameHostManager::Navigate( |
| 174 const NavigationEntryImpl& entry) { | 184 const NavigationEntryImpl& entry) { |
| 175 TRACE_EVENT1("navigation", "RenderFrameHostManager:Navigate", | 185 TRACE_EVENT1("navigation", "RenderFrameHostManager:Navigate", |
| 176 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); | 186 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
| 187 LOG(ERROR) << "RFHM[" << this << "]::Navigate: " |
| 188 << entry.GetURL(); |
| 189 |
| 177 // Create a pending RenderFrameHost to use for the navigation. | 190 // Create a pending RenderFrameHost to use for the navigation. |
| 178 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate( | 191 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate( |
| 179 entry.GetURL(), entry.source_site_instance(), entry.site_instance(), | 192 entry.GetURL(), entry.source_site_instance(), entry.site_instance(), |
| 180 entry.GetTransitionType(), | 193 entry.GetTransitionType(), |
| 181 entry.restore_type() != NavigationEntryImpl::RESTORE_NONE, | 194 entry.restore_type() != NavigationEntryImpl::RESTORE_NONE, |
| 182 entry.IsViewSourceMode(), entry.transferred_global_request_id(), | 195 entry.IsViewSourceMode(), entry.transferred_global_request_id(), |
| 183 entry.bindings()); | 196 entry.bindings()); |
| 184 if (!dest_render_frame_host) | 197 if (!dest_render_frame_host) |
| 185 return NULL; // We weren't able to create a pending render frame host. | 198 return NULL; // We weren't able to create a pending render frame host. |
| 186 | 199 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 216 MSG_ROUTING_NONE, | 229 MSG_ROUTING_NONE, |
| 217 frame_tree_node_->IsMainFrame())) | 230 frame_tree_node_->IsMainFrame())) |
| 218 return NULL; | 231 return NULL; |
| 219 | 232 |
| 220 // Now that we've created a new renderer, be sure to hide it if it isn't | 233 // Now that we've created a new renderer, be sure to hide it if it isn't |
| 221 // our primary one. Otherwise, we might crash if we try to call Show() | 234 // our primary one. Otherwise, we might crash if we try to call Show() |
| 222 // on it later. | 235 // on it later. |
| 223 if (dest_render_frame_host != render_frame_host_ && | 236 if (dest_render_frame_host != render_frame_host_ && |
| 224 dest_render_frame_host->GetView()) { | 237 dest_render_frame_host->GetView()) { |
| 225 dest_render_frame_host->GetView()->Hide(); | 238 dest_render_frame_host->GetView()->Hide(); |
| 226 } else { | |
| 227 // Notify here as we won't be calling CommitPending (which does the | |
| 228 // notify). | |
| 229 delegate_->NotifySwappedFromRenderManager( | |
| 230 NULL, render_frame_host_.get(), frame_tree_node_->IsMainFrame()); | |
| 231 } | 239 } |
| 232 } | 240 } |
| 233 | 241 |
| 234 // If entry includes the request ID of a request that is being transferred, | 242 // If entry includes the request ID of a request that is being transferred, |
| 235 // the destination render frame will take ownership, so release ownership of | 243 // the destination render frame will take ownership, so release ownership of |
| 236 // the request. | 244 // the request. |
| 237 if (cross_site_transferring_request_.get() && | 245 if (cross_site_transferring_request_.get() && |
| 238 cross_site_transferring_request_->request_id() == | 246 cross_site_transferring_request_->request_id() == |
| 239 entry.transferred_global_request_id()) { | 247 entry.transferred_global_request_id()) { |
| 240 cross_site_transferring_request_->ReleaseRequest(); | 248 cross_site_transferring_request_->ReleaseRequest(); |
| (...skipping 1073 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1314 } | 1322 } |
| 1315 return true; | 1323 return true; |
| 1316 } | 1324 } |
| 1317 | 1325 |
| 1318 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( | 1326 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
| 1319 SiteInstance* instance, | 1327 SiteInstance* instance, |
| 1320 WebUIImpl* web_ui, | 1328 WebUIImpl* web_ui, |
| 1321 int opener_route_id, | 1329 int opener_route_id, |
| 1322 int flags, | 1330 int flags, |
| 1323 int* view_routing_id_ptr) { | 1331 int* view_routing_id_ptr) { |
| 1332 LOG(ERROR) << "RFHM[" << this << "]::CreateRenderFrame:"; |
| 1333 |
| 1324 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); | 1334 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
| 1325 CHECK(instance); | 1335 CHECK(instance); |
| 1326 // Swapped out views should always be hidden. | 1336 // Swapped out views should always be hidden. |
| 1327 DCHECK(!swapped_out || (flags & CREATE_RF_HIDDEN)); | 1337 DCHECK(!swapped_out || (flags & CREATE_RF_HIDDEN)); |
| 1328 | 1338 |
| 1329 // TODO(nasko): Remove the following CHECK once cross-site navigation no | 1339 // TODO(nasko): Remove the following CHECK once cross-site navigation no |
| 1330 // longer relies on swapped out RFH for the top-level frame. | 1340 // longer relies on swapped out RFH for the top-level frame. |
| 1331 if (!frame_tree_node_->IsMainFrame()) | 1341 if (!frame_tree_node_->IsMainFrame()) |
| 1332 CHECK(!swapped_out); | 1342 CHECK(!swapped_out); |
| 1333 | 1343 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1404 } else if (!swapped_out) { | 1414 } else if (!swapped_out) { |
| 1405 // Init the RFH, so a RenderFrame is created in the renderer. | 1415 // Init the RFH, so a RenderFrame is created in the renderer. |
| 1406 DCHECK(new_render_frame_host.get()); | 1416 DCHECK(new_render_frame_host.get()); |
| 1407 success = InitRenderFrame(new_render_frame_host.get()); | 1417 success = InitRenderFrame(new_render_frame_host.get()); |
| 1408 } | 1418 } |
| 1409 } | 1419 } |
| 1410 | 1420 |
| 1411 if (success) { | 1421 if (success) { |
| 1412 if (view_routing_id_ptr) | 1422 if (view_routing_id_ptr) |
| 1413 *view_routing_id_ptr = render_view_host->GetRoutingID(); | 1423 *view_routing_id_ptr = render_view_host->GetRoutingID(); |
| 1414 | |
| 1415 // A brand new RenderFrame was created by one of the Init calls above. | |
| 1416 // Announce it to observers. | |
| 1417 if (swapped_out) | |
| 1418 render_frame_delegate_->RenderFrameCreated(proxy->render_frame_host()); | |
| 1419 else | |
| 1420 render_frame_delegate_->RenderFrameCreated(new_render_frame_host.get()); | |
| 1421 } | 1424 } |
| 1422 } | 1425 } |
| 1423 | 1426 |
| 1424 // Returns the new RFH if it isn't swapped out. | 1427 // Returns the new RFH if it isn't swapped out. |
| 1425 if (success && !swapped_out) { | 1428 if (success && !swapped_out) { |
| 1426 DCHECK(new_render_frame_host->GetSiteInstance() == instance); | 1429 DCHECK(new_render_frame_host->GetSiteInstance() == instance); |
| 1427 return new_render_frame_host.Pass(); | 1430 return new_render_frame_host.Pass(); |
| 1428 } | 1431 } |
| 1429 return nullptr; | 1432 return nullptr; |
| 1430 } | 1433 } |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1953 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 1956 void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
| 1954 SiteInstance* instance) { | 1957 SiteInstance* instance) { |
| 1955 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 1958 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); |
| 1956 if (iter != proxy_hosts_.end()) { | 1959 if (iter != proxy_hosts_.end()) { |
| 1957 delete iter->second; | 1960 delete iter->second; |
| 1958 proxy_hosts_.erase(iter); | 1961 proxy_hosts_.erase(iter); |
| 1959 } | 1962 } |
| 1960 } | 1963 } |
| 1961 | 1964 |
| 1962 } // namespace content | 1965 } // namespace content |
| OLD | NEW |