Index: chrome/browser/sessions/tab_restore_service_unittest.cc |
=================================================================== |
--- chrome/browser/sessions/tab_restore_service_unittest.cc (revision 7147) |
+++ chrome/browser/sessions/tab_restore_service_unittest.cc (working copy) |
@@ -53,6 +53,34 @@ |
service_->LoadTabsFromLastSession(); |
} |
+ // Adds a window with one tab and url to the profile's session service. |
+ void AddWindowWithOneTabToSessionService() { |
+ SessionService* session_service = profile_->GetSessionService(); |
+ SessionID tab_id; |
+ SessionID window_id; |
+ session_service->SetWindowType(window_id, Browser::TYPE_NORMAL); |
+ session_service->SetTabWindow(window_id, tab_id); |
+ session_service->SetTabIndexInWindow(window_id, tab_id, 0); |
+ session_service->SetSelectedTabInWindow(window_id, 0); |
+ NavigationEntry entry(tab_contents_factory_->type()); |
+ entry.set_url(url1_); |
+ session_service->UpdateTabNavigation(window_id, tab_id, 0, entry); |
+ } |
+ |
+ // Creates a SessionService and assigns it to the Profile. The SessionService |
+ // is configured with a single window with a single tab pointing at url1_ by |
+ // way of AddWindowWithOneTabToSessionService. |
+ void CreateSessionServiceWithOneWindow() { |
+ // The profile takes ownership of this. |
+ SessionService* session_service = new SessionService(profile_.get()); |
+ profile_->set_session_service(session_service); |
+ |
+ AddWindowWithOneTabToSessionService(); |
+ |
+ // Set this, otherwise previous session won't be loaded. |
+ profile_->set_last_session_exited_cleanly(false); |
+ } |
+ |
GURL url1_; |
GURL url2_; |
GURL url3_; |
@@ -244,3 +272,119 @@ |
// There should only be one entry. |
ASSERT_EQ(1, service_->entries().size()); |
} |
+ |
+// Makes sure we load the previous session as necessary. |
+TEST_F(TabRestoreServiceTest, LoadPreviousSession) { |
+ CreateSessionServiceWithOneWindow(); |
+ |
+ profile_->GetSessionService()->MoveCurrentSessionToLastSession(); |
+ |
+ service_->LoadTabsFromLastSession(); |
+ |
+ // Make sure we get back one entry with one tab whose url is url1. |
+ ASSERT_EQ(1, service_->entries().size()); |
+ TabRestoreService::Entry* entry2 = service_->entries().front(); |
+ ASSERT_EQ(TabRestoreService::WINDOW, entry2->type); |
+ TabRestoreService::Window* window = |
+ static_cast<TabRestoreService::Window*>(entry2); |
+ ASSERT_EQ(1, window->tabs.size()); |
+ EXPECT_EQ(0, window->selected_tab_index); |
+ ASSERT_EQ(1, window->tabs[0].navigations.size()); |
+ EXPECT_EQ(0, window->tabs[0].current_navigation_index); |
+ EXPECT_TRUE(url1_ == window->tabs[0].navigations[0].url()); |
+} |
+ |
+// Makes sure we don't attempt to load previous sessions after a restore. |
+TEST_F(TabRestoreServiceTest, DontLoadAfterRestore) { |
+ CreateSessionServiceWithOneWindow(); |
+ |
+ profile_->GetSessionService()->MoveCurrentSessionToLastSession(); |
+ |
+ profile_->set_restored_last_session(true); |
+ |
+ service_->LoadTabsFromLastSession(); |
+ |
+ // Because we restored a session TabRestoreService shouldn't load the tabs. |
+ ASSERT_EQ(0, service_->entries().size()); |
+} |
+ |
+// Makes sure we don't attempt to load previous sessions after a clean exit. |
+TEST_F(TabRestoreServiceTest, DontLoadAfterCleanExit) { |
+ CreateSessionServiceWithOneWindow(); |
+ |
+ profile_->GetSessionService()->MoveCurrentSessionToLastSession(); |
+ |
+ profile_->set_last_session_exited_cleanly(true); |
+ |
+ service_->LoadTabsFromLastSession(); |
+ |
+ ASSERT_EQ(0, service_->entries().size()); |
+} |
+ |
+TEST_F(TabRestoreServiceTest, LoadPreviousSessionAndTabs) { |
+ CreateSessionServiceWithOneWindow(); |
+ |
+ profile_->GetSessionService()->MoveCurrentSessionToLastSession(); |
+ |
+ AddThreeNavigations(); |
+ |
+ service_->CreateHistoricalTab(controller_); |
+ |
+ RecreateService(); |
+ |
+ // We should get back two entries, one from the previous session and one from |
+ // the tab restore service. The previous session entry should be first. |
+ ASSERT_EQ(2, service_->entries().size()); |
+ // The first entry should come from the session service. |
+ TabRestoreService::Entry* entry = service_->entries().front(); |
+ ASSERT_EQ(TabRestoreService::WINDOW, entry->type); |
+ TabRestoreService::Window* window = |
+ static_cast<TabRestoreService::Window*>(entry); |
+ ASSERT_EQ(1, window->tabs.size()); |
+ EXPECT_EQ(0, window->selected_tab_index); |
+ ASSERT_EQ(1, window->tabs[0].navigations.size()); |
+ EXPECT_EQ(0, window->tabs[0].current_navigation_index); |
+ EXPECT_TRUE(url1_ == window->tabs[0].navigations[0].url()); |
+ |
+ // Then the closed tab. |
+ entry = *(++service_->entries().begin()); |
+ ASSERT_EQ(TabRestoreService::TAB, entry->type); |
+ TabRestoreService::Tab* tab = static_cast<TabRestoreService::Tab*>(entry); |
+ ASSERT_EQ(3, tab->navigations.size()); |
+ EXPECT_EQ(2, tab->current_navigation_index); |
+ EXPECT_TRUE(url1_ == tab->navigations[0].url()); |
+ EXPECT_TRUE(url2_ == tab->navigations[1].url()); |
+ EXPECT_TRUE(url3_ == tab->navigations[2].url()); |
+} |
+ |
+// Creates TabRestoreService::kMaxEntries + 1 windows in the session service |
+// and makes sure we only get back TabRestoreService::kMaxEntries on restore. |
+TEST_F(TabRestoreServiceTest, ManyWindowsInSessionService) { |
+ CreateSessionServiceWithOneWindow(); |
+ |
+ for (size_t i = 0; i < TabRestoreService::kMaxEntries; ++i) |
+ AddWindowWithOneTabToSessionService(); |
+ |
+ profile_->GetSessionService()->MoveCurrentSessionToLastSession(); |
+ |
+ AddThreeNavigations(); |
+ |
+ service_->CreateHistoricalTab(controller_); |
+ |
+ RecreateService(); |
+ |
+ // We should get back kMaxEntries entries. We added more, but |
+ // TabRestoreService only allows up to kMaxEntries. |
+ ASSERT_EQ(TabRestoreService::kMaxEntries, service_->entries().size()); |
+ |
+ // The first entry should come from the session service. |
+ TabRestoreService::Entry* entry = service_->entries().front(); |
+ ASSERT_EQ(TabRestoreService::WINDOW, entry->type); |
+ TabRestoreService::Window* window = |
+ static_cast<TabRestoreService::Window*>(entry); |
+ ASSERT_EQ(1, window->tabs.size()); |
+ EXPECT_EQ(0, window->selected_tab_index); |
+ ASSERT_EQ(1, window->tabs[0].navigations.size()); |
+ EXPECT_EQ(0, window->tabs[0].current_navigation_index); |
+ EXPECT_TRUE(url1_ == window->tabs[0].navigations[0].url()); |
+} |