Index: content/browser/frame_host/navigation_controller_impl_unittest.cc |
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc |
index 0f5e0061e1afb7f54e54ad2cde93b8fac5a4c9f4..040b06fab6b4d12dd478ebfb32d502a67197fe9f 100644 |
--- a/content/browser/frame_host/navigation_controller_impl_unittest.cc |
+++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc |
@@ -5290,4 +5290,82 @@ TEST_F(NavigationControllerTest, MultipleNavigationsAndReload) { |
main_test_rfh()->SimulateNavigationCommit(url_1); |
} |
+// Test to ensure that the pending entry index is updated when a transient entry |
+// is inserted or removed. |
+TEST_F(NavigationControllerTest, PendingEntryIndexUpdatedWithTransient) { |
+ NavigationControllerImpl& controller = controller_impl(); |
+ const GURL url_0("http://foo/0"); |
+ const GURL url_1("http://foo/1"); |
+ const GURL url_transient_1("http://foo/transient_1"); |
+ const GURL url_transient_2("http://foo/transient_2"); |
+ |
+ NavigateAndCommit(url_0); |
+ NavigateAndCommit(url_1); |
+ controller.GoBack(); |
+ contents()->CommitPendingNavigation(); |
+ controller.GoForward(); |
+ |
+ // Check the state before the insertion of the transient entry. |
+ // entries[0] = url_0 <- last committed entry. |
+ // entries[1] = url_1 <- pending entry. |
+ ASSERT_EQ(2, controller.GetEntryCount()); |
+ EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); |
+ EXPECT_EQ(1, controller.GetPendingEntryIndex()); |
+ EXPECT_EQ(controller.GetEntryAtIndex(1), controller.GetPendingEntry()); |
+ EXPECT_EQ(url_0, controller.GetEntryAtIndex(0)->GetURL()); |
+ EXPECT_EQ(url_1, controller.GetEntryAtIndex(1)->GetURL()); |
+ |
+ // Insert a transient entry before the pending one. It should increase the |
+ // pending entry index by one (1 -> 2). |
+ std::unique_ptr<NavigationEntry> transient_entry_1(new NavigationEntryImpl); |
+ transient_entry_1->SetURL(url_transient_1); |
+ controller.SetTransientEntry(std::move(transient_entry_1)); |
+ |
+ // Check the state after the insertion of the transient entry. |
+ // entries[0] = url_0 <- last committed entry |
+ // entries[1] = url_transient_1 <- transient entry |
+ // entries[2] = url_1 <- pending entry |
+ ASSERT_EQ(3, controller.GetEntryCount()); |
+ EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); |
+ EXPECT_EQ(2, controller.GetPendingEntryIndex()); |
+ EXPECT_EQ(controller.GetEntryAtIndex(1), controller.GetTransientEntry()); |
+ EXPECT_EQ(controller.GetEntryAtIndex(2), controller.GetPendingEntry()); |
+ EXPECT_EQ(url_0, controller.GetEntryAtIndex(0)->GetURL()); |
+ EXPECT_EQ(url_transient_1, controller.GetEntryAtIndex(1)->GetURL()); |
+ EXPECT_EQ(url_1, controller.GetEntryAtIndex(2)->GetURL()); |
+ |
+ // Insert another transient entry. It should replace the previous one and this |
+ // time the pending entry index should retain its value (i.e. 2). |
+ std::unique_ptr<NavigationEntry> transient_entry_2(new NavigationEntryImpl); |
+ transient_entry_2->SetURL(url_transient_2); |
+ controller.SetTransientEntry(std::move(transient_entry_2)); |
+ |
+ // Check the state after the second insertion of a transient entry. |
+ // entries[0] = url_0 <- last committed entry |
+ // entries[1] = url_transient_2 <- transient entry |
+ // entries[2] = url_1 <- pending entry |
+ ASSERT_EQ(3, controller.GetEntryCount()); |
+ EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); |
+ EXPECT_EQ(2, controller.GetPendingEntryIndex()); |
+ EXPECT_EQ(controller.GetEntryAtIndex(1), controller.GetTransientEntry()); |
+ EXPECT_EQ(controller.GetEntryAtIndex(2), controller.GetPendingEntry()); |
+ EXPECT_EQ(url_0, controller.GetEntryAtIndex(0)->GetURL()); |
+ EXPECT_EQ(url_transient_2, controller.GetEntryAtIndex(1)->GetURL()); |
+ EXPECT_EQ(url_1, controller.GetEntryAtIndex(2)->GetURL()); |
+ |
+ // Commit the pending entry. |
+ contents()->CommitPendingNavigation(); |
+ |
+ // Check the final state. |
+ // entries[0] = url_0 |
+ // entries[1] = url_1 <- last committed entry |
+ ASSERT_EQ(2, controller.GetEntryCount()); |
+ EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); |
+ EXPECT_EQ(-1, controller.GetPendingEntryIndex()); |
+ EXPECT_EQ(nullptr, controller.GetPendingEntry()); |
+ EXPECT_EQ(nullptr, controller.GetTransientEntry()); |
+ EXPECT_EQ(url_0, controller.GetEntryAtIndex(0)->GetURL()); |
+ EXPECT_EQ(url_1, controller.GetEntryAtIndex(1)->GetURL()); |
+} |
+ |
} // namespace content |