diff options
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/navigation_controller_unittest.cc | 3 | ||||
-rw-r--r-- | chrome/browser/session_service.cc | 20 | ||||
-rw-r--r-- | chrome/browser/session_service.h | 24 | ||||
-rw-r--r-- | chrome/browser/session_service_test_helper.cc | 1 | ||||
-rw-r--r-- | chrome/browser/session_service_unittest.cc | 84 | ||||
-rw-r--r-- | chrome/browser/tab_restore_service.cc | 1 |
6 files changed, 93 insertions, 40 deletions
diff --git a/chrome/browser/navigation_controller_unittest.cc b/chrome/browser/navigation_controller_unittest.cc index f9f22e9..0a2527f 100644 --- a/chrome/browser/navigation_controller_unittest.cc +++ b/chrome/browser/navigation_controller_unittest.cc @@ -1136,10 +1136,8 @@ TEST_F(NavigationControllerHistoryTest, NavigationThenBack) { TabNavigation nav(0, url0, std::wstring(), std::string(), PageTransition::TYPED); helper_.AssertNavigationEquals(nav, windows_[0]->tabs[0]->navigations[0]); - nav.index = 1; nav.url = url1; helper_.AssertNavigationEquals(nav, windows_[0]->tabs[0]->navigations[1]); - nav.index = 2; nav.url = url2; helper_.AssertNavigationEquals(nav, windows_[0]->tabs[0]->navigations[2]); } @@ -1174,7 +1172,6 @@ TEST_F(NavigationControllerHistoryTest, NavigationPruning) { TabNavigation nav(0, url0, std::wstring(), std::string(), PageTransition::TYPED); helper_.AssertNavigationEquals(nav, windows_[0]->tabs[0]->navigations[0]); - nav.index = 1; nav.url = url2; helper_.AssertNavigationEquals(nav, windows_[0]->tabs[0]->navigations[1]); } diff --git a/chrome/browser/session_service.cc b/chrome/browser/session_service.cc index fe582d1..9784f8c 100644 --- a/chrome/browser/session_service.cc +++ b/chrome/browser/session_service.cc @@ -290,8 +290,7 @@ void SessionService::UpdateTabNavigation(const SessionID& window_id, const SessionID& tab_id, int index, const NavigationEntry& entry) { - if (!entry.display_url().is_valid() || - !ShouldTrackChangesToWindow(window_id)) + if (!ShouldTrackEntry(entry) || !ShouldTrackChangesToWindow(window_id)) return; if (tab_to_available_range_.find(tab_id.id()) != @@ -901,10 +900,12 @@ void SessionService::BuildCommandsForTab( const NavigationEntry* entry = (i == pending_index) ? controller->GetPendingEntry() : controller->GetEntryAtIndex(i); DCHECK(entry); - commands->push_back( - CreateUpdateTabNavigationCommand(controller->session_id(), - i, - *entry)); + if (ShouldTrackEntry(*entry)) { + commands->push_back( + CreateUpdateTabNavigationCommand(controller->session_id(), + i, + *entry)); + } } commands->push_back( CreateSetSelectedNavigationIndexCommand(controller->session_id(), @@ -1137,9 +1138,14 @@ bool SessionService::ShouldTrackChangesToWindow(const SessionID& window_id) { return windows_tracking_.find(window_id.id()) != windows_tracking_.end(); } +bool SessionService::ShouldTrackEntry(const NavigationEntry& entry) { + // Don't track entries that have post data. Post data may contain passwords + // and other sensitive data users don't want stored to disk. + return entry.display_url().is_valid() && !entry.has_post_data(); +} + // InternalSavedSessionRequest ------------------------------------------------ SessionService::InternalSavedSessionRequest::~InternalSavedSessionRequest() { STLDeleteElements(&commands); } - diff --git a/chrome/browser/session_service.h b/chrome/browser/session_service.h index 9d75707..aa2779f 100644 --- a/chrome/browser/session_service.h +++ b/chrome/browser/session_service.h @@ -36,28 +36,27 @@ class Thread; // TabNavigation corresponds to a NavigationEntry. struct TabNavigation { + friend class SessionService; + enum TypeMask { HAS_POST_DATA = 1 }; - TabNavigation() : index(-1), transition(PageTransition::TYPED), type_mask(0) { + TabNavigation() : transition(PageTransition::TYPED), type_mask(0), index(-1) { } TabNavigation(int index, const GURL& url, const std::wstring& title, const std::string& state, PageTransition::Type transition) - : index(index), - url(url), + : url(url), title(title), state(state), transition(transition), - type_mask(0) {} + type_mask(0), + index(index) {} - // The index in the NavigationController. If this is -1, it means this - // TabNavigation is bogus. - int index; GURL url; // The title of the page. std::wstring title; @@ -67,6 +66,14 @@ struct TabNavigation { // A mask used for arbitrary boolean values needed to represent a // NavigationEntry. Currently only contains HAS_POST_DATA or 0. int type_mask; + + private: + // The index in the NavigationController. If this is -1, it means this + // TabNavigation is bogus. + // + // This is used when determining the selected TabNavigation and only useful + // by SessionService. + int index; }; // SessionTab ---------------------------------------------------------------- @@ -497,6 +504,9 @@ class SessionService : public CancelableRequestProvider, // Returns true if changes to tabs in the specified window should be tracked. bool ShouldTrackChangesToWindow(const SessionID& window_id); + // Should we track the specified entry? + bool SessionService::ShouldTrackEntry(const NavigationEntry& entry); + // Returns true if we track changes to the specified browser type. static bool should_track_changes_for_browser_type(BrowserType::Type type) { return type == BrowserType::TABBED_BROWSER; diff --git a/chrome/browser/session_service_test_helper.cc b/chrome/browser/session_service_test_helper.cc index 334f73f..a793ed0 100644 --- a/chrome/browser/session_service_test_helper.cc +++ b/chrome/browser/session_service_test_helper.cc @@ -58,7 +58,6 @@ void SessionServiceTestHelper::AssertTabEquals( void SessionServiceTestHelper::AssertNavigationEquals( const TabNavigation& expected, const TabNavigation& actual) { - EXPECT_EQ(expected.index, actual.index); EXPECT_TRUE(expected.url == actual.url); EXPECT_EQ(expected.title, actual.title); EXPECT_EQ(expected.state, actual.state); diff --git a/chrome/browser/session_service_unittest.cc b/chrome/browser/session_service_unittest.cc index d24ec11..59379a3 100644 --- a/chrome/browser/session_service_unittest.cc +++ b/chrome/browser/session_service_unittest.cc @@ -43,6 +43,7 @@ class SessionServiceTest : public testing::Test { void UpdateNavigation(const SessionID& window_id, const SessionID& tab_id, const TabNavigation& navigation, + int index, bool select) { NavigationEntry entry(TAB_CONTENTS_UNKNOWN_TYPE); entry.set_url(navigation.url); @@ -51,10 +52,9 @@ class SessionServiceTest : public testing::Test { entry.set_transition_type(navigation.transition); entry.set_has_post_data( navigation.type_mask & TabNavigation::HAS_POST_DATA); - service()->UpdateTabNavigation(window_id, tab_id, navigation.index, entry); + service()->UpdateTabNavigation(window_id, tab_id, index, entry); if (select) - service()->SetSelectedNavigationIndex(window_id, tab_id, - navigation.index); + service()->SetSelectedNavigationIndex(window_id, tab_id, index); } void ReadWindows(std::vector<SessionWindow*>* windows) { @@ -85,10 +85,9 @@ TEST_F(SessionServiceTest, Basic) { TabNavigation nav1(0, GURL("http://google.com"), L"abc", "def", PageTransition::QUALIFIER_MASK); - nav1.type_mask = TabNavigation::HAS_POST_DATA; helper_.PrepareTabInWindow(window_id, tab_id, 0, true); - UpdateNavigation(window_id, tab_id, nav1, true); + UpdateNavigation(window_id, tab_id, nav1, 0, true); ScopedVector<SessionWindow> windows; ReadWindows(&(windows.get())); @@ -106,6 +105,53 @@ TEST_F(SessionServiceTest, Basic) { helper_.AssertNavigationEquals(nav1, tab->navigations[0]); } +// Creates a navigation entry with post data, saves it, and makes sure it does +// not get restored. +TEST_F(SessionServiceTest, PrunePostData1) { + SessionID tab_id; + ASSERT_NE(window_id.id(), tab_id.id()); + + TabNavigation nav1(0, GURL("http://google.com"), L"abc", "def", + PageTransition::QUALIFIER_MASK); + nav1.type_mask = TabNavigation::HAS_POST_DATA; + + helper_.PrepareTabInWindow(window_id, tab_id, 0, true); + UpdateNavigation(window_id, tab_id, nav1, 0, true); + + ScopedVector<SessionWindow> windows; + ReadWindows(&(windows.get())); + + ASSERT_EQ(0, windows->size()); +} + +// Creates two navigation entries, one with post data one without. Restores +// and verifies we get back only the entry with no post data. +TEST_F(SessionServiceTest, PrunePostData2) { + SessionID tab_id; + ASSERT_NE(window_id.id(), tab_id.id()); + + TabNavigation nav1(0, GURL("http://google.com"), L"abc", "def", + PageTransition::QUALIFIER_MASK); + nav1.type_mask = TabNavigation::HAS_POST_DATA; + TabNavigation nav2(0, GURL("http://google2.com"), L"abc", "def", + PageTransition::QUALIFIER_MASK); + + helper_.PrepareTabInWindow(window_id, tab_id, 0, true); + UpdateNavigation(window_id, tab_id, nav1, 0, true); + UpdateNavigation(window_id, tab_id, nav2, 1, false); + + ScopedVector<SessionWindow> windows; + ReadWindows(&(windows.get())); + + ASSERT_EQ(1, windows->size()); + ASSERT_EQ(0, windows[0]->selected_tab_index); + + SessionTab* tab = windows[0]->tabs[0]; + helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab); + + helper_.AssertNavigationEquals(nav2, tab->navigations[0]); +} + TEST_F(SessionServiceTest, ClosingTabStaysClosed) { SessionID tab_id; SessionID tab2_id; @@ -117,10 +163,10 @@ TEST_F(SessionServiceTest, ClosingTabStaysClosed) { PageTransition::AUTO_BOOKMARK); helper_.PrepareTabInWindow(window_id, tab_id, 0, true); - UpdateNavigation(window_id, tab_id, nav1, true); + UpdateNavigation(window_id, tab_id, nav1, 0, true); helper_.PrepareTabInWindow(window_id, tab2_id, 1, false); - UpdateNavigation(window_id, tab2_id, nav2, true); + UpdateNavigation(window_id, tab2_id, nav2, 0, true); service()->TabClosed(window_id, tab2_id); ScopedVector<SessionWindow> windows; @@ -148,8 +194,7 @@ TEST_F(SessionServiceTest, Pruning) { helper_.PrepareTabInWindow(window_id, tab_id, 0, true); for (int i = 0; i < 6; ++i) { TabNavigation& nav = (i % 2) == 0 ? nav1 : nav2; - nav.index = i; - UpdateNavigation(window_id, tab_id, nav, true); + UpdateNavigation(window_id, tab_id, nav, i, true); } service()->TabNavigationPathPruned(window_id, tab_id, 3); @@ -165,11 +210,8 @@ TEST_F(SessionServiceTest, Pruning) { // index should get reset to last valid navigation, which is 2. helper_.AssertTabEquals(window_id, tab_id, 0, 2, 3, *tab); - nav1.index = 0; helper_.AssertNavigationEquals(nav1, tab->navigations[0]); - nav2.index = 1; helper_.AssertNavigationEquals(nav2, tab->navigations[1]); - nav1.index = 2; helper_.AssertNavigationEquals(nav1, tab->navigations[2]); } @@ -184,13 +226,13 @@ TEST_F(SessionServiceTest, TwoWindows) { PageTransition::AUTO_BOOKMARK); helper_.PrepareTabInWindow(window_id, tab1_id, 0, true); - UpdateNavigation(window_id, tab1_id, nav1, true); + UpdateNavigation(window_id, tab1_id, nav1, 0, true); const gfx::Rect window2_bounds(3, 4, 5, 6); service()->SetWindowType(window2_id, BrowserType::TABBED_BROWSER); service()->SetWindowBounds(window2_id, window2_bounds, true); helper_.PrepareTabInWindow(window2_id, tab2_id, 0, true); - UpdateNavigation(window2_id, tab2_id, nav2, true); + UpdateNavigation(window2_id, tab2_id, nav2, 0, true); ScopedVector<SessionWindow> windows; ReadWindows(&(windows.get())); @@ -235,7 +277,7 @@ TEST_F(SessionServiceTest, WindowWithNoTabsGetsPruned) { PageTransition::QUALIFIER_MASK); helper_.PrepareTabInWindow(window_id, tab1_id, 0, true); - UpdateNavigation(window_id, tab1_id, nav1, true); + UpdateNavigation(window_id, tab1_id, nav1, 0, true); const gfx::Rect window2_bounds(3, 4, 5, 6); service()->SetWindowType(window2_id, BrowserType::TABBED_BROWSER); @@ -266,10 +308,10 @@ TEST_F(SessionServiceTest, ClosingWindowDoesntCloseTabs) { PageTransition::AUTO_BOOKMARK); helper_.PrepareTabInWindow(window_id, tab_id, 0, true); - UpdateNavigation(window_id, tab_id, nav1, true); + UpdateNavigation(window_id, tab_id, nav1, 0, true); helper_.PrepareTabInWindow(window_id, tab2_id, 1, false); - UpdateNavigation(window_id, tab2_id, nav2, true); + UpdateNavigation(window_id, tab2_id, nav2, 0, true); service()->WindowClosing(window_id); @@ -305,10 +347,10 @@ TEST_F(SessionServiceTest, WindowCloseCommittedAfterNavigate) { PageTransition::AUTO_BOOKMARK); helper_.PrepareTabInWindow(window_id, tab_id, 0, true); - UpdateNavigation(window_id, tab_id, nav1, true); + UpdateNavigation(window_id, tab_id, nav1, 0, true); helper_.PrepareTabInWindow(window2_id, tab2_id, 0, false); - UpdateNavigation(window2_id, tab2_id, nav2, true); + UpdateNavigation(window2_id, tab2_id, nav2, 0, true); service()->WindowClosing(window2_id); service()->TabClosed(window2_id, tab2_id); @@ -343,10 +385,10 @@ TEST_F(SessionServiceTest, IgnorePopups) { PageTransition::AUTO_BOOKMARK); helper_.PrepareTabInWindow(window_id, tab_id, 0, true); - UpdateNavigation(window_id, tab_id, nav1, true); + UpdateNavigation(window_id, tab_id, nav1, 0, true); helper_.PrepareTabInWindow(window2_id, tab2_id, 0, false); - UpdateNavigation(window2_id, tab2_id, nav2, true); + UpdateNavigation(window2_id, tab2_id, nav2, 0, true); ScopedVector<SessionWindow> windows; ReadWindows(&(windows.get())); diff --git a/chrome/browser/tab_restore_service.cc b/chrome/browser/tab_restore_service.cc index ef7a973..9b3bd4a 100644 --- a/chrome/browser/tab_restore_service.cc +++ b/chrome/browser/tab_restore_service.cc @@ -156,7 +156,6 @@ void TabRestoreService::PopulateTabFromController( NavigationEntry* entry = (i == pending_index) ? controller->GetPendingEntry() : controller->GetEntryAtIndex(i); TabNavigation& tab_nav = tab->navigations[i]; - tab_nav.index = i; tab_nav.url = entry->display_url(); tab_nav.title = entry->title(); tab_nav.state = entry->content_state(); |