| 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 7457ed9dd47e8308d1c175a5c5cad3e42ca70917..9e67f2dd762e01a36c1b4f27f225a18af7db142b 100644
|
| --- a/content/browser/frame_host/navigator_impl.cc
|
| +++ b/content/browser/frame_host/navigator_impl.cc
|
| @@ -338,14 +338,24 @@ bool NavigatorImpl::NavigateToEntry(
|
| // Double check that here.
|
| CheckWebUIRendererDoesNotDisplayNormalURL(dest_render_frame_host, dest_url);
|
|
|
| + // In the case of a transfer navigation, set the destination RenderFrameHost
|
| + // as loading. This ensures that the RenderFrameHost gets in a loading state
|
| + // without emitting a spurrious DidStartLoading notification at the
|
| + // FrameTreeNode level (since the FrameTreeNode was already loading). Note
|
| + // that this works both for a transfer to a different RenderFrameHost and in
|
| + // the rare case where the navigation is transferred back to the same
|
| + // RenderFrameHost.
|
| + bool is_transfer = entry.transferred_global_request_id().child_id != -1;
|
| + if (is_transfer)
|
| + dest_render_frame_host->set_is_loading(true);
|
| +
|
| // 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.
|
| - bool is_transfer_to_same =
|
| - entry.transferred_global_request_id().child_id != -1 &&
|
| - entry.transferred_global_request_id().child_id ==
|
| - dest_render_frame_host->GetProcess()->GetID();
|
| + bool is_transfer_to_same = is_transfer &&
|
| + entry.transferred_global_request_id().child_id ==
|
| + dest_render_frame_host->GetProcess()->GetID();
|
| if (!is_transfer_to_same) {
|
| navigation_data_.reset(new NavigationMetricsData(navigation_start, dest_url,
|
| entry.restore_type()));
|
| @@ -371,6 +381,7 @@ bool NavigatorImpl::NavigateToEntry(
|
| controller_->GetEntryCount()));
|
| } else {
|
| // No need to navigate again. Just resume the deferred request.
|
| + // Also sets the RenderFrameHost back to a loading state again.
|
| dest_render_frame_host->GetProcess()->ResumeDeferredNavigation(
|
| entry.transferred_global_request_id());
|
| }
|
|
|