diff options
author | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-15 08:29:50 +0000 |
---|---|---|
committer | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-15 08:29:50 +0000 |
commit | c96e97084010855c8567a02b5b37a074f36b9264 (patch) | |
tree | 5904035e9ee4ecd1a47d9b77e61d4f1ce226f2d8 /content/browser/loader/cross_site_resource_handler.cc | |
parent | 477fa792c3d4d86c03aeacad95cd36a1f2b14b0f (diff) | |
download | chromium_src-c96e97084010855c8567a02b5b37a074f36b9264.zip chromium_src-c96e97084010855c8567a02b5b37a074f36b9264.tar.gz chromium_src-c96e97084010855c8567a02b5b37a074f36b9264.tar.bz2 |
When cross-site navigations are cancelled, delete the
ResourceLoader that would have been trasferred to the
new renderer. These were being leaked, and would keep
a lock on disk cache entries, making a page impossible
to visit after a cancelled cross site navigation to it.
BUG=341134
Review URL: https://codereview.chromium.org/143183009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@251561 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 | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/content/browser/loader/cross_site_resource_handler.cc b/content/browser/loader/cross_site_resource_handler.cc index 75009a29..2ed007a 100644 --- a/content/browser/loader/cross_site_resource_handler.cc +++ b/content/browser/loader/cross_site_resource_handler.cc @@ -13,6 +13,7 @@ #include "content/browser/cross_site_request_manager.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/browser/loader/resource_request_info_impl.h" +#include "content/browser/renderer_host/cross_site_transferring_request.h" #include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/public/browser/browser_thread.h" @@ -30,17 +31,20 @@ namespace content { namespace { +bool leak_requests_for_testing_ = false; + // The parameters to OnCrossSiteResponseHelper exceed the number of arguments // base::Bind supports. struct CrossSiteResponseParams { - CrossSiteResponseParams(int render_view_id, - const GlobalRequestID& global_request_id, - bool is_transfer, - const std::vector<GURL>& transfer_url_chain, - const Referrer& referrer, - PageTransition page_transition, - int64 frame_id, - bool should_replace_current_entry) + CrossSiteResponseParams( + int render_view_id, + const GlobalRequestID& global_request_id, + bool is_transfer, + const std::vector<GURL>& transfer_url_chain, + const Referrer& referrer, + PageTransition page_transition, + int64 frame_id, + bool should_replace_current_entry) : render_view_id(render_view_id), global_request_id(global_request_id), is_transfer(is_transfer), @@ -62,15 +66,25 @@ struct CrossSiteResponseParams { }; void OnCrossSiteResponseHelper(const CrossSiteResponseParams& params) { + scoped_ptr<CrossSiteTransferringRequest> cross_site_transferring_request; + if (params.is_transfer) { + cross_site_transferring_request.reset(new CrossSiteTransferringRequest( + params.global_request_id)); + } + RenderViewHostImpl* rvh = RenderViewHostImpl::FromID(params.global_request_id.child_id, params.render_view_id); if (rvh) { rvh->OnCrossSiteResponse( - params.global_request_id, params.is_transfer, + params.global_request_id, cross_site_transferring_request.Pass(), params.transfer_url_chain, params.referrer, params.page_transition, params.frame_id, params.should_replace_current_entry); + } else if (leak_requests_for_testing_ && cross_site_transferring_request) { + // Some unit tests expect requests to be leaked in this case, so they can + // pass them along manually. + cross_site_transferring_request->ReleaseRequest(); } } @@ -83,8 +97,7 @@ CrossSiteResourceHandler::CrossSiteResourceHandler( has_started_response_(false), in_cross_site_transition_(false), completed_during_transition_(false), - did_defer_(false), - completed_status_() { + did_defer_(false) { } CrossSiteResourceHandler::~CrossSiteResourceHandler() { @@ -263,6 +276,12 @@ void CrossSiteResourceHandler::ResumeResponse() { } } +// static +void CrossSiteResourceHandler::SetLeakRequestsForTesting( + bool leak_requests_for_testing) { + leak_requests_for_testing_ = leak_requests_for_testing; +} + // Prepare to render the cross-site response in a new RenderViewHost, by // telling the old RenderViewHost to run its onunload handler. void CrossSiteResourceHandler::StartCrossSiteTransition( |