diff options
Diffstat (limited to 'chrome/browser/navigation_controller_unittest.cc')
-rw-r--r-- | chrome/browser/navigation_controller_unittest.cc | 184 |
1 files changed, 182 insertions, 2 deletions
diff --git a/chrome/browser/navigation_controller_unittest.cc b/chrome/browser/navigation_controller_unittest.cc index 759ad6f..ed27d84 100644 --- a/chrome/browser/navigation_controller_unittest.cc +++ b/chrome/browser/navigation_controller_unittest.cc @@ -429,7 +429,7 @@ TEST_F(NavigationControllerTest, LoadURL_Discarded) { EXPECT_TRUE(notifications.Check1AndReset(NOTIFY_NAV_ENTRY_COMMITTED)); contents->controller()->LoadURL(url2, PageTransition::TYPED); - contents->controller()->DiscardPendingEntry(); + contents->controller()->DiscardNonCommittedEntries(); EXPECT_EQ(0, notifications.size()); // Should not have produced a new session history entry. @@ -1140,7 +1140,7 @@ TEST_F(NavigationControllerTest, SwitchTypes_Discard) { // The tab contents should have been replaced ASSERT_TRUE(initial_contents != contents); - contents->controller()->DiscardPendingEntry(); + contents->controller()->DiscardNonCommittedEntries(); EXPECT_EQ(0, notifications.size()); // The tab contents should have been replaced back @@ -1352,6 +1352,186 @@ TEST_F(NavigationControllerTest, Interstitial) { contents->controller()->GetLastCommittedEntry()->page_type()); } +TEST_F(NavigationControllerTest, RemoveEntry) { + const GURL url1("test1:foo1"); + const GURL url2("test1:foo2"); + const GURL url3("test1:foo3"); + const GURL url4("test1:foo4"); + const GURL url5("test1:foo5"); + const GURL pending_url("test1:pending"); + const GURL default_url("test1:default"); + + contents->controller()->LoadURL(url1, PageTransition::TYPED); + contents->CompleteNavigationAsRenderer(0, url1); + contents->controller()->LoadURL(url2, PageTransition::TYPED); + contents->CompleteNavigationAsRenderer(1, url2); + contents->controller()->LoadURL(url3, PageTransition::TYPED); + contents->CompleteNavigationAsRenderer(2, url3); + contents->controller()->LoadURL(url4, PageTransition::TYPED); + contents->CompleteNavigationAsRenderer(3, url4); + contents->controller()->LoadURL(url5, PageTransition::TYPED); + contents->CompleteNavigationAsRenderer(4, url5); + + // Remove the last entry. + contents->controller()->RemoveEntryAtIndex( + contents->controller()->GetEntryCount() - 1, default_url); + EXPECT_EQ(4, contents->controller()->GetEntryCount()); + EXPECT_EQ(3, contents->controller()->GetLastCommittedEntryIndex()); + NavigationEntry* pending_entry = contents->controller()->GetPendingEntry(); + EXPECT_TRUE(pending_entry && pending_entry->url() == url4); + + // Add a pending entry. + contents->controller()->LoadURL(pending_url, PageTransition::TYPED); + // Now remove the last entry. + contents->controller()->RemoveEntryAtIndex( + contents->controller()->GetEntryCount() - 1, default_url); + // The pending entry should have been discarded and the last committed entry + // removed. + EXPECT_EQ(3, contents->controller()->GetEntryCount()); + EXPECT_EQ(2, contents->controller()->GetLastCommittedEntryIndex()); + pending_entry = contents->controller()->GetPendingEntry(); + EXPECT_TRUE(pending_entry && pending_entry->url() == url3); + + // Remove an entry which is not the last committed one. + contents->controller()->RemoveEntryAtIndex(0, default_url); + EXPECT_EQ(2, contents->controller()->GetEntryCount()); + EXPECT_EQ(1, contents->controller()->GetLastCommittedEntryIndex()); + // No navigation should have been initiated since we did not remove the + // current entry. + EXPECT_FALSE(contents->controller()->GetPendingEntry()); + + // Remove the 2 remaining entries. + contents->controller()->RemoveEntryAtIndex(1, default_url); + contents->controller()->RemoveEntryAtIndex(0, default_url); + + // This should have created a pending default entry. + EXPECT_EQ(0, contents->controller()->GetEntryCount()); + EXPECT_EQ(-1, contents->controller()->GetLastCommittedEntryIndex()); + pending_entry = contents->controller()->GetPendingEntry(); + EXPECT_TRUE(pending_entry && pending_entry->url() == default_url); +} + +// Tests the transient entry, making sure it goes away with all navigations. +TEST_F(NavigationControllerTest, TransientEntry) { + TestNotificationTracker notifications; + RegisterForAllNavNotifications(¬ifications, contents->controller()); + + const GURL url0("test1:foo0"); + const GURL url1("test1:foo1"); + const GURL url2("test1:foo2"); + const GURL url3("test1:foo3"); + const GURL url4("test1:foo4"); + const GURL transient_url("test1:transient"); + + contents->controller()->LoadURL(url0, PageTransition::TYPED); + contents->CompleteNavigationAsRenderer(0, url0); + contents->controller()->LoadURL(url1, PageTransition::TYPED); + contents->CompleteNavigationAsRenderer(1, url1); + + notifications.Reset(); + + // Adding a transient with no pending entry. + NavigationEntry* transient_entry = new NavigationEntry(TAB_CONTENTS_WEB); + transient_entry->set_url(transient_url); + contents->controller()->AddTransientEntry(transient_entry); + + // We should not have received any notifications. + EXPECT_EQ(0, notifications.size()); + + // Check our state. + EXPECT_EQ(transient_url, contents->controller()->GetActiveEntry()->url()); + EXPECT_EQ(contents->controller()->GetEntryCount(), 3); + EXPECT_EQ(contents->controller()->GetLastCommittedEntryIndex(), 1); + EXPECT_EQ(contents->controller()->GetPendingEntryIndex(), -1); + EXPECT_TRUE(contents->controller()->GetLastCommittedEntry()); + EXPECT_FALSE(contents->controller()->GetPendingEntry()); + EXPECT_TRUE(contents->controller()->CanGoBack()); + EXPECT_FALSE(contents->controller()->CanGoForward()); + EXPECT_EQ(contents->GetMaxPageID(), 1); + + // Navigate. + contents->controller()->LoadURL(url2, PageTransition::TYPED); + contents->CompleteNavigationAsRenderer(2, url2); + + // We should have navigated, transient entry should be gone. + EXPECT_EQ(url2, contents->controller()->GetActiveEntry()->url()); + EXPECT_EQ(contents->controller()->GetEntryCount(), 3); + + // Add a transient again, then navigate with no pending entry this time. + transient_entry = new NavigationEntry(TAB_CONTENTS_WEB); + transient_entry->set_url(transient_url); + contents->controller()->AddTransientEntry(transient_entry); + EXPECT_EQ(transient_url, contents->controller()->GetActiveEntry()->url()); + contents->CompleteNavigationAsRenderer(3, url3); + // Transient entry should be gone. + EXPECT_EQ(url3, contents->controller()->GetActiveEntry()->url()); + EXPECT_EQ(contents->controller()->GetEntryCount(), 4); + + // Initiate a navigation, add a transient then commit navigation. + contents->controller()->LoadURL(url4, PageTransition::TYPED); + transient_entry = new NavigationEntry(TAB_CONTENTS_WEB); + transient_entry->set_url(transient_url); + contents->controller()->AddTransientEntry(transient_entry); + EXPECT_EQ(transient_url, contents->controller()->GetActiveEntry()->url()); + contents->CompleteNavigationAsRenderer(4, url4); + EXPECT_EQ(url4, contents->controller()->GetActiveEntry()->url()); + EXPECT_EQ(contents->controller()->GetEntryCount(), 5); + + // Add a transient and go back. This should simply remove the transient. + transient_entry = new NavigationEntry(TAB_CONTENTS_WEB); + transient_entry->set_url(transient_url); + contents->controller()->AddTransientEntry(transient_entry); + EXPECT_EQ(transient_url, contents->controller()->GetActiveEntry()->url()); + EXPECT_TRUE(contents->controller()->CanGoBack()); + EXPECT_FALSE(contents->controller()->CanGoForward()); + contents->controller()->GoBack(); + // Transient entry should be gone. + EXPECT_EQ(url4, contents->controller()->GetActiveEntry()->url()); + EXPECT_EQ(contents->controller()->GetEntryCount(), 5); + contents->CompleteNavigationAsRenderer(3, url3); + + // Add a transient and go to an entry before the current one. + transient_entry = new NavigationEntry(TAB_CONTENTS_WEB); + transient_entry->set_url(transient_url); + contents->controller()->AddTransientEntry(transient_entry); + EXPECT_EQ(transient_url, contents->controller()->GetActiveEntry()->url()); + contents->controller()->GoToIndex(1); + // The navigation should have been initiated, transient entry should be gone. + EXPECT_EQ(url1, contents->controller()->GetActiveEntry()->url()); + contents->CompleteNavigationAsRenderer(1, url1); + + // Add a transient and go to an entry after the current one. + transient_entry = new NavigationEntry(TAB_CONTENTS_WEB); + transient_entry->set_url(transient_url); + contents->controller()->AddTransientEntry(transient_entry); + EXPECT_EQ(transient_url, contents->controller()->GetActiveEntry()->url()); + contents->controller()->GoToIndex(3); + // The navigation should have been initiated, transient entry should be gone. + // Because of the transient entry that is removed, going to index 3 makes us + // land on url2. + EXPECT_EQ(url2, contents->controller()->GetActiveEntry()->url()); + contents->CompleteNavigationAsRenderer(2, url2); + + // Add a transient and go forward. + transient_entry = new NavigationEntry(TAB_CONTENTS_WEB); + transient_entry->set_url(transient_url); + contents->controller()->AddTransientEntry(transient_entry); + EXPECT_EQ(transient_url, contents->controller()->GetActiveEntry()->url()); + EXPECT_TRUE(contents->controller()->CanGoForward()); + contents->controller()->GoForward(); + // We should have navigated, transient entry should be gone. + EXPECT_EQ(url3, contents->controller()->GetActiveEntry()->url()); + contents->CompleteNavigationAsRenderer(3, url3); + + // Ensure the URLS are correct. + EXPECT_EQ(contents->controller()->GetEntryCount(), 5); + EXPECT_EQ(contents->controller()->GetEntryAtIndex(0)->url(), url0); + EXPECT_EQ(contents->controller()->GetEntryAtIndex(1)->url(), url1); + EXPECT_EQ(contents->controller()->GetEntryAtIndex(2)->url(), url2); + EXPECT_EQ(contents->controller()->GetEntryAtIndex(3)->url(), url3); + EXPECT_EQ(contents->controller()->GetEntryAtIndex(4)->url(), url4); +} + // Tests that IsInPageNavigation returns appropriate results. Prevents // regression for bug 1126349. TEST_F(NavigationControllerTest, IsInPageNavigation) { |