| 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 e4afbe62a6628ddf93e7e7c52ef6c120d1189dc8..95295b5448f0a7b32aa9eea0590dd002f4b2cff9 100644
|
| --- a/content/browser/frame_host/navigator_impl.cc
|
| +++ b/content/browser/frame_host/navigator_impl.cc
|
| @@ -698,7 +698,7 @@ void NavigatorImpl::OnBeforeUnloadACK(FrameTreeNode* frame_tree_node,
|
| }
|
|
|
| // PlzNavigate
|
| -void NavigatorImpl::OnBeginNavigation(
|
| +void NavigatorImpl::RendererInitiatedNavigationRequest(
|
| FrameTreeNode* frame_tree_node,
|
| const CommonNavigationParams& common_params,
|
| const BeginNavigationParams& begin_params,
|
| @@ -707,10 +707,22 @@ void NavigatorImpl::OnBeginNavigation(
|
| switches::kEnableBrowserSideNavigation));
|
| DCHECK(frame_tree_node);
|
|
|
| - // This is a renderer-initiated navigation, so generate a new
|
| - // NavigationRequest and store it in the map.
|
| - // TODO(clamy): Renderer-initiated navigations should not always cancel the
|
| - // current one.
|
| + NavigationRequest* ongoing_navigation_request =
|
| + navigation_request_map_.get(frame_tree_node->frame_tree_node_id());
|
| +
|
| + // The renderer-initiated navigation request is ignored iff a) there is an
|
| + // ongoing request b) which is browser or user-initiated and c) the renderer
|
| + // request is not user-initiated.
|
| + if (ongoing_navigation_request &&
|
| + (ongoing_navigation_request->browser_initiated() ||
|
| + ongoing_navigation_request->begin_params().has_user_gesture) &&
|
| + !begin_params.has_user_gesture) {
|
| + return;
|
| + }
|
| +
|
| + // In all other cases the current navigation, if any, is canceled and a new
|
| + // NavigationRequest is created and stored in the map. Actual cancellation
|
| + // happens when the existing request map entry is replaced and destroyed.
|
| scoped_ptr<NavigationRequest> navigation_request =
|
| NavigationRequest::CreateRendererInitiated(
|
| frame_tree_node, common_params, begin_params, body);
|
|
|