diff options
author | creis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-30 03:18:57 +0000 |
---|---|---|
committer | creis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-30 03:18:57 +0000 |
commit | f8872901ddae10fd4b03fa350e60deb30c6a2f38 (patch) | |
tree | 4214acda4cadf683b5dab7b8293c67d13c10aad3 /content/browser/loader/cross_site_resource_handler.cc | |
parent | 00880a0c5a9b4add3539e63c509e5117f1074b0a (diff) | |
download | chromium_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.cc | 25 |
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)); } |