Chromium Code Reviews| Index: content/browser/loader/cross_site_resource_handler.cc |
| =================================================================== |
| --- content/browser/loader/cross_site_resource_handler.cc (revision 250813) |
| +++ content/browser/loader/cross_site_resource_handler.cc (working copy) |
| @@ -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_request_transfer.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,21 @@ |
| namespace { |
| +bool leak_requests_for_testing_ = false; |
|
Charlie Reis
2014/02/13 22:12:19
This seems unfortunate, but I don't have a better
mmenke
2014/02/14 16:30:02
I agree. I couldn't think of something better to
|
| + |
| // 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, |
| + CrossSiteResourceHandler* cross_site_resource_handler) |
| : render_view_id(render_view_id), |
| global_request_id(global_request_id), |
| is_transfer(is_transfer), |
| @@ -48,7 +53,8 @@ |
| referrer(referrer), |
| page_transition(page_transition), |
| frame_id(frame_id), |
| - should_replace_current_entry(should_replace_current_entry) { |
| + should_replace_current_entry(should_replace_current_entry), |
| + cross_site_resource_handler(cross_site_resource_handler) { |
| } |
| int render_view_id; |
| @@ -59,18 +65,29 @@ |
| PageTransition page_transition; |
| int64 frame_id; |
| bool should_replace_current_entry; |
| + CrossSiteResourceHandler* cross_site_resource_handler; |
| }; |
| void OnCrossSiteResponseHelper(const CrossSiteResponseParams& params) { |
| + scoped_ptr<CrossSiteRequestTransfer> cross_site_request_transfer; |
| + if (params.is_transfer) { |
| + cross_site_request_transfer.reset(new CrossSiteRequestTransfer( |
| + params.cross_site_resource_handler)); |
| + } |
| + |
| 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_request_transfer.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_request_transfer) { |
| + // Some unit tests expect requests to be leaked in this case, so they can |
| + // pass them along manually. |
| + cross_site_request_transfer->ReleaseRequest(); |
| } |
| } |
| @@ -83,8 +100,7 @@ |
| has_started_response_(false), |
| in_cross_site_transition_(false), |
| completed_during_transition_(false), |
| - did_defer_(false), |
| - completed_status_() { |
| + did_defer_(false) { |
| } |
| CrossSiteResourceHandler::~CrossSiteResourceHandler() { |
| @@ -259,6 +275,27 @@ |
| } |
| } |
| +void CrossSiteResourceHandler::AbortTransfer() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + // Cancelling the request is not strictly necessary, since nothing is |
|
Charlie Reis
2014/02/13 22:12:19
Is it not done by the CancelRequest call below? (
mmenke
2014/02/14 16:30:02
No, it's not. Despite its name, ResourceDispatche
Charlie Reis
2014/02/15 01:25:44
Ah.
|
| + // listening to it, but it makes for clearer logs and cleaner tests. |
| + request()->Cancel(); |
| + |
| + // Clean up the request. |
| + ResourceRequestInfoImpl* info = GetRequestInfo(); |
| + ResourceDispatcherHostImpl::Get()->CancelRequest(info->GetChildID(), |
| + info->GetRequestID()); |
| + |
| + // |this| should now be deleted. |
| +} |
| + |
| +// 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( |
| @@ -306,7 +343,8 @@ |
| referrer, |
| info->GetPageTransition(), |
| frame_id, |
| - info->should_replace_current_entry()))); |
| + info->should_replace_current_entry(), |
| + this))); |
| } |
| void CrossSiteResourceHandler::ResumeIfDeferred() { |