| Index: content/browser/frame_host/navigation_controller_impl_browsertest.cc | 
| diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc | 
| index 079902d6041b44b7db2351bb032e40ad9f45f36e..795402bbec2ecf91b397dd9271ffe20202563410 100644 | 
| --- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc | 
| +++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc | 
| @@ -6909,4 +6909,61 @@ IN_PROC_BROWSER_TEST_F(RequestMonitoringNavigationBrowserTest, | 
| testing::Key("X-ExtraHeadersVsSubresources")))); | 
| } | 
|  | 
| +// Test that a same-page navigation does not lead to the deletion of the | 
| +// NavigationHandle for an ongoing different page navigation. | 
| +IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, | 
| +                       SamePageNavigationDoesntDeleteNavigationHandle) { | 
| +  const GURL kURL1 = embedded_test_server()->GetURL("/title1.html"); | 
| +  const GURL kPushStateURL = | 
| +      embedded_test_server()->GetURL("/title1.html#fragment"); | 
| +  const GURL kURL2 = embedded_test_server()->GetURL("/title2.html"); | 
| + | 
| +  // Navigate to the initial page. | 
| +  EXPECT_TRUE(NavigateToURL(shell(), kURL1)); | 
| +  RenderFrameHostImpl* main_frame = | 
| +      static_cast<WebContentsImpl*>(shell()->web_contents())->GetMainFrame(); | 
| +  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) | 
| +                            ->GetFrameTree() | 
| +                            ->root(); | 
| +  EXPECT_FALSE(main_frame->navigation_handle()); | 
| +  EXPECT_FALSE(root->navigation_request()); | 
| + | 
| +  // Start navigating to the second page. | 
| +  TestNavigationManager manager(shell()->web_contents(), kURL2); | 
| +  shell()->web_contents()->GetController().LoadURL( | 
| +      kURL2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); | 
| +  EXPECT_TRUE(manager.WaitForRequestStart()); | 
| + | 
| +  // This should create a NavigationHandle. | 
| +  if (IsBrowserSideNavigationEnabled()) { | 
| +    EXPECT_TRUE(root->navigation_request()); | 
| +  } else { | 
| +    EXPECT_TRUE(main_frame->navigation_handle()); | 
| +  } | 
| + | 
| +  // The current page does a PushState. | 
| +  std::string push_state = | 
| +      "var stateObj = {}; history.pushState(stateObj, \"title 1\", \"" + | 
| +      kPushStateURL.spec() + "\");"; | 
| +  EXPECT_TRUE(ExecuteScript(shell()->web_contents(), push_state)); | 
| +  NavigationEntry* last_committed = | 
| +      shell()->web_contents()->GetController().GetLastCommittedEntry(); | 
| +  ASSERT_TRUE(last_committed); | 
| +  EXPECT_EQ(kPushStateURL, last_committed->GetURL()); | 
| + | 
| +  // This shouldn't affect the ongoing navigation. | 
| +  if (IsBrowserSideNavigationEnabled()) { | 
| +    EXPECT_TRUE(root->navigation_request()); | 
| +  } else { | 
| +    EXPECT_TRUE(main_frame->navigation_handle()); | 
| +  } | 
| + | 
| +  // Let the navigation finish. It should commit successfully. | 
| +  manager.WaitForNavigationFinished(); | 
| +  last_committed = | 
| +      shell()->web_contents()->GetController().GetLastCommittedEntry(); | 
| +  ASSERT_TRUE(last_committed); | 
| +  EXPECT_EQ(kURL2, last_committed->GetURL()); | 
| +} | 
| + | 
| }  // namespace content | 
|  |