 Chromium Code Reviews
 Chromium Code Reviews Issue 1785153005:
  Remove SiteIsolationPolicy::IsSwappedOutStateForbidden().  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 1785153005:
  Remove SiteIsolationPolicy::IsSwappedOutStateForbidden().  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| Index: content/browser/frame_host/render_frame_host_manager.cc | 
| diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc | 
| index d99018945366b5feda09daea5fd64f3ce9334497..133be5f7b7dfd19110a128781e2da20b77545143 100644 | 
| --- a/content/browser/frame_host/render_frame_host_manager.cc | 
| +++ b/content/browser/frame_host/render_frame_host_manager.cc | 
| @@ -663,20 +663,7 @@ void RenderFrameHostManager::SwapOutOldFrame( | 
| // SwapOut creates a RenderFrameProxy, so set the proxy to be initialized. | 
| proxy->set_render_frame_proxy_created(true); | 
| - if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { | 
| - // In --site-per-process, frames delete their RFH rather than storing it | 
| - // in the proxy. Schedule it for deletion once the SwapOutACK comes in. | 
| - // TODO(creis): This will be the default when we remove swappedout://. | 
| - MoveToPendingDeleteHosts(std::move(old_render_frame_host)); | 
| - } else { | 
| - // We shouldn't get here for subframes, since we only swap subframes when | 
| - // --site-per-process is used. | 
| - DCHECK(frame_tree_node_->IsMainFrame()); | 
| - | 
| - // The old RenderFrameHost will stay alive inside the proxy so that existing | 
| - // JavaScript window references to it stay valid. | 
| - proxy->TakeFrameHostOwnership(std::move(old_render_frame_host)); | 
| - } | 
| + MoveToPendingDeleteHosts(std::move(old_render_frame_host)); | 
| } | 
| void RenderFrameHostManager::DiscardUnusedFrame( | 
| @@ -703,20 +690,6 @@ void RenderFrameHostManager::DiscardUnusedFrame( | 
| proxy = CreateRenderFrameProxyHost(site_instance, | 
| render_frame_host->render_view_host()); | 
| } | 
| - | 
| - if (!SiteIsolationPolicy::IsSwappedOutStateForbidden()) { | 
| - DCHECK(frame_tree_node_->IsMainFrame()); | 
| - | 
| - // When using swapped out RenderFrameHosts, it is possible for the pending | 
| - // RenderFrameHost to be an existing one in swapped out state. Since it | 
| - // has been used to start a navigation, it could have committed a | 
| - // document. Check if |render_frame_host| is already swapped out, to avoid | 
| - // swapping it out again. | 
| - if (!render_frame_host->is_swapped_out()) | 
| - render_frame_host->SwapOut(proxy, false); | 
| - | 
| - proxy->TakeFrameHostOwnership(std::move(render_frame_host)); | 
| - } | 
| } | 
| render_frame_host.reset(); | 
| @@ -976,8 +949,6 @@ void RenderFrameHostManager::OnDidUpdateName(const std::string& name, | 
| // The window.name message may be sent outside of --site-per-process when | 
| // report_frame_name_changes renderer preference is set (used by | 
| // WebView). Don't send the update to proxies in those cases. | 
| - // TODO(nick,nasko): Should this be IsSwappedOutStateForbidden, to match | 
| - // OnDidUpdateOrigin? | 
| if (!SiteIsolationPolicy::AreCrossProcessFramesPossible()) | 
| return; | 
| @@ -999,9 +970,6 @@ void RenderFrameHostManager::OnEnforceStrictMixedContentChecking( | 
| } | 
| void RenderFrameHostManager::OnDidUpdateOrigin(const url::Origin& origin) { | 
| - if (!SiteIsolationPolicy::IsSwappedOutStateForbidden()) | 
| - return; | 
| - | 
| for (const auto& pair : proxy_hosts_) { | 
| pair.second->Send( | 
| new FrameMsg_DidUpdateOrigin(pair.second->GetRoutingID(), origin)); | 
| @@ -1028,18 +996,6 @@ void RenderFrameHostManager::ActiveFrameCountIsZero( | 
| RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); | 
| CHECK(proxy); | 
| - // Delete the proxy. If it is for a main frame (and the RFH is stored | 
| - // in the proxy) and it was still pending swap out, move the RFH to the | 
| - // pending deletion list first. | 
| - if (frame_tree_node_->IsMainFrame() && proxy->render_frame_host() && | 
| - proxy->render_frame_host()->rfh_state() == | 
| - RenderFrameHostImpl::STATE_PENDING_SWAP_OUT) { | 
| - DCHECK(!SiteIsolationPolicy::IsSwappedOutStateForbidden()); | 
| - scoped_ptr<RenderFrameHostImpl> swapped_out_rfh = | 
| - proxy->PassFrameHostOwnership(); | 
| - MoveToPendingDeleteHosts(std::move(swapped_out_rfh)); | 
| - } | 
| - | 
| DeleteRenderFrameProxyHost(site_instance); | 
| } | 
| @@ -1618,11 +1574,11 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( | 
| int flags, | 
| int* view_routing_id_ptr) { | 
| bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); | 
| 
Charlie Reis
2016/03/11 21:56:56
TODO to remove CREATE_RF_SWAPPED_OUT flag?
 
nasko
2016/03/11 22:35:33
I have that and a lot more in a doc. I don't see a
 | 
| - bool swapped_out_forbidden = | 
| - SiteIsolationPolicy::IsSwappedOutStateForbidden(); | 
| + int32_t widget_routing_id = MSG_ROUTING_NONE; | 
| + RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 
| CHECK(instance); | 
| - CHECK(!swapped_out_forbidden || !swapped_out); | 
| + CHECK(!swapped_out); | 
| CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible() || | 
| frame_tree_node_->IsMainFrame()); | 
| @@ -1638,101 +1594,58 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( | 
| // never create it in the same SiteInstance as our current RFH. | 
| CHECK_NE(render_frame_host_->GetSiteInstance(), instance); | 
| - // Check if we've already created an RFH for this SiteInstance. If so, try | 
| - // to re-use the existing one, which has already been initialized. We'll | 
| - // remove it from the list of proxy hosts below if it will be active. | 
| - RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 
| - if (proxy && proxy->render_frame_host()) { | 
| - RenderViewHost* render_view_host = proxy->GetRenderViewHost(); | 
| - CHECK(!swapped_out_forbidden); | 
| - if (view_routing_id_ptr) | 
| - *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); | 
| - // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. | 
| - // Prevent the process from exiting while we're trying to use it. | 
| - if (!swapped_out) { | 
| - new_render_frame_host = proxy->PassFrameHostOwnership(); | 
| - new_render_frame_host->GetProcess()->AddPendingView(); | 
| - | 
| - DeleteRenderFrameProxyHost(instance); | 
| - // NB |proxy| is deleted at this point. | 
| - | 
| - // If we are reusing the RenderViewHost and it doesn't already have a | 
| - // RenderWidgetHostView, we need to create one if this is the main frame. | 
| - if (render_view_host->IsRenderViewLive() && | 
| - !render_view_host->GetWidget()->GetView() && | 
| - frame_tree_node_->IsMainFrame()) { | 
| - delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); | 
| - } | 
| - } | 
| - } else { | 
| - // Create a new RenderFrameHost if we don't find an existing one. | 
| + // A RenderFrame in a different process from its parent RenderFrame | 
| + // requires a RenderWidget for input/layout/painting. | 
| + if (frame_tree_node_->parent() && | 
| + frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != | 
| + instance) { | 
| + CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); | 
| + widget_routing_id = instance->GetProcess()->GetNextRoutingID(); | 
| + } | 
| - int32_t widget_routing_id = MSG_ROUTING_NONE; | 
| + new_render_frame_host = CreateRenderFrameHost( | 
| + instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags); | 
| + RenderViewHostImpl* render_view_host = | 
| + new_render_frame_host->render_view_host(); | 
| - // A RenderFrame in a different process from its parent RenderFrame | 
| - // requires a RenderWidget for input/layout/painting. | 
| - if (frame_tree_node_->parent() && | 
| - frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != | 
| - instance) { | 
| - CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); | 
| - widget_routing_id = instance->GetProcess()->GetNextRoutingID(); | 
| - } | 
| + // Prevent the process from exiting while we're trying to navigate in it. | 
| + new_render_frame_host->GetProcess()->AddPendingView(); | 
| - new_render_frame_host = CreateRenderFrameHost( | 
| - instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags); | 
| - RenderViewHostImpl* render_view_host = | 
| - new_render_frame_host->render_view_host(); | 
| + if (frame_tree_node_->IsMainFrame()) { | 
| + success = InitRenderView(render_view_host, proxy); | 
| - // Prevent the process from exiting while we're trying to navigate in it. | 
| - // Otherwise, if the new RFH is swapped out already, store it. | 
| - if (!swapped_out) { | 
| - new_render_frame_host->GetProcess()->AddPendingView(); | 
| - } else { | 
| - proxy = | 
| - CreateRenderFrameProxyHost(new_render_frame_host->GetSiteInstance(), | 
| - new_render_frame_host->render_view_host()); | 
| - proxy->TakeFrameHostOwnership(std::move(new_render_frame_host)); | 
| - } | 
| + // If we are reusing the RenderViewHost and it doesn't already have a | 
| + // RenderWidgetHostView, we need to create one if this is the main frame. | 
| + if (!render_view_host->GetWidget()->GetView()) | 
| + delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); | 
| + } else { | 
| + DCHECK(render_view_host->IsRenderViewLive()); | 
| + } | 
| + if (success) { | 
| if (frame_tree_node_->IsMainFrame()) { | 
| - success = InitRenderView(render_view_host, proxy); | 
| - | 
| - // If we are reusing the RenderViewHost and it doesn't already have a | 
| - // RenderWidgetHostView, we need to create one if this is the main frame. | 
| - if (!swapped_out && !render_view_host->GetWidget()->GetView()) | 
| - delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); | 
| - } else { | 
| - DCHECK(render_view_host->IsRenderViewLive()); | 
| - } | 
| - | 
| - if (success) { | 
| - if (frame_tree_node_->IsMainFrame()) { | 
| - // Don't show the main frame's view until we get a DidNavigate from it. | 
| - // Only the RenderViewHost for the top-level RenderFrameHost has a | 
| - // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes | 
| - // will be created later and hidden. | 
| - if (render_view_host->GetWidget()->GetView()) | 
| - render_view_host->GetWidget()->GetView()->Hide(); | 
| - } | 
| - // RenderViewHost for |instance| might exist prior to calling | 
| - // CreateRenderFrame. In such a case, InitRenderView will not create the | 
| - // RenderFrame in the renderer process and it needs to be done | 
| - // explicitly. | 
| - if (swapped_out_forbidden) { | 
| - // Init the RFH, so a RenderFrame is created in the renderer. | 
| - DCHECK(new_render_frame_host); | 
| - success = InitRenderFrame(new_render_frame_host.get()); | 
| - } | 
| + // Don't show the main frame's view until we get a DidNavigate from it. | 
| + // Only the RenderViewHost for the top-level RenderFrameHost has a | 
| + // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes | 
| + // will be created later and hidden. | 
| + if (render_view_host->GetWidget()->GetView()) | 
| + render_view_host->GetWidget()->GetView()->Hide(); | 
| } | 
| + // RenderViewHost for |instance| might exist prior to calling | 
| + // CreateRenderFrame. In such a case, InitRenderView will not create the | 
| + // RenderFrame in the renderer process and it needs to be done | 
| + // explicitly. | 
| + DCHECK(new_render_frame_host); | 
| + success = InitRenderFrame(new_render_frame_host.get()); | 
| + } | 
| - if (success) { | 
| - if (view_routing_id_ptr) | 
| - *view_routing_id_ptr = render_view_host->GetRoutingID(); | 
| - } | 
| + if (success) { | 
| + if (view_routing_id_ptr) | 
| + *view_routing_id_ptr = render_view_host->GetRoutingID(); | 
| } | 
| - // Returns the new RFH if it isn't swapped out. | 
| - if (success && !swapped_out) { | 
| + // Return the new RenderFrameHost on successful creation. | 
| + if (success) { | 
| DCHECK(new_render_frame_host->GetSiteInstance() == instance); | 
| return new_render_frame_host; | 
| } | 
| @@ -1749,14 +1662,12 @@ int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { | 
| // Ensure a RenderViewHost exists for |instance|, as it creates the page | 
| // level structure in Blink. | 
| - if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { | 
| - render_view_host = | 
| - frame_tree_node_->frame_tree()->GetRenderViewHost(instance); | 
| - if (!render_view_host) { | 
| - CHECK(frame_tree_node_->IsMainFrame()); | 
| - render_view_host = frame_tree_node_->frame_tree()->CreateRenderViewHost( | 
| - instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, true, true); | 
| - } | 
| + render_view_host = | 
| + frame_tree_node_->frame_tree()->GetRenderViewHost(instance); | 
| + if (!render_view_host) { | 
| + CHECK(frame_tree_node_->IsMainFrame()); | 
| + render_view_host = frame_tree_node_->frame_tree()->CreateRenderViewHost( | 
| + instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, true, true); | 
| } | 
| RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 
| @@ -1766,8 +1677,7 @@ int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { | 
| if (!proxy) | 
| proxy = CreateRenderFrameProxyHost(instance, render_view_host); | 
| - if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && | 
| - frame_tree_node_->IsMainFrame()) { | 
| + if (frame_tree_node_->IsMainFrame()) { | 
| InitRenderView(render_view_host, proxy); | 
| } else { | 
| proxy->InitRenderFrameProxy(); | 
| @@ -1910,8 +1820,7 @@ bool RenderFrameHostManager::InitRenderFrame( | 
| // Calling InitRenderFrameProxy on main frames seems to be causing | 
| // https://crbug.com/575245, so track down how this can happen. | 
| // TODO(creis): Remove this once we've found the cause. | 
| - if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && | 
| - !frame_tree_node_->parent()) { | 
| + if (!frame_tree_node_->parent()) { | 
| base::debug::SetCrashKeyValue( | 
| "initrf_frame_id", | 
| base::IntToString(render_frame_host->GetRoutingID())); | 
| @@ -1946,14 +1855,6 @@ int RenderFrameHostManager::GetRoutingIdForSiteInstance( | 
| if (render_frame_host_->GetSiteInstance() == site_instance) | 
| return render_frame_host_->GetRoutingID(); | 
| - // If there is a matching pending RFH, only return it if swapped out is | 
| - // allowed, since otherwise there should be a proxy that should be used | 
| - // instead. | 
| - if (pending_render_frame_host_ && | 
| - pending_render_frame_host_->GetSiteInstance() == site_instance && | 
| - !SiteIsolationPolicy::IsSwappedOutStateForbidden()) | 
| - return pending_render_frame_host_->GetRoutingID(); | 
| - | 
| RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); | 
| if (proxy) | 
| return proxy->GetRoutingID(); | 
| @@ -2067,7 +1968,7 @@ void RenderFrameHostManager::CommitPending() { | 
| // If this is committing a main frame navigation, update it and set the | 
| // routing id in the RenderViewHost associated with the old RenderFrameHost | 
| // to MSG_ROUTING_NONE. | 
| - if (is_main_frame && SiteIsolationPolicy::IsSwappedOutStateForbidden()) { | 
| + if (is_main_frame) { | 
| render_frame_host_->render_view_host()->set_main_frame_routing_id( | 
| render_frame_host_->routing_id()); | 
| old_render_frame_host->render_view_host()->set_main_frame_routing_id( | 
| @@ -2082,11 +1983,9 @@ void RenderFrameHostManager::CommitPending() { | 
| // the proxy. | 
| SwapOutOldFrame(std::move(old_render_frame_host)); | 
| - if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { | 
| - // Since the new RenderFrameHost is now committed, there must be no proxies | 
| - // for its SiteInstance. Delete any existing ones. | 
| - DeleteRenderFrameProxyHost(render_frame_host_->GetSiteInstance()); | 
| - } | 
| + // Since the new RenderFrameHost is now committed, there must be no proxies | 
| + // for its SiteInstance. Delete any existing ones. | 
| + DeleteRenderFrameProxyHost(render_frame_host_->GetSiteInstance()); | 
| // If this is a subframe, it should have a CrossProcessFrameConnector | 
| // created already. Use it to link the new RFH's view to the proxy that | 
| @@ -2478,29 +2377,22 @@ void RenderFrameHostManager::CreateOpenerProxiesForFrameTree( | 
| } else { | 
| // If any of the RenderViewHosts (current, pending, or swapped out) for this | 
| // FrameTree has the same SiteInstance, then we can return early and reuse | 
| - // them. An exception is if we are in IsSwappedOutStateForbidden mode and | 
| - // find a pending RenderViewHost: in this case, we should still create a | 
| - // proxy, which will allow communicating with the opener until the pending | 
| - // RenderView commits, or if the pending navigation is canceled. | 
| + // them. An exception is if we find a pending RenderViewHost: in this case, | 
| + // we should still create a proxy, which will allow communicating with the | 
| + // opener until the pending RenderView commits, or if the pending navigation | 
| + // is canceled. | 
| RenderViewHostImpl* rvh = frame_tree->GetRenderViewHost(instance); | 
| - bool need_proxy_for_pending_rvh = | 
| - SiteIsolationPolicy::IsSwappedOutStateForbidden() && | 
| - (rvh == pending_render_view_host()); | 
| + bool need_proxy_for_pending_rvh = (rvh == pending_render_view_host()); | 
| if (rvh && rvh->IsRenderViewLive() && !need_proxy_for_pending_rvh) | 
| return; | 
| if (rvh && !rvh->IsRenderViewLive()) { | 
| EnsureRenderViewInitialized(rvh, instance); | 
| } else { | 
| - // Create a swapped out RenderView in the given SiteInstance if none | 
| + // Create a RenderFrameProxyHost in the given SiteInstance if none | 
| // exists. Since an opener can point to a subframe, do this on the root | 
| // frame of the current opener's frame tree. | 
| - if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { | 
| - frame_tree->root()->render_manager()->CreateRenderFrameProxy(instance); | 
| - } else { | 
| - frame_tree->root()->render_manager()->CreateRenderFrame( | 
| - instance, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, nullptr); | 
| - } | 
| + frame_tree->root()->render_manager()->CreateRenderFrameProxy(instance); | 
| } | 
| } | 
| } |