diff options
author | ericroman@google.com <ericroman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-28 20:26:15 +0000 |
---|---|---|
committer | ericroman@google.com <ericroman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-28 20:26:15 +0000 |
commit | 4c6f2c9a868dcc0e59c26d5874d314eae66d9b15 (patch) | |
tree | b9ea493dc6f6a2fbc9798809a4ce276957c63a33 | |
parent | c61526c5f44475da8e6caee4b3e41d4b5e11d796 (diff) | |
download | chromium_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.cc | 2 | ||||
-rw-r--r-- | chrome/browser/navigation_controller_unittest.cc | 8 | ||||
-rw-r--r-- | chrome/browser/navigation_entry.h | 3 | ||||
-rw-r--r-- | chrome/browser/session_service.cc | 83 | ||||
-rw-r--r-- | chrome/browser/session_service.h | 4 | ||||
-rw-r--r-- | chrome/browser/session_service_test_helper.cc | 1 | ||||
-rw-r--r-- | chrome/browser/session_service_unittest.cc | 41 | ||||
-rw-r--r-- | chrome/browser/tab_restore_service.cc | 1 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 2 |
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())); } |