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); |