summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorericroman@google.com <ericroman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-28 20:26:15 +0000
committerericroman@google.com <ericroman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-28 20:26:15 +0000
commit4c6f2c9a868dcc0e59c26d5874d314eae66d9b15 (patch)
treeb9ea493dc6f6a2fbc9798809a4ce276957c63a33
parentc61526c5f44475da8e6caee4b3e41d4b5e11d796 (diff)
downloadchromium_src-4c6f2c9a868dcc0e59c26d5874d314eae66d9b15.zip
chromium_src-4c6f2c9a868dcc0e59c26d5874d314eae66d9b15.tar.gz
chromium_src-4c6f2c9a868dcc0e59c26d5874d314eae66d9b15.tar.bz2
Add referrer to session restore.
http://code.google.com/p/chromium/issues/detail?id=3774 Review URL: http://codereview.chromium.org/8649 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@4086 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/navigation_controller.cc2
-rw-r--r--chrome/browser/navigation_controller_unittest.cc8
-rw-r--r--chrome/browser/navigation_entry.h3
-rw-r--r--chrome/browser/session_service.cc83
-rw-r--r--chrome/browser/session_service.h4
-rw-r--r--chrome/browser/session_service_test_helper.cc1
-rw-r--r--chrome/browser/session_service_unittest.cc41
-rw-r--r--chrome/browser/tab_restore_service.cc1
-rw-r--r--chrome/renderer/render_view.cc2
9 files changed, 96 insertions, 49 deletions
diff --git a/chrome/browser/navigation_controller.cc b/chrome/browser/navigation_controller.cc
index d646bb1..ca0aac8 100644
--- a/chrome/browser/navigation_controller.cc
+++ b/chrome/browser/navigation_controller.cc
@@ -150,7 +150,7 @@ static void CreateNavigationEntriesFromTabNavigations(
// (WebContents::GetSiteInstanceForEntry).
static_cast<int>(i - navigations.begin()),
real_url,
- GURL(), // TODO(eroman): should pass actual referrer.
+ navigation.referrer,
navigation.title,
// Use a transition type of reload so that we don't incorrectly
// increase the typed count.
diff --git a/chrome/browser/navigation_controller_unittest.cc b/chrome/browser/navigation_controller_unittest.cc
index 1c8002280..8f3c865 100644
--- a/chrome/browser/navigation_controller_unittest.cc
+++ b/chrome/browser/navigation_controller_unittest.cc
@@ -1230,7 +1230,7 @@ TEST_F(NavigationControllerTest, RestoreNavigate) {
// Create a NavigationController with a restored set of tabs.
GURL url(scheme1() + ":foo");
std::vector<TabNavigation> navigations;
- navigations.push_back(TabNavigation(0, url, L"Title", "state",
+ navigations.push_back(TabNavigation(0, url, GURL(), L"Title", "state",
PageTransition::LINK));
NavigationController* controller =
new NavigationController(profile, navigations, 0, NULL);
@@ -1507,7 +1507,7 @@ TEST_F(NavigationControllerHistoryTest, Basic) {
helper_.AssertSingleWindowWithSingleTab(windows_, 1);
helper_.AssertTabEquals(0, 0, 1, *(windows_[0]->tabs[0]));
- TabNavigation nav1(0, url0, std::wstring(), std::string(),
+ TabNavigation nav1(0, url0, GURL(), std::wstring(), std::string(),
PageTransition::LINK);
helper_.AssertNavigationEquals(nav1, windows_[0]->tabs[0]->navigations[0]);
}
@@ -1527,7 +1527,7 @@ TEST_F(NavigationControllerHistoryTest, NavigationThenBack) {
helper_.AssertSingleWindowWithSingleTab(windows_, 3);
helper_.AssertTabEquals(0, 1, 3, *(windows_[0]->tabs[0]));
- TabNavigation nav(0, url0, std::wstring(), std::string(),
+ TabNavigation nav(0, url0, GURL(), std::wstring(), std::string(),
PageTransition::LINK);
helper_.AssertNavigationEquals(nav, windows_[0]->tabs[0]->navigations[0]);
nav.url = url1;
@@ -1557,7 +1557,7 @@ TEST_F(NavigationControllerHistoryTest, NavigationPruning) {
helper_.AssertSingleWindowWithSingleTab(windows_, 2);
helper_.AssertTabEquals(0, 1, 2, *(windows_[0]->tabs[0]));
- TabNavigation nav(0, url0, std::wstring(), std::string(),
+ TabNavigation nav(0, url0, GURL(), std::wstring(), std::string(),
PageTransition::LINK);
helper_.AssertNavigationEquals(nav, windows_[0]->tabs[0]->navigations[0]);
nav.url = url2;
diff --git a/chrome/browser/navigation_entry.h b/chrome/browser/navigation_entry.h
index cce595c..f5ab7f6 100644
--- a/chrome/browser/navigation_entry.h
+++ b/chrome/browser/navigation_entry.h
@@ -371,9 +371,6 @@ class NavigationEntry {
scoped_refptr<SiteInstance> site_instance_;
PageType page_type_;
GURL url_;
-
- // TODO(eroman): Add referrer to session restore.
- // http://code.google.com/p/chromium/issues/detail?id=3774
GURL referrer_;
std::wstring url_as_string_;
diff --git a/chrome/browser/session_service.cc b/chrome/browser/session_service.cc
index 25e0174..8305642 100644
--- a/chrome/browser/session_service.cc
+++ b/chrome/browser/session_service.cc
@@ -88,6 +88,32 @@ typedef IDAndIndexPayload WindowTypePayload;
typedef IDAndIndexPayload TabNavigationPathPrunedFromFrontPayload;
+// Helper used by CreateUpdateTabNavigationCommand(). It writes |str| to
+// |pickle|, if and only if |str| fits within (|max_bytes| - |*bytes_written|).
+// |bytes_written| is incremented to reflect the data written.
+void WriteStringToPickle(Pickle& pickle, int* bytes_written, int max_bytes,
+ const std::string& str) {
+ int num_bytes = str.size() * sizeof(char);
+ if (*bytes_written + num_bytes < max_bytes) {
+ *bytes_written += num_bytes;
+ pickle.WriteString(str);
+ } else {
+ pickle.WriteString(std::string());
+ }
+}
+
+// Wide version of WriteStringToPickle.
+void WriteWStringToPickle(Pickle& pickle, int* bytes_written, int max_bytes,
+ const std::wstring& str) {
+ int num_bytes = str.size() * sizeof(wchar_t);
+ if (*bytes_written + num_bytes < max_bytes) {
+ *bytes_written += num_bytes;
+ pickle.WriteWString(str);
+ } else {
+ pickle.WriteWString(std::wstring());
+ }
+}
+
} // namespace
// SessionID ------------------------------------------------------------------
@@ -583,31 +609,34 @@ SessionCommand* SessionService::CreateUpdateTabNavigationCommand(
Pickle pickle;
pickle.WriteInt(tab_id.id());
pickle.WriteInt(index);
+
+ // We only allow navigations up to 63k (which should be completely
+ // reasonable). On the off chance we get one that is too big, try to
+ // keep the url.
+
+ // Bound the string data (which is variable length) to
+ // |max_state_size bytes| bytes.
static const SessionCommand::size_type max_state_size =
std::numeric_limits<SessionCommand::size_type>::max() - 1024;
- if (entry.display_url().spec().size() +
- entry.title().size() +
- entry.content_state().size() >= max_state_size) {
- // We only allow navigations up to 63k (which should be completely
- // reasonable). On the off chance we get one that is too big, try to
- // keep the url.
- if (entry.display_url().spec().size() < max_state_size) {
- pickle.WriteString(entry.display_url().spec());
- pickle.WriteWString(std::wstring());
- pickle.WriteString(std::string());
- } else {
- pickle.WriteString(std::string());
- pickle.WriteWString(std::wstring());
- pickle.WriteString(std::string());
- }
- } else {
- pickle.WriteString(entry.display_url().spec());
- pickle.WriteWString(entry.title());
- pickle.WriteString(entry.content_state());
- }
+
+ int bytes_written = 0;
+
+ WriteStringToPickle(pickle, &bytes_written, max_state_size,
+ entry.display_url().spec());
+
+ WriteWStringToPickle(pickle, &bytes_written, max_state_size,
+ entry.title());
+
+ WriteStringToPickle(pickle, &bytes_written, max_state_size,
+ entry.content_state());
+
pickle.WriteInt(entry.transition_type());
int type_mask = entry.has_post_data() ? TabNavigation::HAS_POST_DATA : 0;
pickle.WriteInt(type_mask);
+
+ WriteStringToPickle(pickle, &bytes_written, max_state_size,
+ entry.referrer().is_valid() ? entry.referrer().spec() : std::string());
+
// Adding more data? Be sure and update TabRestoreService too.
return new SessionCommand(kCommandUpdateTabNavigation, pickle);
}
@@ -902,7 +931,19 @@ bool SessionService::CreateTabsAndWindows(
return true;
// type_mask did not always exist in the written stream. As such, we
// don't fail if it can't be read.
- pickle->ReadInt(&iterator, &(navigation.type_mask));
+ bool has_type_mask =
+ pickle->ReadInt(&iterator, &(navigation.type_mask));
+
+ if (has_type_mask) {
+ // the "referrer" property was added after type_mask to the written
+ // stream. As such, we don't fail if it can't be read.
+ std::string referrer_spec;
+ pickle->ReadString(&iterator, &referrer_spec);
+ if (!referrer_spec.empty()) {
+ navigation.referrer = GURL(referrer_spec);
+ }
+ }
+
navigation.url = GURL(url_spec);
SessionTab* tab = GetTab(tab_id, tabs);
std::vector<TabNavigation>::iterator i =
diff --git a/chrome/browser/session_service.h b/chrome/browser/session_service.h
index 4ce39cd..9918605 100644
--- a/chrome/browser/session_service.h
+++ b/chrome/browser/session_service.h
@@ -46,10 +46,12 @@ struct TabNavigation {
}
TabNavigation(int index,
const GURL& url,
+ const GURL& referrer,
const std::wstring& title,
const std::string& state,
PageTransition::Type transition)
: url(url),
+ referrer(referrer),
title(title),
state(state),
transition(transition),
@@ -58,6 +60,8 @@ struct TabNavigation {
GURL url;
+ GURL referrer;
+
// The title of the page.
std::wstring title;
std::string state;
diff --git a/chrome/browser/session_service_test_helper.cc b/chrome/browser/session_service_test_helper.cc
index 384e30c..4155d71 100644
--- a/chrome/browser/session_service_test_helper.cc
+++ b/chrome/browser/session_service_test_helper.cc
@@ -61,6 +61,7 @@ void SessionServiceTestHelper::AssertNavigationEquals(
const TabNavigation& expected,
const TabNavigation& actual) {
EXPECT_TRUE(expected.url == actual.url);
+ EXPECT_EQ(expected.referrer, actual.referrer);
EXPECT_EQ(expected.title, actual.title);
EXPECT_EQ(expected.state, actual.state);
EXPECT_EQ(expected.transition, actual.transition);
diff --git a/chrome/browser/session_service_unittest.cc b/chrome/browser/session_service_unittest.cc
index 4ff7a21b..08dbf37 100644
--- a/chrome/browser/session_service_unittest.cc
+++ b/chrome/browser/session_service_unittest.cc
@@ -47,6 +47,7 @@ class SessionServiceTest : public testing::Test {
bool select) {
NavigationEntry entry(TAB_CONTENTS_UNKNOWN_TYPE);
entry.set_url(navigation.url);
+ entry.set_referrer(navigation.referrer);
entry.set_title(navigation.title);
entry.set_content_state(navigation.state);
entry.set_transition_type(navigation.transition);
@@ -83,7 +84,8 @@ TEST_F(SessionServiceTest, Basic) {
SessionID tab_id;
ASSERT_NE(window_id.id(), tab_id.id());
- TabNavigation nav1(0, GURL("http://google.com"), L"abc", "def",
+ TabNavigation nav1(0, GURL("http://google.com"),
+ GURL("http://www.referrer.com"), L"abc", "def",
PageTransition::QUALIFIER_MASK);
helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
@@ -111,7 +113,7 @@ 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",
+ TabNavigation nav1(0, GURL("http://google.com"), GURL(), L"abc", "def",
PageTransition::QUALIFIER_MASK);
nav1.type_mask = TabNavigation::HAS_POST_DATA;
@@ -130,10 +132,11 @@ 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",
+ TabNavigation nav1(0, GURL("http://google.com"),
+ GURL("http://www.referrer.com"), L"abc", "def",
PageTransition::QUALIFIER_MASK);
nav1.type_mask = TabNavigation::HAS_POST_DATA;
- TabNavigation nav2(0, GURL("http://google2.com"), L"abc", "def",
+ TabNavigation nav2(0, GURL("http://google2.com"), GURL(), L"abc", "def",
PageTransition::QUALIFIER_MASK);
helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
@@ -157,9 +160,9 @@ TEST_F(SessionServiceTest, ClosingTabStaysClosed) {
SessionID tab2_id;
ASSERT_NE(tab_id.id(), tab2_id.id());
- TabNavigation nav1(0, GURL("http://google.com"), L"abc", "def",
+ TabNavigation nav1(0, GURL("http://google.com"), GURL(), L"abc", "def",
PageTransition::QUALIFIER_MASK);
- TabNavigation nav2(0, GURL("http://google2.com"), L"abcd", "defg",
+ TabNavigation nav2(0, GURL("http://google2.com"), GURL(), L"abcd", "defg",
PageTransition::AUTO_BOOKMARK);
helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
@@ -186,9 +189,9 @@ TEST_F(SessionServiceTest, ClosingTabStaysClosed) {
TEST_F(SessionServiceTest, Pruning) {
SessionID tab_id;
- TabNavigation nav1(0, GURL("http://google.com"), L"abc", "def",
+ TabNavigation nav1(0, GURL("http://google.com"), GURL(), L"abc", "def",
PageTransition::QUALIFIER_MASK);
- TabNavigation nav2(0, GURL("http://google2.com"), L"abcd", "defg",
+ TabNavigation nav2(0, GURL("http://google2.com"), GURL(), L"abcd", "defg",
PageTransition::AUTO_BOOKMARK);
helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
@@ -220,9 +223,9 @@ TEST_F(SessionServiceTest, TwoWindows) {
SessionID tab1_id;
SessionID tab2_id;
- TabNavigation nav1(0, GURL("http://google.com"), L"abc", "def",
+ TabNavigation nav1(0, GURL("http://google.com"), GURL(), L"abc", "def",
PageTransition::QUALIFIER_MASK);
- TabNavigation nav2(0, GURL("http://google2.com"), L"abcd", "defg",
+ TabNavigation nav2(0, GURL("http://google2.com"), GURL(), L"abcd", "defg",
PageTransition::AUTO_BOOKMARK);
helper_.PrepareTabInWindow(window_id, tab1_id, 0, true);
@@ -273,7 +276,7 @@ TEST_F(SessionServiceTest, WindowWithNoTabsGetsPruned) {
SessionID tab1_id;
SessionID tab2_id;
- TabNavigation nav1(0, GURL("http://google.com"), L"abc", "def",
+ TabNavigation nav1(0, GURL("http://google.com"), GURL(), L"abc", "def",
PageTransition::QUALIFIER_MASK);
helper_.PrepareTabInWindow(window_id, tab1_id, 0, true);
@@ -302,9 +305,9 @@ TEST_F(SessionServiceTest, ClosingWindowDoesntCloseTabs) {
SessionID tab2_id;
ASSERT_NE(tab_id.id(), tab2_id.id());
- TabNavigation nav1(0, GURL("http://google.com"), L"abc", "def",
+ TabNavigation nav1(0, GURL("http://google.com"), GURL(), L"abc", "def",
PageTransition::QUALIFIER_MASK);
- TabNavigation nav2(0, GURL("http://google2.com"), L"abcd", "defg",
+ TabNavigation nav2(0, GURL("http://google2.com"), GURL(), L"abcd", "defg",
PageTransition::AUTO_BOOKMARK);
helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
@@ -341,9 +344,9 @@ TEST_F(SessionServiceTest, WindowCloseCommittedAfterNavigate) {
service()->SetWindowType(window2_id, BrowserType::TABBED_BROWSER);
service()->SetWindowBounds(window2_id, window_bounds, false);
- TabNavigation nav1(0, GURL("http://google.com"), L"abc", "def",
+ TabNavigation nav1(0, GURL("http://google.com"), GURL(), L"abc", "def",
PageTransition::QUALIFIER_MASK);
- TabNavigation nav2(0, GURL("http://google2.com"), L"abcd", "defg",
+ TabNavigation nav2(0, GURL("http://google2.com"), GURL(), L"abcd", "defg",
PageTransition::AUTO_BOOKMARK);
helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
@@ -379,9 +382,9 @@ TEST_F(SessionServiceTest, IgnorePopups) {
service()->SetWindowType(window2_id, BrowserType::BROWSER);
service()->SetWindowBounds(window2_id, window_bounds, false);
- TabNavigation nav1(0, GURL("http://google.com"), L"abc", "def",
+ TabNavigation nav1(0, GURL("http://google.com"), GURL(), L"abc", "def",
PageTransition::QUALIFIER_MASK);
- TabNavigation nav2(0, GURL("http://google2.com"), L"abcd", "defg",
+ TabNavigation nav2(0, GURL("http://google2.com"), GURL(), L"abcd", "defg",
PageTransition::AUTO_BOOKMARK);
helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
@@ -412,7 +415,7 @@ TEST_F(SessionServiceTest, PruneFromFront) {
// Add 5 navigations, with the 4th selected.
for (int i = 0; i < 5; ++i) {
- TabNavigation nav(0, GURL(base_url + IntToString(i)),
+ TabNavigation nav(0, GURL(base_url + IntToString(i)), GURL(),
L"a", "b", PageTransition::QUALIFIER_MASK);
UpdateNavigation(window_id, tab_id, nav, i, (i == 3));
}
@@ -447,7 +450,7 @@ TEST_F(SessionServiceTest, PruneToEmpty) {
// Add 5 navigations, with the 4th selected.
for (int i = 0; i < 5; ++i) {
- TabNavigation nav(0, GURL(base_url + IntToString(i)),
+ TabNavigation nav(0, GURL(base_url + IntToString(i)), GURL(),
L"a", "b", PageTransition::QUALIFIER_MASK);
UpdateNavigation(window_id, tab_id, nav, i, (i == 3));
}
diff --git a/chrome/browser/tab_restore_service.cc b/chrome/browser/tab_restore_service.cc
index 324273b..e815a62 100644
--- a/chrome/browser/tab_restore_service.cc
+++ b/chrome/browser/tab_restore_service.cc
@@ -159,6 +159,7 @@ void TabRestoreService::PopulateTabFromController(
controller->GetPendingEntry() : controller->GetEntryAtIndex(i);
TabNavigation& tab_nav = tab->navigations[i];
tab_nav.url = entry->display_url();
+ tab_nav.referrer = entry->referrer();
tab_nav.title = entry->title();
tab_nav.state = entry->content_state();
tab_nav.transition = entry->transition_type();
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 67f816c..ce9ccdd 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -842,7 +842,7 @@ void RenderView::OnNavigate(const ViewMsg_Navigate_Params& params) {
if (!is_reload)
request->SetHistoryState(params.state);
- if (!params.referrer.is_empty()) {
+ if (params.referrer.is_valid()) {
request->SetHttpHeaderValue(L"Referer",
UTF8ToWide(params.referrer.spec()));
}