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 259653353a761112b145127f7138abde8cfba0ae..615bc712ec2f92ec5ca1d915be695234f8757b3e 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.cc |
+++ b/content/browser/frame_host/render_frame_host_manager.cc |
@@ -161,12 +161,10 @@ RenderFrameHostImpl* RenderFrameHostManager::Navigate( |
"FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
// Create a pending RenderFrameHost to use for the navigation. |
RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate( |
- entry.GetURL(), |
- entry.site_instance(), |
+ entry.GetURL(), entry.source_site_instance(), entry.site_instance(), |
entry.GetTransitionType(), |
entry.restore_type() != NavigationEntryImpl::RESTORE_NONE, |
- entry.IsViewSourceMode(), |
- entry.transferred_global_request_id(), |
+ entry.IsViewSourceMode(), entry.transferred_global_request_id(), |
entry.bindings()); |
if (!dest_render_frame_host) |
return NULL; // We weren't able to create a pending render frame host. |
@@ -378,15 +376,9 @@ void RenderFrameHostManager::OnCrossSiteResponse( |
// However, since we force the navigation to be in the current tab, it |
// doesn't matter. |
pending_render_frame_host->frame_tree_node()->navigator()->RequestTransferURL( |
- pending_render_frame_host, |
- transfer_url, |
- rest_of_chain, |
- referrer, |
- page_transition, |
- CURRENT_TAB, |
- global_request_id, |
- should_replace_current_entry, |
- true); |
+ pending_render_frame_host, transfer_url, nullptr, rest_of_chain, referrer, |
+ page_transition, CURRENT_TAB, global_request_id, |
+ should_replace_current_entry, true); |
// The transferring request was only needed during the RequestTransferURL |
// call, so it is safe to clear at this point. |
@@ -636,7 +628,7 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
// Pick the right RenderFrameHost to commit the navigation. |
// TODO(clamy): Replace the default values by the right ones. |
RenderFrameHostImpl* render_frame_host = UpdateStateForNavigate( |
- url, NULL, transition, false, false, GlobalRequestID(), |
+ url, nullptr, nullptr, transition, false, false, GlobalRequestID(), |
NavigationEntryImpl::kInvalidBindings); |
// If the renderer that needs to navigate is not live (it was just created or |
@@ -649,7 +641,7 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
opener_route_id, |
MSG_ROUTING_NONE, |
frame_tree_node_->IsMainFrame())) { |
- return NULL; |
+ return nullptr; |
} |
} |
return render_frame_host; |
@@ -783,8 +775,9 @@ bool RenderFrameHostManager::ShouldReuseWebUI( |
SiteInstance* RenderFrameHostManager::GetSiteInstanceForNavigation( |
const GURL& dest_url, |
+ SiteInstance* source_instance, |
SiteInstance* dest_instance, |
- ui::PageTransition dest_transition, |
+ ui::PageTransition transition, |
bool dest_is_restore, |
bool dest_is_view_source_mode) { |
SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); |
@@ -818,13 +811,8 @@ SiteInstance* RenderFrameHostManager::GetSiteInstanceForNavigation( |
dest_is_view_source_mode); |
if (ShouldTransitionCrossSite() || force_swap) { |
new_instance = GetSiteInstanceForURL( |
- dest_url, |
- dest_instance, |
- dest_transition, |
- dest_is_restore, |
- dest_is_view_source_mode, |
- current_instance, |
- force_swap); |
+ dest_url, source_instance, current_instance, dest_instance, |
+ transition, dest_is_restore, dest_is_view_source_mode, force_swap); |
} |
// If force_swap is true, we must use a different SiteInstance. If we didn't, |
@@ -837,11 +825,12 @@ SiteInstance* RenderFrameHostManager::GetSiteInstanceForNavigation( |
SiteInstance* RenderFrameHostManager::GetSiteInstanceForURL( |
const GURL& dest_url, |
+ SiteInstance* source_instance, |
+ SiteInstance* current_instance, |
SiteInstance* dest_instance, |
- ui::PageTransition dest_transition, |
+ ui::PageTransition transition, |
bool dest_is_restore, |
bool dest_is_view_source_mode, |
- SiteInstance* current_instance, |
bool force_browsing_instance_swap) { |
NavigationControllerImpl& controller = |
delegate_->GetControllerForRenderManager(); |
@@ -874,7 +863,7 @@ SiteInstance* RenderFrameHostManager::GetSiteInstanceForURL( |
// |
if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerSite) && |
ui::PageTransitionCoreTypeIs( |
- dest_transition, ui::PAGE_TRANSITION_GENERATED)) { |
+ transition, ui::PAGE_TRANSITION_GENERATED)) { |
return current_instance; |
} |
@@ -976,6 +965,14 @@ SiteInstance* RenderFrameHostManager::GetSiteInstanceForURL( |
return SiteInstance::CreateForURL(browser_context, dest_url); |
} |
+ // Use the source SiteInstance in case of data URLs or about:blank pages, |
+ // because the content is then controlled and/or scriptable by the source |
+ // SiteInstance. |
+ GURL about_blank(url::kAboutBlankURL); |
+ if (source_instance && |
+ (dest_url == about_blank || dest_url.scheme() == url::kDataScheme)) |
+ return source_instance; |
+ |
// Use the current SiteInstance for same site navigations, as long as the |
// process type is correct. (The URL may have been installed as an app since |
// the last time we visited it.) |
@@ -1442,11 +1439,12 @@ void RenderFrameHostManager::ShutdownRenderFrameProxyHostsInSiteInstance( |
} |
RenderFrameHostImpl* RenderFrameHostManager::UpdateStateForNavigate( |
- const GURL& url, |
- SiteInstance* instance, |
+ const GURL& dest_url, |
+ SiteInstance* source_instance, |
+ SiteInstance* dest_instance, |
ui::PageTransition transition, |
- bool is_restore, |
- bool is_view_source_mode, |
+ bool dest_is_restore, |
+ bool dest_is_view_source_mode, |
const GlobalRequestID& transferred_request_id, |
int bindings) { |
// If we are currently navigating cross-process, we want to get back to normal |
@@ -1459,7 +1457,8 @@ RenderFrameHostImpl* RenderFrameHostManager::UpdateStateForNavigate( |
SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); |
scoped_refptr<SiteInstance> new_instance = GetSiteInstanceForNavigation( |
- url, instance, transition, is_restore, is_view_source_mode); |
+ dest_url, source_instance, dest_instance, transition, |
+ dest_is_restore, dest_is_view_source_mode); |
const NavigationEntry* current_entry = |
delegate_->GetLastCommittedNavigationEntryForRenderManager(); |
@@ -1481,7 +1480,7 @@ RenderFrameHostImpl* RenderFrameHostManager::UpdateStateForNavigate( |
// 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(url, bindings); |
+ SetPendingWebUI(dest_url, bindings); |
CreatePendingRenderFrameHost(current_instance, new_instance.get(), |
frame_tree_node_->IsMainFrame()); |
if (!pending_render_frame_host_.get()) { |
@@ -1559,11 +1558,11 @@ RenderFrameHostImpl* RenderFrameHostManager::UpdateStateForNavigate( |
// delete the proxy. |
DeleteRenderFrameProxyHost(new_instance.get()); |
- if (ShouldReuseWebUI(current_entry, url)) { |
+ if (ShouldReuseWebUI(current_entry, dest_url)) { |
pending_web_ui_.reset(); |
pending_and_current_web_ui_ = web_ui_->AsWeakPtr(); |
} else { |
- SetPendingWebUI(url, bindings); |
+ SetPendingWebUI(dest_url, bindings); |
// Make sure the new RenderViewHost has the right bindings. |
if (pending_web_ui() && |
!render_frame_host_->GetProcess()->IsIsolatedGuest()) { |
@@ -1579,7 +1578,7 @@ RenderFrameHostImpl* RenderFrameHostManager::UpdateStateForNavigate( |
// The renderer can exit view source mode when any error or cancellation |
// happen. We must overwrite to recover the mode. |
- if (is_view_source_mode) { |
+ if (dest_is_view_source_mode) { |
render_frame_host_->render_view_host()->Send( |
new ViewMsg_EnableViewSourceMode( |
render_frame_host_->render_view_host()->GetRoutingID())); |