summaryrefslogtreecommitdiffstats
path: root/content/browser/loader/cross_site_resource_handler.cc
diff options
context:
space:
mode:
authorcreis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-30 03:18:57 +0000
committercreis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-30 03:18:57 +0000
commitf8872901ddae10fd4b03fa350e60deb30c6a2f38 (patch)
tree4214acda4cadf683b5dab7b8293c67d13c10aad3 /content/browser/loader/cross_site_resource_handler.cc
parent00880a0c5a9b4add3539e63c509e5117f1074b0a (diff)
downloadchromium_src-f8872901ddae10fd4b03fa350e60deb30c6a2f38.zip
chromium_src-f8872901ddae10fd4b03fa350e60deb30c6a2f38.tar.gz
chromium_src-f8872901ddae10fd4b03fa350e60deb30c6a2f38.tar.bz2
Preserve redirect chain and page transition on cross-process server redirects.
The history database relies on the page transition and redirects to know that a typed URL ended up loading a final destination URL. If we do a process swap during the redirects and forget these, autocomplete breaks. BUG=104576 TEST=Autocomplete calendar.google.com with Calendar hosted app installed. Review URL: https://codereview.chromium.org/42063002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@231720 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/loader/cross_site_resource_handler.cc')
-rw-r--r--content/browser/loader/cross_site_resource_handler.cc25
1 files changed, 14 insertions, 11 deletions
diff --git a/content/browser/loader/cross_site_resource_handler.cc b/content/browser/loader/cross_site_resource_handler.cc
index 657791f..1267137 100644
--- a/content/browser/loader/cross_site_resource_handler.cc
+++ b/content/browser/loader/cross_site_resource_handler.cc
@@ -25,15 +25,15 @@ namespace content {
namespace {
-void OnCrossSiteResponseHelper(int render_process_id,
- int render_view_id,
+void OnCrossSiteResponseHelper(int render_view_id,
const GlobalRequestID& global_request_id,
bool is_transfer,
- const GURL& transfer_url,
+ const std::vector<GURL>& transfer_url_chain,
const Referrer& referrer,
+ PageTransition page_transition,
int64 frame_id) {
- RenderViewHostImpl* rvh = RenderViewHostImpl::FromID(render_process_id,
- render_view_id);
+ RenderViewHostImpl* rvh =
+ RenderViewHostImpl::FromID(global_request_id.child_id, render_view_id);
if (!rvh)
return;
RenderViewHostDelegate* delegate = rvh->GetDelegate();
@@ -41,7 +41,8 @@ void OnCrossSiteResponseHelper(int render_process_id,
return;
delegate->GetRendererManagementDelegate()->OnCrossSiteResponse(
- rvh, global_request_id, is_transfer, transfer_url, referrer, frame_id);
+ rvh, global_request_id, is_transfer, transfer_url_chain, referrer,
+ page_transition, frame_id);
}
} // namespace
@@ -225,28 +226,30 @@ void CrossSiteResourceHandler::StartCrossSiteTransition(
// is starting, so that it can tell its old renderer to run its onunload
// handler now. We will wait until the unload is finished and (if a transfer
// is needed) for the new renderer's request to arrive.
- GURL transfer_url;
+ // The |transfer_url_chain| contains any redirect URLs that have already
+ // occurred, plus the destination URL at the end.
+ std::vector<GURL> transfer_url_chain;
Referrer referrer;
int frame_id = -1;
if (should_transfer) {
- transfer_url = request()->url();
+ transfer_url_chain = request()->url_chain();
referrer = Referrer(GURL(request()->referrer()), info->GetReferrerPolicy());
frame_id = info->GetFrameID();
ResourceDispatcherHostImpl::Get()->MarkAsTransferredNavigation(
- global_id, transfer_url);
+ global_id, transfer_url_chain.front());
}
BrowserThread::PostTask(
BrowserThread::UI,
FROM_HERE,
base::Bind(
&OnCrossSiteResponseHelper,
- info->GetChildID(),
info->GetRouteID(),
global_id,
should_transfer,
- transfer_url,
+ transfer_url_chain,
referrer,
+ info->GetPageTransition(),
frame_id));
}