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 3524a84d030e4d4d13b15f9a3f2b802772c2a9a1..44cbea0a3faa3964a309a9aa2b1b4f7b360f13d7 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.cc |
+++ b/content/browser/frame_host/render_frame_host_manager.cc |
@@ -30,7 +30,6 @@ |
#include "content/browser/renderer_host/render_view_host_impl.h" |
#include "content/browser/site_instance_impl.h" |
#include "content/browser/webui/web_ui_controller_factory_registry.h" |
-#include "content/browser/webui/web_ui_impl.h" |
#include "content/common/frame_messages.h" |
#include "content/common/site_isolation_policy.h" |
#include "content/common/view_messages.h" |
@@ -39,7 +38,6 @@ |
#include "content/public/browser/render_widget_host_iterator.h" |
#include "content/public/browser/render_widget_host_view.h" |
#include "content/public/browser/user_metrics.h" |
-#include "content/public/browser/web_ui_controller.h" |
#include "content/public/common/browser_plugin_guest_mode.h" |
#include "content/public/common/content_switches.h" |
#include "content/public/common/referrer.h" |
@@ -220,7 +218,6 @@ RenderFrameHostManager::RenderFrameHostManager( |
render_widget_delegate_(render_widget_delegate), |
proxy_hosts_(new RenderFrameProxyHostMap(this)), |
interstitial_page_(nullptr), |
- should_reuse_web_ui_(false), |
weak_factory_(this) { |
DCHECK(frame_tree_node_); |
} |
@@ -245,10 +242,6 @@ RenderFrameHostManager::~RenderFrameHostManager() { |
// the current RenderFrameHost and uses it during its destructor. |
ResetProxyHosts(); |
- // Release the WebUI prior to resetting the current RenderFrameHost, as the |
- // WebUI accesses the RenderFrameHost during cleanup. |
- web_ui_.reset(); |
- |
// We should always have a current RenderFrameHost except in some tests. |
SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); |
} |
@@ -265,9 +258,9 @@ void RenderFrameHostManager::Init(BrowserContext* browser_context, |
site_instance = SiteInstance::Create(browser_context); |
int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0; |
- SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, |
- frame_routing_id, widget_routing_id, |
- flags)); |
+ SetRenderFrameHost(CreateRenderFrameHost( |
+ site_instance, view_routing_id, frame_routing_id, widget_routing_id, |
+ flags, GURL(), NavigationEntryImpl::kInvalidBindings)); |
// Notify the delegate of the creation of the current RenderFrameHost. |
// Do this only for subframes, as the main frame case is taken care of by |
@@ -351,27 +344,6 @@ void RenderFrameHostManager::RemoveOuterDelegateFrame() { |
outer_delegate_frame_tree_node); |
} |
-void RenderFrameHostManager::SetPendingWebUI(const GURL& url, int bindings) { |
- pending_web_ui_ = CreateWebUI(url, bindings); |
- pending_and_current_web_ui_.reset(); |
-} |
- |
-scoped_ptr<WebUIImpl> RenderFrameHostManager::CreateWebUI(const GURL& url, |
- int bindings) { |
- scoped_ptr<WebUIImpl> new_web_ui(delegate_->CreateWebUIForRenderManager(url)); |
- |
- // If we have assigned (zero or more) bindings to this NavigationEntry in the |
- // past, make sure we're not granting it different bindings than it had |
- // before. If so, note it and don't give it any bindings, to avoid a |
- // potential privilege escalation. |
- if (new_web_ui && bindings != NavigationEntryImpl::kInvalidBindings && |
- new_web_ui->GetBindings() != bindings) { |
- RecordAction(base::UserMetricsAction("ProcessSwapBindingsMismatch_RVHM")); |
- return nullptr; |
- } |
- return new_web_ui.Pass(); |
-} |
- |
RenderFrameHostImpl* RenderFrameHostManager::Navigate( |
const GURL& dest_url, |
const FrameNavigationEntry& frame_entry, |
@@ -418,7 +390,7 @@ RenderFrameHostImpl* RenderFrameHostManager::Navigate( |
CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(), |
frame_tree_node_); |
if (!InitRenderView(dest_render_frame_host->render_view_host(), |
- MSG_ROUTING_NONE)) |
+ MSG_ROUTING_NONE, pending_web_ui())) |
return nullptr; |
// Now that we've created a new renderer, be sure to hide it if it isn't |
@@ -670,13 +642,12 @@ void RenderFrameHostManager::CommitPendingIfNecessary( |
RenderFrameHostImpl* render_frame_host, |
bool was_caused_by_user_gesture) { |
if (!pending_render_frame_host_ && !speculative_render_frame_host_) { |
- DCHECK_IMPLIES(should_reuse_web_ui_, web_ui_); |
// We should only hear this from our current renderer. |
DCHECK_EQ(render_frame_host_, render_frame_host); |
- // Even when there is no pending RVH, there may be a pending Web UI. |
- if (pending_web_ui() || speculative_web_ui_) |
+ // If current RenderFrameHost has a pending WebUI, commit it. |
+ if (render_frame_host_->pending_web_ui()) |
CommitPending(); |
return; |
} |
@@ -1012,21 +983,12 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
CleanUpNavigation(); |
navigation_rfh = render_frame_host_.get(); |
- // As SiteInstances are the same, check if the WebUI should be reused. |
- const NavigationEntry* current_navigation_entry = |
- delegate_->GetLastCommittedNavigationEntryForRenderManager(); |
- should_reuse_web_ui_ = ShouldReuseWebUI(current_navigation_entry, |
- request.common_params().url); |
- if (!should_reuse_web_ui_) { |
- speculative_web_ui_ = CreateWebUI(request.common_params().url, |
- request.bindings()); |
- // Make sure the current RenderViewHost has the right bindings. |
- if (speculative_web_ui() && |
- !render_frame_host_->GetProcess()->IsForGuestsOnly()) { |
- render_frame_host_->render_view_host()->AllowBindings( |
- speculative_web_ui()->GetBindings()); |
- } |
- } |
+ // As SiteInstances are the same, make the RFH update its possible pending |
+ // WebUI. |
+ render_frame_host_->UpdatePendingWebUI(request.common_params().url, |
+ request.bindings()); |
+ DCHECK(!speculative_render_frame_host_); |
+ DCHECK(speculative_web_ui() == render_frame_host_->pending_web_ui()); |
} else { |
// If the SiteInstance for the final URL doesn't match the one from the |
// speculatively created RenderFrameHost, create a new RenderFrameHost using |
@@ -1039,8 +1001,18 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
request.common_params().url, current_site_instance, |
dest_site_instance.get(), request.bindings()); |
DCHECK(success); |
+ } else { |
+ // When reusing an existing speculative RenderFrameHost its active WebUI |
+ // must be updated to make sure it matches the current URL. As it is not a |
+ // new RenderFrameHost instance it must be done by updating the pending |
+ // WebUI and immediately making it active. |
+ speculative_render_frame_host_->UpdatePendingWebUI( |
+ request.common_params().url, request.bindings()); |
+ speculative_render_frame_host_->CommitPendingWebUI(); |
} |
DCHECK(speculative_render_frame_host_); |
+ DCHECK_EQ(speculative_web_ui(), speculative_render_frame_host_->web_ui()); |
+ |
navigation_rfh = speculative_render_frame_host_.get(); |
// Check if our current RFH is live. |
@@ -1062,7 +1034,8 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
if (!navigation_rfh->IsRenderFrameLive()) { |
// Recreate the opener chain. |
CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); |
- if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE)) { |
+ if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE, |
+ speculative_web_ui())) { |
return nullptr; |
} |
@@ -1085,8 +1058,7 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
void RenderFrameHostManager::CleanUpNavigation() { |
CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableBrowserSideNavigation)); |
- speculative_web_ui_.reset(); |
- should_reuse_web_ui_ = false; |
+ render_frame_host_->DiscardPendingWebUI(); |
if (speculative_render_frame_host_) |
DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost()); |
} |
@@ -1270,18 +1242,6 @@ bool RenderFrameHostManager::ShouldSwapBrowsingInstancesForNavigation( |
return false; |
} |
-bool RenderFrameHostManager::ShouldReuseWebUI( |
- const NavigationEntry* current_entry, |
- const GURL& new_url) const { |
- NavigationControllerImpl& controller = |
- delegate_->GetControllerForRenderManager(); |
- return current_entry && web_ui_ && |
- (WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType( |
- controller.GetBrowserContext(), current_entry->GetURL()) == |
- WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType( |
- controller.GetBrowserContext(), new_url)); |
-} |
- |
SiteInstance* RenderFrameHostManager::GetSiteInstanceForNavigation( |
const GURL& dest_url, |
SiteInstance* source_instance, |
@@ -1595,7 +1555,9 @@ const GURL& RenderFrameHostManager::GetCurrentURLForSiteInstance( |
void RenderFrameHostManager::CreatePendingRenderFrameHost( |
SiteInstance* old_instance, |
- SiteInstance* new_instance) { |
+ SiteInstance* new_instance, |
+ const GURL& url, |
+ int bindings) { |
int create_render_frame_flags = 0; |
if (delegate_->IsHidden()) |
create_render_frame_flags |= CREATE_RF_HIDDEN; |
@@ -1613,8 +1575,8 @@ void RenderFrameHostManager::CreatePendingRenderFrameHost( |
CreateProxiesForNewRenderFrameHost(old_instance, new_instance); |
// Create a non-swapped-out RFH with the given opener. |
- pending_render_frame_host_ = CreateRenderFrame( |
- new_instance, pending_web_ui(), create_render_frame_flags, nullptr); |
+ pending_render_frame_host_ = CreateRenderFrameInternal( |
+ new_instance, url, bindings, create_render_frame_flags, nullptr); |
} |
void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( |
@@ -1670,7 +1632,9 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
int32 view_routing_id, |
int32 frame_routing_id, |
int32 widget_routing_id, |
- int flags) { |
+ int flags, |
+ const GURL& dest_url, |
+ int entry_bindings) { |
if (frame_routing_id == MSG_ROUTING_NONE) |
frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); |
@@ -1691,7 +1655,7 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
return RenderFrameHostFactory::Create( |
site_instance, render_view_host, render_frame_delegate_, |
render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, |
- widget_routing_id, flags); |
+ widget_routing_id, flags, dest_url, entry_bindings); |
} |
// PlzNavigate |
@@ -1702,12 +1666,6 @@ bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
int bindings) { |
CHECK(new_instance); |
CHECK_NE(old_instance, new_instance); |
- CHECK(!should_reuse_web_ui_); |
- |
- // Note: |speculative_web_ui_| must be initialized before starting the |
- // |speculative_render_frame_host_| creation steps otherwise the WebUI |
- // won't be properly initialized. |
- speculative_web_ui_ = CreateWebUI(url, bindings); |
// The process for the new SiteInstance may (if we're sharing a process with |
// another host that already initialized it) or may not (we have our own |
@@ -1721,22 +1679,27 @@ bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
int create_render_frame_flags = 0; |
if (delegate_->IsHidden()) |
create_render_frame_flags |= CREATE_RF_HIDDEN; |
- speculative_render_frame_host_ = |
- CreateRenderFrame(new_instance, speculative_web_ui_.get(), |
- create_render_frame_flags, nullptr); |
+ speculative_render_frame_host_ = CreateRenderFrameInternal( |
+ new_instance, url, bindings, create_render_frame_flags, nullptr); |
- if (!speculative_render_frame_host_) { |
- speculative_web_ui_.reset(); |
- return false; |
- } |
return true; |
} |
scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
SiteInstance* instance, |
- WebUIImpl* web_ui, |
int flags, |
int* view_routing_id_ptr) { |
+ return CreateRenderFrameInternal(instance, GURL(), |
+ NavigationEntryImpl::kInvalidBindings, flags, |
+ view_routing_id_ptr); |
+} |
+ |
+scoped_ptr<RenderFrameHostImpl> |
+RenderFrameHostManager::CreateRenderFrameInternal(SiteInstance* instance, |
+ const GURL& url, |
+ int bindings, |
+ int flags, |
+ int* view_routing_id_ptr) { |
bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
bool swapped_out_forbidden = |
SiteIsolationPolicy::IsSwappedOutStateForbidden(); |
@@ -1771,6 +1734,8 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
// 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->UpdatePendingWebUI(url, bindings); |
+ new_render_frame_host->CommitPendingWebUI(); |
new_render_frame_host->GetProcess()->AddPendingView(); |
proxy_hosts_->Remove(instance->GetId()); |
@@ -1794,8 +1759,9 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
widget_routing_id = instance->GetProcess()->GetNextRoutingID(); |
} |
- new_render_frame_host = CreateRenderFrameHost( |
- instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags); |
+ new_render_frame_host = |
+ CreateRenderFrameHost(instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, |
+ widget_routing_id, flags, url, bindings); |
RenderViewHostImpl* render_view_host = |
new_render_frame_host->render_view_host(); |
int proxy_routing_id = MSG_ROUTING_NONE; |
@@ -1814,7 +1780,9 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
} |
if (frame_tree_node_->IsMainFrame()) { |
- success = InitRenderView(render_view_host, proxy_routing_id); |
+ success = InitRenderView( |
+ render_view_host, proxy_routing_id, |
+ swapped_out ? nullptr : new_render_frame_host->web_ui()); |
// 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. |
@@ -1853,21 +1821,6 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
} |
} |
- // When a new RenderView is created by the renderer process, the new |
- // WebContents gets a RenderViewHost in the SiteInstance of its opener |
- // WebContents. If not used in the first navigation, this RVH is swapped out |
- // and is not granted bindings, so we may need to grant them when swapping it |
- // in. |
- if (web_ui && !new_render_frame_host->GetProcess()->IsForGuestsOnly()) { |
- int required_bindings = web_ui->GetBindings(); |
- RenderViewHost* render_view_host = |
- new_render_frame_host->render_view_host(); |
- if ((render_view_host->GetEnabledBindings() & required_bindings) != |
- required_bindings) { |
- render_view_host->AllowBindings(required_bindings); |
- } |
- } |
- |
// Returns the new RFH if it isn't swapped out. |
if (success && !swapped_out) { |
DCHECK(new_render_frame_host->GetSiteInstance() == instance); |
@@ -1908,7 +1861,7 @@ int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { |
if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && |
frame_tree_node_->IsMainFrame()) { |
- InitRenderView(render_view_host, proxy->GetRoutingID()); |
+ InitRenderView(render_view_host, proxy->GetRoutingID(), nullptr); |
proxy->set_render_frame_proxy_created(true); |
} else { |
proxy->InitRenderFrameProxy(); |
@@ -1943,7 +1896,7 @@ void RenderFrameHostManager::EnsureRenderViewInitialized( |
if (!proxy) |
return; |
- InitRenderView(render_view_host, proxy->GetRoutingID()); |
+ InitRenderView(render_view_host, proxy->GetRoutingID(), nullptr); |
proxy->set_render_frame_proxy_created(true); |
} |
@@ -1978,7 +1931,8 @@ void RenderFrameHostManager::SetRWHViewForInnerContents( |
bool RenderFrameHostManager::InitRenderView( |
RenderViewHostImpl* render_view_host, |
- int proxy_routing_id) { |
+ int proxy_routing_id, |
+ WebUIImpl* dest_web_ui) { |
// Ensure the renderer process is initialized before creating the |
// RenderView. |
if (!render_view_host->GetProcess()->Init()) |
@@ -1988,26 +1942,13 @@ bool RenderFrameHostManager::InitRenderView( |
if (render_view_host->IsRenderViewLive()) |
return true; |
- // If the ongoing navigation is to a WebUI and the RenderView is not in a |
- // guest process, tell the RenderViewHost about any bindings it will need |
- // enabled. |
- WebUIImpl* dest_web_ui = nullptr; |
- if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnableBrowserSideNavigation)) { |
- dest_web_ui = |
- should_reuse_web_ui_ ? web_ui_.get() : speculative_web_ui_.get(); |
- } else { |
- dest_web_ui = pending_web_ui(); |
- } |
- if (dest_web_ui && !render_view_host->GetProcess()->IsForGuestsOnly()) { |
- render_view_host->AllowBindings(dest_web_ui->GetBindings()); |
- } else { |
- // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled |
- // process unless it's swapped out. |
- if (render_view_host->is_active()) { |
- CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
- render_view_host->GetProcess()->GetID())); |
- } |
+ // If the ongoing navigation is not to a WebUI or the RenderView is in a |
+ // guest process, ensure that we don't create an unprivileged RenderView in a |
+ // WebUI-enabled process unless it's swapped out. |
+ if ((!dest_web_ui || render_view_host->GetProcess()->IsForGuestsOnly()) && |
+ render_view_host->is_active()) { |
+ CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
+ render_view_host->GetProcess()->GetID())); |
} |
int opener_frame_routing_id = |
@@ -2095,42 +2036,17 @@ int RenderFrameHostManager::GetRoutingIdForSiteInstance( |
void RenderFrameHostManager::CommitPending() { |
TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending", |
"FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
- bool browser_side_navigation = |
- base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnableBrowserSideNavigation); |
- |
// First check whether we're going to want to focus the location bar after |
// this commit. We do this now because the navigation hasn't formally |
- // committed yet, so if we've already cleared |pending_web_ui_| the call chain |
+ // committed yet, so if we've already cleared the pending WebUI the call chain |
// this triggers won't be able to figure out what's going on. |
bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); |
- // Next commit the Web UI, if any. Either replace |web_ui_| with |
- // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or |
- // leave |web_ui_| as is if reusing it. |
- DCHECK(!(pending_web_ui_ && pending_and_current_web_ui_)); |
- if (pending_web_ui_ || speculative_web_ui_) { |
- DCHECK(!should_reuse_web_ui_); |
- web_ui_.reset(browser_side_navigation ? speculative_web_ui_.release() |
- : pending_web_ui_.release()); |
- } else if (pending_and_current_web_ui_ || should_reuse_web_ui_) { |
- if (browser_side_navigation) { |
- DCHECK(web_ui_); |
- should_reuse_web_ui_ = false; |
- } else { |
- DCHECK_EQ(pending_and_current_web_ui_.get(), web_ui_.get()); |
- pending_and_current_web_ui_.reset(); |
- } |
- } else { |
- web_ui_.reset(); |
- } |
- DCHECK(!speculative_web_ui_); |
- DCHECK(!should_reuse_web_ui_); |
- |
- // It's possible for the pending_render_frame_host_ to be nullptr when we |
- // aren't crossing process boundaries. If so, we just needed to handle the Web |
- // UI committing above and we're done. |
- if (!pending_render_frame_host_ && !speculative_render_frame_host_) { |
+ // If the current RenderFrameHost has a pending WebUI then just commit it and |
+ // return (there should be nothing else to commit). |
+ if (render_frame_host_->pending_web_ui()) { |
+ DCHECK(!pending_render_frame_host_ && !speculative_render_frame_host_); |
+ render_frame_host_->CommitPendingWebUI(); |
if (will_focus_location_bar) |
delegate_->SetFocusToLocationBar(false); |
return; |
@@ -2147,7 +2063,8 @@ void RenderFrameHostManager::CommitPending() { |
// Swap in the pending or speculative frame and make it active. Also ensure |
// the FrameTree stays in sync. |
scoped_ptr<RenderFrameHostImpl> old_render_frame_host; |
- if (!browser_side_navigation) { |
+ if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnableBrowserSideNavigation)) { |
DCHECK(!speculative_render_frame_host_); |
old_render_frame_host = |
SetRenderFrameHost(pending_render_frame_host_.Pass()); |
@@ -2309,9 +2226,6 @@ RenderFrameHostImpl* RenderFrameHostManager::UpdateStateForNavigate( |
dest_url, source_instance, dest_instance, nullptr, transition, |
dest_is_restore, dest_is_view_source_mode); |
- const NavigationEntry* current_entry = |
- delegate_->GetLastCommittedNavigationEntryForRenderManager(); |
- |
DCHECK(!pending_render_frame_host_); |
if (new_instance.get() != current_instance) { |
@@ -2324,14 +2238,8 @@ RenderFrameHostImpl* RenderFrameHostManager::UpdateStateForNavigate( |
// New SiteInstance: create a pending RFH to navigate. |
- // This will possibly create (set to nullptr) a Web UI object for the |
- // pending page. We'll use this later to give the page special access. This |
- // must happen before the new renderer is created below so it will get |
- // bindings. It must also happen after the above conditional call to |
- // CancelPending(), otherwise CancelPending may clear the pending_web_ui_ |
- // and the page will not have its bindings set appropriately. |
- SetPendingWebUI(dest_url, bindings); |
- CreatePendingRenderFrameHost(current_instance, new_instance.get()); |
+ CreatePendingRenderFrameHost(current_instance, new_instance.get(), dest_url, |
+ bindings); |
if (!pending_render_frame_host_) |
return nullptr; |
@@ -2391,23 +2299,7 @@ RenderFrameHostImpl* RenderFrameHostManager::UpdateStateForNavigate( |
// delete the proxy. |
proxy_hosts_->Remove(new_instance.get()->GetId()); |
- if (ShouldReuseWebUI(current_entry, dest_url)) { |
- pending_web_ui_.reset(); |
- pending_and_current_web_ui_ = web_ui_->AsWeakPtr(); |
- } else { |
- SetPendingWebUI(dest_url, bindings); |
- // Make sure the new RenderViewHost has the right bindings. |
- if (pending_web_ui() && |
- !render_frame_host_->GetProcess()->IsForGuestsOnly()) { |
- render_frame_host_->render_view_host()->AllowBindings( |
- pending_web_ui()->GetBindings()); |
- } |
- } |
- |
- if (pending_web_ui() && render_frame_host_->IsRenderFrameLive()) { |
- pending_web_ui()->RenderViewReused(render_frame_host_->render_view_host(), |
- frame_tree_node_->IsMainFrame()); |
- } |
+ render_frame_host_->UpdatePendingWebUI(dest_url, bindings); |
// The renderer can exit view source mode when any error or cancellation |
// happen. We must overwrite to recover the mode. |
@@ -2424,6 +2316,7 @@ void RenderFrameHostManager::CancelPending() { |
TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending", |
"FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
DiscardUnusedFrame(UnsetPendingRenderFrameHost()); |
+ render_frame_host_->DiscardPendingWebUI(); |
} |
scoped_ptr<RenderFrameHostImpl> |
@@ -2438,9 +2331,6 @@ RenderFrameHostManager::UnsetPendingRenderFrameHost() { |
// We no longer need to prevent the process from exiting. |
pending_render_frame_host->GetProcess()->RemovePendingView(); |
- pending_web_ui_.reset(); |
- pending_and_current_web_ui_.reset(); |
- |
return pending_render_frame_host.Pass(); |
} |
@@ -2615,8 +2505,7 @@ void RenderFrameHostManager::CreateOpenerProxiesForFrameTree( |
frame_tree->root()->render_manager()->CreateRenderFrameProxy(instance); |
} else { |
frame_tree->root()->render_manager()->CreateRenderFrame( |
- instance, nullptr, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, |
- nullptr); |
+ instance, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, nullptr); |
} |
} |
} |