Index: chrome/browser/sessions/tab_restore_service_unittest.cc |
=================================================================== |
--- chrome/browser/sessions/tab_restore_service_unittest.cc (revision 57231) |
+++ chrome/browser/sessions/tab_restore_service_unittest.cc (working copy) |
@@ -1,483 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/defaults.h" |
-#include "chrome/browser/renderer_host/test/test_render_view_host.h" |
-#include "chrome/browser/sessions/session_types.h" |
-#include "chrome/browser/sessions/session_service.h" |
-#include "chrome/browser/sessions/tab_restore_service.h" |
-#include "chrome/browser/tab_contents/navigation_entry.h" |
-#include "chrome/test/render_view_test.h" |
-#include "chrome/test/testing_profile.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebKit.h" |
- |
-// Create subclass that overrides TimeNow so that we can control the time used |
-// for closed tabs and windows. |
-class TabRestoreTimeFactory : public TabRestoreService::TimeFactory { |
- public: |
- TabRestoreTimeFactory() : time_(base::Time::Now()) {} |
- |
- virtual ~TabRestoreTimeFactory() {} |
- |
- virtual base::Time TimeNow() { |
- return time_; |
- } |
- |
- private: |
- base::Time time_; |
-}; |
- |
-class TabRestoreServiceTest : public RenderViewHostTestHarness { |
- public: |
- TabRestoreServiceTest() { |
- url1_ = GURL("http://1"); |
- url2_ = GURL("http://2"); |
- url3_ = GURL("http://3"); |
- } |
- |
- ~TabRestoreServiceTest() { |
- } |
- |
- protected: |
- // testing::Test overrides |
- virtual void SetUp() { |
- RenderViewHostTestHarness::SetUp(); |
- time_factory_ = new TabRestoreTimeFactory(); |
- service_ = new TabRestoreService(profile(), time_factory_); |
- WebKit::initialize(&webkitclient_); |
- } |
- |
- virtual void TearDown() { |
- service_ = NULL; |
- delete time_factory_; |
- RenderViewHostTestHarness::TearDown(); |
- WebKit::shutdown(); |
- } |
- |
- void AddThreeNavigations() { |
- // Navigate to three URLs. |
- NavigateAndCommit(url1_); |
- NavigateAndCommit(url2_); |
- NavigateAndCommit(url3_); |
- } |
- |
- void NavigateToIndex(int index) { |
- // Navigate back. We have to do this song and dance as NavigationController |
- // isn't happy if you navigate immediately while going back. |
- controller().GoToIndex(index); |
- rvh()->SendNavigate(controller().pending_entry()->page_id(), |
- controller().pending_entry()->url()); |
- } |
- |
- void RecreateService() { |
- // Must set service to null first so that it is destroyed before the new |
- // one is created. |
- service_ = NULL; |
- service_ = new TabRestoreService(profile(), time_factory_); |
- service_->LoadTabsFromLastSession(); |
- } |
- |
- // Adds a window with one tab and url to the profile's session service. |
- // If |pinned| is true, the tab is marked as pinned in the session service. |
- void AddWindowWithOneTabToSessionService(bool pinned) { |
- 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); |
- if (pinned) |
- session_service->SetPinnedState(window_id, tab_id, true); |
- NavigationEntry entry; |
- 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. If |pinned| is true, the |
- // tab is marked as pinned in the session service. |
- void CreateSessionServiceWithOneWindow(bool pinned) { |
- // The profile takes ownership of this. |
- SessionService* session_service = new SessionService(profile()); |
- profile()->set_session_service(session_service); |
- |
- AddWindowWithOneTabToSessionService(pinned); |
- |
- // Set this, otherwise previous session won't be loaded. |
- profile()->set_last_session_exited_cleanly(false); |
- } |
- |
- GURL url1_; |
- GURL url2_; |
- GURL url3_; |
- scoped_refptr<TabRestoreService> service_; |
- TabRestoreTimeFactory* time_factory_; |
- RenderViewTest::RendererWebKitClientImplNoSandbox webkitclient_; |
-}; |
- |
-TEST_F(TabRestoreServiceTest, Basic) { |
- AddThreeNavigations(); |
- |
- // Have the service record the tab. |
- service_->CreateHistoricalTab(&controller()); |
- |
- // Make sure an entry was created. |
- ASSERT_EQ(1U, service_->entries().size()); |
- |
- // Make sure the entry matches. |
- TabRestoreService::Entry* entry = service_->entries().front(); |
- ASSERT_EQ(TabRestoreService::TAB, entry->type); |
- TabRestoreService::Tab* tab = static_cast<TabRestoreService::Tab*>(entry); |
- EXPECT_FALSE(tab->pinned); |
- EXPECT_TRUE(tab->extension_app_id.empty()); |
- ASSERT_EQ(3U, tab->navigations.size()); |
- EXPECT_TRUE(url1_ == tab->navigations[0].virtual_url()); |
- EXPECT_TRUE(url2_ == tab->navigations[1].virtual_url()); |
- EXPECT_TRUE(url3_ == tab->navigations[2].virtual_url()); |
- EXPECT_EQ(2, tab->current_navigation_index); |
- EXPECT_EQ(time_factory_->TimeNow().ToInternalValue(), |
- tab->timestamp.ToInternalValue()); |
- |
- NavigateToIndex(1); |
- |
- // And check again. |
- service_->CreateHistoricalTab(&controller()); |
- |
- // There should be two entries now. |
- ASSERT_EQ(2U, service_->entries().size()); |
- |
- // Make sure the entry matches |
- entry = service_->entries().front(); |
- ASSERT_EQ(TabRestoreService::TAB, entry->type); |
- tab = static_cast<TabRestoreService::Tab*>(entry); |
- EXPECT_FALSE(tab->pinned); |
- ASSERT_EQ(3U, tab->navigations.size()); |
- EXPECT_TRUE(url1_ == tab->navigations[0].virtual_url()); |
- EXPECT_TRUE(url2_ == tab->navigations[1].virtual_url()); |
- EXPECT_TRUE(url3_ == tab->navigations[2].virtual_url()); |
- EXPECT_EQ(1, tab->current_navigation_index); |
- EXPECT_EQ(time_factory_->TimeNow().ToInternalValue(), |
- tab->timestamp.ToInternalValue()); |
-} |
- |
-// Make sure TabRestoreService doesn't create an entry for a tab with no |
-// navigations. |
-TEST_F(TabRestoreServiceTest, DontCreateEmptyTab) { |
- service_->CreateHistoricalTab(&controller()); |
- EXPECT_TRUE(service_->entries().empty()); |
-} |
- |
-// Tests restoring a single tab. |
-TEST_F(TabRestoreServiceTest, Restore) { |
- AddThreeNavigations(); |
- |
- // Have the service record the tab. |
- service_->CreateHistoricalTab(&controller()); |
- |
- // Recreate the service and have it load the tabs. |
- RecreateService(); |
- |
- // One entry should be created. |
- ASSERT_EQ(1U, service_->entries().size()); |
- |
- // And verify the entry. |
- TabRestoreService::Entry* entry = service_->entries().front(); |
- ASSERT_EQ(TabRestoreService::TAB, entry->type); |
- TabRestoreService::Tab* tab = static_cast<TabRestoreService::Tab*>(entry); |
- EXPECT_FALSE(tab->pinned); |
- ASSERT_EQ(3U, tab->navigations.size()); |
- EXPECT_TRUE(url1_ == tab->navigations[0].virtual_url()); |
- EXPECT_TRUE(url2_ == tab->navigations[1].virtual_url()); |
- EXPECT_TRUE(url3_ == tab->navigations[2].virtual_url()); |
- EXPECT_EQ(2, tab->current_navigation_index); |
- EXPECT_EQ(time_factory_->TimeNow().ToInternalValue(), |
- tab->timestamp.ToInternalValue()); |
-} |
- |
-// Tests restoring a single pinned tab. |
-TEST_F(TabRestoreServiceTest, RestorePinnedAndApp) { |
- AddThreeNavigations(); |
- |
- // Have the service record the tab. |
- service_->CreateHistoricalTab(&controller()); |
- |
- // One entry should be created. |
- ASSERT_EQ(1U, service_->entries().size()); |
- |
- // We have to explicitly mark the tab as pinned as there is no browser for |
- // these tests. |
- TabRestoreService::Entry* entry = service_->entries().front(); |
- ASSERT_EQ(TabRestoreService::TAB, entry->type); |
- TabRestoreService::Tab* tab = static_cast<TabRestoreService::Tab*>(entry); |
- tab->pinned = true; |
- const std::string extension_app_id("test"); |
- tab->extension_app_id = extension_app_id; |
- |
- // Recreate the service and have it load the tabs. |
- RecreateService(); |
- |
- // One entry should be created. |
- ASSERT_EQ(1U, service_->entries().size()); |
- |
- // And verify the entry. |
- entry = service_->entries().front(); |
- ASSERT_EQ(TabRestoreService::TAB, entry->type); |
- tab = static_cast<TabRestoreService::Tab*>(entry); |
- EXPECT_TRUE(tab->pinned); |
- ASSERT_EQ(3U, tab->navigations.size()); |
- EXPECT_TRUE(url1_ == tab->navigations[0].virtual_url()); |
- EXPECT_TRUE(url2_ == tab->navigations[1].virtual_url()); |
- EXPECT_TRUE(url3_ == tab->navigations[2].virtual_url()); |
- EXPECT_EQ(2, tab->current_navigation_index); |
- EXPECT_TRUE(extension_app_id == tab->extension_app_id); |
-} |
- |
-// Make sure we persist entries to disk that have post data. |
-TEST_F(TabRestoreServiceTest, DontPersistPostData) { |
- AddThreeNavigations(); |
- controller().GetEntryAtIndex(0)->set_has_post_data(true); |
- controller().GetEntryAtIndex(1)->set_has_post_data(true); |
- controller().GetEntryAtIndex(2)->set_has_post_data(true); |
- |
- // Have the service record the tab. |
- service_->CreateHistoricalTab(&controller()); |
- ASSERT_EQ(1U, service_->entries().size()); |
- |
- // Recreate the service and have it load the tabs. |
- RecreateService(); |
- |
- // One entry should be created. |
- ASSERT_EQ(1U, service_->entries().size()); |
- |
- const TabRestoreService::Entry* restored_entry = service_->entries().front(); |
- ASSERT_EQ(TabRestoreService::TAB, restored_entry->type); |
- |
- const TabRestoreService::Tab* restored_tab = |
- static_cast<const TabRestoreService::Tab*>(restored_entry); |
- // There should be 3 navs. |
- ASSERT_EQ(3U, restored_tab->navigations.size()); |
- EXPECT_EQ(time_factory_->TimeNow().ToInternalValue(), |
- restored_tab->timestamp.ToInternalValue()); |
-} |
- |
-// Make sure we don't persist entries to disk that have post data. This |
-// differs from DontPersistPostData1 in that all the navigations have post |
-// data, so that nothing should be persisted. |
-TEST_F(TabRestoreServiceTest, DontLoadTwice) { |
- AddThreeNavigations(); |
- |
- // Have the service record the tab. |
- service_->CreateHistoricalTab(&controller()); |
- ASSERT_EQ(1U, service_->entries().size()); |
- |
- // Recreate the service and have it load the tabs. |
- RecreateService(); |
- |
- service_->LoadTabsFromLastSession(); |
- |
- // There should only be one entry. |
- ASSERT_EQ(1U, service_->entries().size()); |
-} |
- |
-// Makes sure we load the previous session as necessary. |
-TEST_F(TabRestoreServiceTest, LoadPreviousSession) { |
- CreateSessionServiceWithOneWindow(false); |
- |
- profile()->GetSessionService()->MoveCurrentSessionToLastSession(); |
- |
- service_->LoadTabsFromLastSession(); |
- |
- // Make sure we get back one entry with one tab whose url is url1. |
- ASSERT_EQ(1U, 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(1U, window->tabs.size()); |
- EXPECT_EQ(0, window->timestamp.ToInternalValue()); |
- EXPECT_EQ(0, window->selected_tab_index); |
- ASSERT_EQ(1U, window->tabs[0].navigations.size()); |
- EXPECT_EQ(0, window->tabs[0].current_navigation_index); |
- EXPECT_EQ(0, window->tabs[0].timestamp.ToInternalValue()); |
- EXPECT_TRUE(url1_ == window->tabs[0].navigations[0].virtual_url()); |
-} |
- |
-// Makes sure we don't attempt to load previous sessions after a restore. |
-TEST_F(TabRestoreServiceTest, DontLoadAfterRestore) { |
- CreateSessionServiceWithOneWindow(false); |
- |
- profile()->GetSessionService()->MoveCurrentSessionToLastSession(); |
- |
- profile()->set_restored_last_session(true); |
- |
- service_->LoadTabsFromLastSession(); |
- |
- // Because we restored a session TabRestoreService shouldn't load the tabs. |
- ASSERT_EQ(0U, service_->entries().size()); |
-} |
- |
-// Makes sure we don't attempt to load previous sessions after a clean exit. |
-TEST_F(TabRestoreServiceTest, DontLoadAfterCleanExit) { |
- CreateSessionServiceWithOneWindow(false); |
- |
- profile()->GetSessionService()->MoveCurrentSessionToLastSession(); |
- |
- profile()->set_last_session_exited_cleanly(true); |
- |
- service_->LoadTabsFromLastSession(); |
- |
- ASSERT_EQ(0U, service_->entries().size()); |
-} |
- |
-TEST_F(TabRestoreServiceTest, LoadPreviousSessionAndTabs) { |
- CreateSessionServiceWithOneWindow(false); |
- |
- 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(2U, 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(1U, window->tabs.size()); |
- EXPECT_EQ(0, window->selected_tab_index); |
- EXPECT_EQ(0, window->timestamp.ToInternalValue()); |
- ASSERT_EQ(1U, window->tabs[0].navigations.size()); |
- EXPECT_EQ(0, window->tabs[0].current_navigation_index); |
- EXPECT_EQ(0, window->tabs[0].timestamp.ToInternalValue()); |
- EXPECT_TRUE(url1_ == window->tabs[0].navigations[0].virtual_url()); |
- |
- // Then the closed tab. |
- entry = *(++service_->entries().begin()); |
- ASSERT_EQ(TabRestoreService::TAB, entry->type); |
- TabRestoreService::Tab* tab = static_cast<TabRestoreService::Tab*>(entry); |
- ASSERT_FALSE(tab->pinned); |
- ASSERT_EQ(3U, tab->navigations.size()); |
- EXPECT_EQ(2, tab->current_navigation_index); |
- EXPECT_EQ(time_factory_->TimeNow().ToInternalValue(), |
- tab->timestamp.ToInternalValue()); |
- EXPECT_TRUE(url1_ == tab->navigations[0].virtual_url()); |
- EXPECT_TRUE(url2_ == tab->navigations[1].virtual_url()); |
- EXPECT_TRUE(url3_ == tab->navigations[2].virtual_url()); |
-} |
- |
-// Make sure pinned state is correctly loaded from session service. |
-TEST_F(TabRestoreServiceTest, LoadPreviousSessionAndTabsPinned) { |
- CreateSessionServiceWithOneWindow(true); |
- |
- 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(2U, 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(1U, window->tabs.size()); |
- EXPECT_EQ(0, window->selected_tab_index); |
- EXPECT_TRUE(window->tabs[0].pinned); |
- ASSERT_EQ(1U, window->tabs[0].navigations.size()); |
- EXPECT_EQ(0, window->tabs[0].current_navigation_index); |
- EXPECT_TRUE(url1_ == window->tabs[0].navigations[0].virtual_url()); |
- |
- // Then the closed tab. |
- entry = *(++service_->entries().begin()); |
- ASSERT_EQ(TabRestoreService::TAB, entry->type); |
- TabRestoreService::Tab* tab = static_cast<TabRestoreService::Tab*>(entry); |
- ASSERT_FALSE(tab->pinned); |
- ASSERT_EQ(3U, tab->navigations.size()); |
- EXPECT_EQ(2, tab->current_navigation_index); |
- EXPECT_TRUE(url1_ == tab->navigations[0].virtual_url()); |
- EXPECT_TRUE(url2_ == tab->navigations[1].virtual_url()); |
- EXPECT_TRUE(url3_ == tab->navigations[2].virtual_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(false); |
- |
- for (size_t i = 0; i < TabRestoreService::kMaxEntries; ++i) |
- AddWindowWithOneTabToSessionService(false); |
- |
- 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(1U, window->tabs.size()); |
- EXPECT_EQ(0, window->selected_tab_index); |
- EXPECT_EQ(0, window->timestamp.ToInternalValue()); |
- ASSERT_EQ(1U, window->tabs[0].navigations.size()); |
- EXPECT_EQ(0, window->tabs[0].current_navigation_index); |
- EXPECT_EQ(0, window->tabs[0].timestamp.ToInternalValue()); |
- EXPECT_TRUE(url1_ == window->tabs[0].navigations[0].virtual_url()); |
-} |
- |
-// Makes sure we restore the time stamp correctly. |
-TEST_F(TabRestoreServiceTest, TimestampSurvivesRestore) { |
- base::Time tab_timestamp(base::Time::FromInternalValue(123456789)); |
- |
- AddThreeNavigations(); |
- |
- // Have the service record the tab. |
- service_->CreateHistoricalTab(&controller()); |
- |
- // Make sure an entry was created. |
- ASSERT_EQ(1U, service_->entries().size()); |
- |
- // Make sure the entry matches. |
- TabRestoreService::Entry* entry = service_->entries().front(); |
- ASSERT_EQ(TabRestoreService::TAB, entry->type); |
- TabRestoreService::Tab* tab = static_cast<TabRestoreService::Tab*>(entry); |
- tab->timestamp = tab_timestamp; |
- |
- // Set this, otherwise previous session won't be loaded. |
- profile()->set_last_session_exited_cleanly(false); |
- |
- RecreateService(); |
- |
- // One entry should be created. |
- ASSERT_EQ(1U, service_->entries().size()); |
- |
- // And verify the entry. |
- TabRestoreService::Entry* restored_entry = service_->entries().front(); |
- ASSERT_EQ(TabRestoreService::TAB, restored_entry->type); |
- TabRestoreService::Tab* restored_tab = |
- static_cast<TabRestoreService::Tab*>(restored_entry); |
- EXPECT_EQ(tab_timestamp.ToInternalValue(), |
- restored_tab->timestamp.ToInternalValue()); |
-} |