summaryrefslogtreecommitdiffstats
path: root/content/browser/loader/cross_site_resource_handler.cc
diff options
context:
space:
mode:
authormmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-15 08:29:50 +0000
committermmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-15 08:29:50 +0000
commitc96e97084010855c8567a02b5b37a074f36b9264 (patch)
tree5904035e9ee4ecd1a47d9b77e61d4f1ce226f2d8 /content/browser/loader/cross_site_resource_handler.cc
parent477fa792c3d4d86c03aeacad95cd36a1f2b14b0f (diff)
downloadchromium_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.cc41
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(