summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/navigation_controller_unittest.cc3
-rw-r--r--chrome/browser/session_service.cc20
-rw-r--r--chrome/browser/session_service.h24
-rw-r--r--chrome/browser/session_service_test_helper.cc1
-rw-r--r--chrome/browser/session_service_unittest.cc84
-rw-r--r--chrome/browser/tab_restore_service.cc1
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();