Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(531)

Unified Diff: content/browser/frame_host/render_frame_host_manager.cc

Issue 1907443006: PlzNavigate: store POST data in the FrameNavigationEntry (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Not sending POST data when cross-site redirect Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698