| 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 7b804bca2ea1d38f6213268a4d532646e5af3aa7..b64af9abe8acce4fd5dfc61a78a21e329e54b82d 100644
|
| --- a/content/browser/frame_host/navigator_impl.cc
|
| +++ b/content/browser/frame_host/navigator_impl.cc
|
| @@ -381,7 +381,21 @@ bool NavigatorImpl::NavigateToEntry(
|
| delegate_->AboutToNavigateRenderFrame(dest_render_frame_host);
|
|
|
| // Navigate in the desired RenderFrameHost.
|
| - dest_render_frame_host->Navigate(navigate_params);
|
| + // 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.
|
| + 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);
|
|
|