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 58c17d54c34798e0e070878e4e572a594f41a3a3..4d85ec99965d395c286bee188e1e16860d799a68 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.cc |
+++ b/content/browser/frame_host/render_frame_host_manager.cc |
@@ -732,18 +732,16 @@ void RenderFrameHostManager::ClearWebUIInstances() { |
void RenderFrameHostManager::DidCreateNavigationRequest( |
NavigationRequest* request) { |
CHECK(IsBrowserSideNavigationEnabled()); |
- RenderFrameHostImpl* dest_rfh = GetFrameHostForNavigation(*request); |
+ RenderFrameHostImpl* dest_rfh = GetFrameHostForNavigation(request, false); |
DCHECK(dest_rfh); |
- request->set_associated_site_instance_type( |
- dest_rfh == render_frame_host_.get() |
- ? NavigationRequest::AssociatedSiteInstanceType::CURRENT |
- : NavigationRequest::AssociatedSiteInstanceType::SPECULATIVE); |
} |
// PlzNavigate |
RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
- const NavigationRequest& request) { |
+ NavigationRequest* request, |
+ bool is_commit) { |
CHECK(IsBrowserSideNavigationEnabled()); |
+ DCHECK(request); |
SiteInstance* current_site_instance = render_frame_host_->GetSiteInstance(); |
@@ -753,15 +751,19 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
: nullptr; |
scoped_refptr<SiteInstance> dest_site_instance = GetSiteInstanceForNavigation( |
- request.common_params().url, request.source_site_instance(), |
- request.dest_site_instance(), candidate_site_instance, |
- request.common_params().transition, |
- request.restore_type() != NavigationEntryImpl::RESTORE_NONE, |
- request.is_view_source()); |
+ request->common_params().url, request->source_site_instance(), |
+ request->dest_site_instance(), candidate_site_instance, |
+ request->common_params().transition, |
+ request->restore_type() != NavigationEntryImpl::RESTORE_NONE, |
+ request->is_view_source()); |
// The appropriate RenderFrameHost to commit the navigation. |
RenderFrameHostImpl* navigation_rfh = nullptr; |
+ // Whether the RenderFrameHost changed between the start and the commit of |
+ // the navigation. |
+ bool switched_rfh = false; |
+ |
bool notify_webui_of_rv_creation = false; |
// Reuse the current RenderFrameHost if its SiteInstance matches the |
@@ -778,18 +780,18 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
// go cross-process. Check it first. |
bool can_renderer_initiate_transfer = |
render_frame_host_->IsRenderFrameLive() && |
- ShouldMakeNetworkRequestForURL(request.common_params().url) && |
+ ShouldMakeNetworkRequestForURL(request->common_params().url) && |
IsRendererTransferNeededForNavigation(render_frame_host_.get(), |
- request.common_params().url); |
+ request->common_params().url); |
no_renderer_swap |= |
- !request.browser_initiated() && !can_renderer_initiate_transfer; |
+ !request->browser_initiated() && !can_renderer_initiate_transfer; |
} else { |
// Subframe navigations will use the current renderer, unless specifically |
// allowed to swap processes. |
- no_renderer_swap |= !CanSubframeSwapProcess(request.common_params().url, |
- request.source_site_instance(), |
- request.dest_site_instance()); |
+ no_renderer_swap |= !CanSubframeSwapProcess(request->common_params().url, |
+ request->source_site_instance(), |
+ request->dest_site_instance()); |
} |
if (no_renderer_swap) { |
@@ -799,11 +801,15 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
// not be recreated if the URL didn't change. So instead of calling |
// CleanUpNavigation just discard the speculative RenderFrameHost if one |
// exists. |
- if (speculative_render_frame_host_) |
+ if (speculative_render_frame_host_) { |
DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost()); |
- UpdatePendingWebUIOnCurrentFrameHost(request.common_params().url, |
- request.bindings()); |
+ if (is_commit) |
+ switched_rfh = true; |
+ } |
+ |
+ UpdatePendingWebUIOnCurrentFrameHost(request->common_params().url, |
+ request->bindings()); |
navigation_rfh = render_frame_host_.get(); |
@@ -825,11 +831,14 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
bool success = CreateSpeculativeRenderFrameHost(current_site_instance, |
dest_site_instance.get()); |
DCHECK(success); |
+ |
+ if (is_commit) |
+ switched_rfh = true; |
} |
DCHECK(speculative_render_frame_host_); |
bool changed_web_ui = speculative_render_frame_host_->UpdatePendingWebUI( |
- request.common_params().url, request.bindings()); |
+ request->common_params().url, request->bindings()); |
speculative_render_frame_host_->CommitPendingWebUI(); |
DCHECK_EQ(GetNavigatingWebUI(), speculative_render_frame_host_->web_ui()); |
notify_webui_of_rv_creation = |
@@ -888,6 +897,21 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
if (notify_webui_of_rv_creation && GetNavigatingWebUI()) |
GetNavigatingWebUI()->RenderViewCreated(navigation_rfh->render_view_host()); |
+ // Update the type of SiteInstance in the NavigationRequest. |
+ request->set_associated_site_instance_type( |
+ navigation_rfh == render_frame_host_.get() |
+ ? NavigationRequest::AssociatedSiteInstanceType::CURRENT |
+ : NavigationRequest::AssociatedSiteInstanceType::SPECULATIVE); |
+ |
+ // If the SiteInstance changed between the start and the end of the |
+ // navigation, do not send POST data. This avoids POST data from one |
+ // SiteInstance to be sent to a renderer of another SiteInstance when the |
+ // navigation encountered a cross-site redirect. |
Charlie Reis
2016/05/11 00:00:23
See my other comment on ResetPostData. Based on w
clamy
2016/05/11 08:54:41
Done. We indeed don't need to do this.
|
+ if (switched_rfh) { |
+ DCHECK(is_commit); |
+ request->ResetPostData(); |
+ } |
+ |
return navigation_rfh; |
} |