Chromium Code Reviews| Index: content/browser/frame_host/render_frame_host_manager.cc |
| =================================================================== |
| --- content/browser/frame_host/render_frame_host_manager.cc (revision 250813) |
| +++ content/browser/frame_host/render_frame_host_manager.cc (working copy) |
| @@ -18,6 +18,7 @@ |
| #include "content/browser/frame_host/navigation_entry_impl.h" |
| #include "content/browser/frame_host/render_frame_host_factory.h" |
| #include "content/browser/frame_host/render_frame_host_impl.h" |
| +#include "content/browser/renderer_host/cross_site_request_transfer.h" |
| #include "content/browser/renderer_host/render_process_host_impl.h" |
| #include "content/browser/renderer_host/render_view_host_factory.h" |
| #include "content/browser/renderer_host/render_view_host_impl.h" |
| @@ -37,20 +38,16 @@ |
| namespace content { |
| -RenderFrameHostManager::PendingNavigationParams::PendingNavigationParams() |
| - : is_transfer(false), frame_id(-1), should_replace_current_entry(false) { |
| -} |
| - |
| RenderFrameHostManager::PendingNavigationParams::PendingNavigationParams( |
| const GlobalRequestID& global_request_id, |
| - bool is_transfer, |
| + scoped_ptr<CrossSiteRequestTransfer> cross_site_request_transfer, |
| const std::vector<GURL>& transfer_url_chain, |
| Referrer referrer, |
| PageTransition page_transition, |
| int64 frame_id, |
| bool should_replace_current_entry) |
| : global_request_id(global_request_id), |
| - is_transfer(is_transfer), |
| + cross_site_request_transfer(cross_site_request_transfer.Pass()), |
| transfer_url_chain(transfer_url_chain), |
| referrer(referrer), |
| page_transition(page_transition), |
| @@ -279,7 +276,7 @@ |
| // TODO(creis): The blank swapped out page is visible during this time, but |
| // we can shorten this by delivering the response directly, rather than |
| // forcing an identical request to be made. |
| - if (pending_nav_params_->is_transfer) { |
| + if (pending_nav_params_->cross_site_request_transfer) { |
| // Treat the last URL in the chain as the destination and the remainder as |
| // the redirect chain. |
| CHECK(pending_nav_params_->transfer_url_chain.size()); |
| @@ -328,7 +325,7 @@ |
| // TODO(creis): The blank swapped out page is visible during this time, but |
| // we can shorten this by delivering the response directly, rather than |
| // forcing an identical request to be made. |
| - if (pending_nav_params_->is_transfer) { |
| + if (pending_nav_params_->cross_site_request_transfer) { |
| // Treat the last URL in the chain as the destination and the remainder as |
| // the redirect chain. |
| CHECK(pending_nav_params_->transfer_url_chain.size()); |
| @@ -480,7 +477,7 @@ |
| void RenderFrameHostManager::OnCrossSiteResponse( |
| RenderViewHost* pending_render_view_host, |
| const GlobalRequestID& global_request_id, |
| - bool is_transfer, |
| + scoped_ptr<CrossSiteRequestTransfer> cross_site_request_transfer, |
| const std::vector<GURL>& transfer_url_chain, |
| const Referrer& referrer, |
| PageTransition page_transition, |
| @@ -496,10 +493,11 @@ |
| // here, but currently we pass information for a transfer if |
| // ShouldSwapProcessesForRedirect returned true in the network stack. |
| // In that case, we should set up a transfer after the unload handler runs. |
| - // If is_transfer is false, we will just run the unload handler and resume. |
| + // If |cross_site_request_transfer| is NULL, we will just run the unload |
| + // handler and resume. |
| pending_nav_params_.reset(new PendingNavigationParams( |
| - global_request_id, is_transfer, transfer_url_chain, referrer, |
| - page_transition, frame_id, should_replace_current_entry)); |
| + global_request_id, cross_site_request_transfer.Pass(), transfer_url_chain, |
| + referrer, page_transition, frame_id, should_replace_current_entry)); |
| // Run the unload handler of the current page. |
| SwapOutOldPage(); |
| @@ -1222,6 +1220,15 @@ |
| if (force_swap) |
| CHECK_NE(new_instance, current_instance); |
| + // If entry includes the request ID of a request that is being transferred, |
| + // either the old renderer is about to to reclaim it, or a new one is going |
|
Charlie Reis
2014/02/13 22:12:19
nit: to to
I'm not sure I follow this. Do you me
mmenke
2014/02/14 16:30:02
I mean the current_instance can take ownership - I
|
| + // claim ownership, so release ownership of the request. |
| + if (pending_nav_params_ && |
| + pending_nav_params_->global_request_id == |
| + entry.transferred_global_request_id()) { |
| + pending_nav_params_->cross_site_request_transfer->ReleaseRequest(); |
| + } |
| + |
| if (new_instance != current_instance) { |
| // New SiteInstance: create a pending RFH to navigate. |
| DCHECK(!cross_navigation_pending_); |