Index: content/browser/frame_host/navigator_impl.cc |
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc |
index 0d6bf9dfa5c51e1b0aea61f522dc83fc5d90b06d..81fcdba3ffa3210a685406dabb25b0f0235ccb57 100644 |
--- a/content/browser/frame_host/navigator_impl.cc |
+++ b/content/browser/frame_host/navigator_impl.cc |
@@ -373,10 +373,24 @@ bool NavigatorImpl::NavigateToEntry( |
current_load_start_ = base::TimeTicks::Now(); |
// Navigate in the desired RenderFrameHost. |
+ // We can skip this step in the rare case that this is a transfer navigation |
+ // which began in the chosen RenderFrameHost, since the request has already |
+ // been issued. In that case, simply resume the response. |
FrameMsg_Navigate_Params navigate_params; |
MakeNavigateParams(entry, *controller_, reload_type, navigation_start, |
&navigate_params); |
- dest_render_frame_host->Navigate(navigate_params); |
+ bool is_transfer_to_same = |
+ navigate_params.transferred_request_child_id != -1 && |
+ navigate_params.transferred_request_child_id == |
+ dest_render_frame_host->GetProcess()->GetID(); |
+ if (!is_transfer_to_same) { |
+ dest_render_frame_host->Navigate(navigate_params); |
+ } else { |
+ // No need to navigate again. Just resume the deferred request. |
+ dest_render_frame_host->GetProcess()->ResumeDeferredNavigation( |
+ GlobalRequestID(navigate_params.transferred_request_child_id, |
+ navigate_params.transferred_request_request_id)); |
+ } |
// Make sure no code called via RFH::Navigate clears the pending entry. |
CHECK_EQ(controller_->GetPendingEntry(), &entry); |