| Index: content/browser/web_contents/navigation_controller_impl_unittest.cc
|
| diff --git a/content/browser/web_contents/navigation_controller_impl_unittest.cc b/content/browser/web_contents/navigation_controller_impl_unittest.cc
|
| index a1904d04e2de3d9da87c046157cdf89cb64bbf2a..67f54a452efe51aa3c9c3f4f33012e6ee7b235e3 100644
|
| --- a/content/browser/web_contents/navigation_controller_impl_unittest.cc
|
| +++ b/content/browser/web_contents/navigation_controller_impl_unittest.cc
|
| @@ -2611,6 +2611,44 @@ TEST_F(NavigationControllerTest, ReloadTransient) {
|
| EXPECT_EQ(controller.GetEntryAtIndex(1)->GetURL(), transient_url);
|
| }
|
|
|
| +// Ensure that renderer initiated pending entries get replaced, so that we
|
| +// don't show a stale virtual URL when a navigation commits.
|
| +// See http://crbug.com/266922.
|
| +TEST_F(NavigationControllerTest, RendererInitiatedPendingEntries) {
|
| + NavigationControllerImpl& controller = controller_impl();
|
| +
|
| + const GURL url1("nonexistent:12121");
|
| + const GURL url1_fixed("http://nonexistent:12121/");
|
| + const GURL url2("http://foo");
|
| +
|
| + // We create pending entries for renderer-initiated navigations so that we
|
| + // can show them in new tabs when it is safe.
|
| + contents()->DidStartProvisionalLoadForFrame(
|
| + test_rvh(), 1, -1, true, url1);
|
| +
|
| + // Simulate what happens if a BrowserURLHandler rewrites the URL, causing
|
| + // the virtual URL to differ from the URL.
|
| + controller.GetPendingEntry()->SetURL(url1_fixed);
|
| + controller.GetPendingEntry()->SetVirtualURL(url1);
|
| +
|
| + EXPECT_EQ(url1_fixed, controller.GetPendingEntry()->GetURL());
|
| + EXPECT_EQ(url1, controller.GetPendingEntry()->GetVirtualURL());
|
| + EXPECT_TRUE(
|
| + NavigationEntryImpl::FromNavigationEntry(controller.GetPendingEntry())->
|
| + is_renderer_initiated());
|
| +
|
| + // If the user clicks another link, we should replace the pending entry.
|
| + contents()->DidStartProvisionalLoadForFrame(
|
| + test_rvh(), 1, -1, true, url2);
|
| + EXPECT_EQ(url2, controller.GetPendingEntry()->GetURL());
|
| + EXPECT_EQ(url2, controller.GetPendingEntry()->GetVirtualURL());
|
| +
|
| + // Once it commits, the URL and virtual URL should reflect the actual page.
|
| + test_rvh()->SendNavigate(0, url2);
|
| + EXPECT_EQ(url2, controller.GetLastCommittedEntry()->GetURL());
|
| + EXPECT_EQ(url2, controller.GetLastCommittedEntry()->GetVirtualURL());
|
| +}
|
| +
|
| // Tests that the URLs for renderer-initiated navigations are not displayed to
|
| // the user until the navigation commits, to prevent URL spoof attacks.
|
| // See http://crbug.com/99016.
|
|
|