Chromium Code Reviews| Index: components/sessions/serialized_navigation_entry.cc |
| diff --git a/components/sessions/serialized_navigation_entry.cc b/components/sessions/serialized_navigation_entry.cc |
| index b45ffd7ffc65e931e4e07f8f9275cdf241638c12..a05c585b713df10708bf526e751463c0d058d79e 100644 |
| --- a/components/sessions/serialized_navigation_entry.cc |
| +++ b/components/sessions/serialized_navigation_entry.cc |
| @@ -28,7 +28,9 @@ SerializedNavigationEntry::SerializedNavigationEntry() |
| is_overriding_user_agent_(false), |
| http_status_code_(0), |
| is_restored_(false), |
| - blocked_state_(STATE_INVALID) {} |
| + blocked_state_(STATE_INVALID) { |
| + referrer_policy_ = GetDefaultReferrerPolicy(); |
| +} |
| SerializedNavigationEntry::~SerializedNavigationEntry() {} |
| @@ -39,10 +41,11 @@ SerializedNavigationEntry SerializedNavigationEntry::FromNavigationEntry( |
| SerializedNavigationEntry navigation; |
| navigation.index_ = index; |
| navigation.unique_id_ = entry.GetUniqueID(); |
| - navigation.referrer_ = entry.GetReferrer(); |
| + navigation.referrer_url_ = entry.GetReferrer().url; |
| + navigation.referrer_policy_ = entry.GetReferrer().policy; |
| navigation.virtual_url_ = entry.GetVirtualURL(); |
| navigation.title_ = entry.GetTitle(); |
| - navigation.page_state_ = entry.GetPageState(); |
| + navigation.encoded_page_state_ = entry.GetPageState().ToEncodedData(); |
| navigation.transition_type_ = entry.GetTransitionType(); |
| navigation.has_post_data_ = entry.GetHasPostData(); |
| navigation.post_id_ = entry.GetPostID(); |
| @@ -68,13 +71,11 @@ SerializedNavigationEntry SerializedNavigationEntry::FromSyncData( |
| SerializedNavigationEntry navigation; |
| navigation.index_ = index; |
| navigation.unique_id_ = sync_data.unique_id(); |
| - navigation.referrer_ = content::Referrer( |
| - GURL(sync_data.referrer()), |
| - static_cast<blink::WebReferrerPolicy>(sync_data.referrer_policy())); |
| + navigation.referrer_url_ = GURL(sync_data.referrer()); |
| + navigation.referrer_policy_ = sync_data.referrer_policy(); |
| navigation.virtual_url_ = GURL(sync_data.virtual_url()); |
| navigation.title_ = base::UTF8ToUTF16(sync_data.title()); |
| - navigation.page_state_ = |
| - content::PageState::CreateFromEncodedData(sync_data.state()); |
| + navigation.encoded_page_state_ = sync_data.state(); |
| uint32 transition = 0; |
| if (sync_data.has_page_transition()) { |
| @@ -210,13 +211,14 @@ enum TypeMask { |
| // index_ |
| // virtual_url_ |
| // title_ |
| -// page_state_ |
| +// encoded_page_state_ |
|
rohitrao (ping after 24h)
2014/10/17 15:15:54
The PageState was always written to the pickle as
|
| // transition_type_ |
| // |
| // Added on later: |
| // |
| // type_mask (has_post_data_) |
| -// referrer_ |
| +// referrer_url_ |
| +// referrer_policy_ |
|
rohitrao (ping after 24h)
2014/10/17 15:15:53
I've added referrer_policy_ here to be explicit, b
|
| // original_request_url_ |
| // is_overriding_user_agent_ |
| // timestamp_ |
| @@ -234,12 +236,8 @@ void SerializedNavigationEntry::WriteToPickle(int max_size, |
| WriteString16ToPickle(pickle, &bytes_written, max_size, title_); |
| - content::PageState page_state = page_state_; |
| - if (has_post_data_) |
| - page_state = page_state.RemovePasswordData(); |
| - |
| - WriteStringToPickle(pickle, &bytes_written, max_size, |
| - page_state.ToEncodedData()); |
| + const std::string encoded_page_state = GetSanitizedPageStateForPickle(); |
| + WriteStringToPickle(pickle, &bytes_written, max_size, encoded_page_state); |
| pickle->WriteInt(transition_type_); |
| @@ -248,9 +246,9 @@ void SerializedNavigationEntry::WriteToPickle(int max_size, |
| WriteStringToPickle( |
| pickle, &bytes_written, max_size, |
| - referrer_.url.is_valid() ? referrer_.url.spec() : std::string()); |
| + referrer_url_.is_valid() ? referrer_url_.spec() : std::string()); |
| - pickle->WriteInt(referrer_.policy); |
| + pickle->WriteInt(referrer_policy_); |
| // Save info required to override the user agent. |
| WriteStringToPickle( |
| @@ -267,16 +265,15 @@ void SerializedNavigationEntry::WriteToPickle(int max_size, |
| bool SerializedNavigationEntry::ReadFromPickle(PickleIterator* iterator) { |
| *this = SerializedNavigationEntry(); |
| - std::string virtual_url_spec, page_state_data; |
| + std::string virtual_url_spec; |
| int transition_type_int = 0; |
| if (!iterator->ReadInt(&index_) || |
| !iterator->ReadString(&virtual_url_spec) || |
| !iterator->ReadString16(&title_) || |
| - !iterator->ReadString(&page_state_data) || |
| + !iterator->ReadString(&encoded_page_state_) || |
| !iterator->ReadInt(&transition_type_int)) |
| return false; |
| virtual_url_ = GURL(virtual_url_spec); |
| - page_state_ = content::PageState::CreateFromEncodedData(page_state_data); |
| transition_type_ = ui::PageTransitionFromInt(transition_type_int); |
| // type_mask did not always exist in the written stream. As such, we |
| @@ -291,15 +288,12 @@ bool SerializedNavigationEntry::ReadFromPickle(PickleIterator* iterator) { |
| std::string referrer_spec; |
| if (!iterator->ReadString(&referrer_spec)) |
| referrer_spec = std::string(); |
| + referrer_url_ = GURL(referrer_spec); |
| + |
| // The "referrer policy" property was added even later, so we fall back to |
| // the default policy if the property is not present. |
| - int policy_int; |
| - blink::WebReferrerPolicy policy; |
| - if (iterator->ReadInt(&policy_int)) |
| - policy = static_cast<blink::WebReferrerPolicy>(policy_int); |
| - else |
| - policy = blink::WebReferrerPolicyDefault; |
| - referrer_ = content::Referrer(GURL(referrer_spec), policy); |
| + if (!iterator->ReadInt(&referrer_policy_)) |
| + referrer_policy_ = GetDefaultReferrerPolicy(); |
| // If the original URL can't be found, leave it empty. |
| std::string original_request_url_spec; |
| @@ -339,7 +333,9 @@ scoped_ptr<NavigationEntry> SerializedNavigationEntry::ToNavigationEntry( |
| scoped_ptr<NavigationEntry> entry( |
| content::NavigationController::CreateNavigationEntry( |
| virtual_url_, |
| - referrer_, |
| + content::Referrer( |
| + referrer_url_, |
| + static_cast<blink::WebReferrerPolicy>(referrer_policy_)), |
| // Use a transition type of reload so that we don't incorrectly |
| // increase the typed count. |
| ui::PAGE_TRANSITION_RELOAD, |
| @@ -349,7 +345,8 @@ scoped_ptr<NavigationEntry> SerializedNavigationEntry::ToNavigationEntry( |
| browser_context)); |
| entry->SetTitle(title_); |
| - entry->SetPageState(page_state_); |
| + entry->SetPageState( |
| + content::PageState::CreateFromEncodedData(encoded_page_state_)); |
| entry->SetPageID(page_id); |
| entry->SetHasPostData(has_post_data_); |
| entry->SetPostID(post_id_); |
| @@ -372,8 +369,8 @@ scoped_ptr<NavigationEntry> SerializedNavigationEntry::ToNavigationEntry( |
| sync_pb::TabNavigation SerializedNavigationEntry::ToSyncData() const { |
| sync_pb::TabNavigation sync_data; |
| sync_data.set_virtual_url(virtual_url_.spec()); |
| - sync_data.set_referrer(referrer_.url.spec()); |
| - sync_data.set_referrer_policy(referrer_.policy); |
| + sync_data.set_referrer(referrer_url_.spec()); |
| + sync_data.set_referrer_policy(referrer_policy_); |
| sync_data.set_title(base::UTF16ToUTF8(title_)); |
| // Page transition core. |
| @@ -509,16 +506,40 @@ std::vector<NavigationEntry*> SerializedNavigationEntry::ToNavigationEntries( |
| return entries; |
| } |
| +// TODO(rohitrao): Move this content-specific code into a |
| +// SerializedNavigationEntryHelper class. |
| +int SerializedNavigationEntry::GetDefaultReferrerPolicy() const { |
|
rohitrao (ping after 24h)
2014/10/17 15:15:53
I've tried to move the remaining content-specific
|
| + return blink::WebReferrerPolicyDefault; |
| +} |
| + |
| +std::string SerializedNavigationEntry::GetSanitizedPageStateForPickle() const { |
|
blundell
2014/10/17 15:19:28
nit: Add a TODO here like you have in the other tw
rohitrao (ping after 24h)
2014/10/20 13:24:49
Done.
|
| + content::PageState page_state = |
| + content::PageState::CreateFromEncodedData(encoded_page_state_); |
|
rohitrao (ping after 24h)
2014/10/17 15:15:53
There will be some places where we now do an addit
|
| + if (has_post_data_) |
| + page_state = page_state.RemovePasswordData(); |
| + |
| + return page_state.ToEncodedData(); |
| +} |
| + |
| +// TODO(rohitrao): Move this content-specific code into a |
| +// SerializedNavigationEntryHelper class. |
| void SerializedNavigationEntry::Sanitize() { |
| + content::Referrer old_referrer( |
| + referrer_url_, |
| + static_cast<blink::WebReferrerPolicy>(referrer_policy_)); |
| content::Referrer new_referrer = |
| - content::Referrer::SanitizeForRequest(virtual_url_, referrer_); |
| + content::Referrer::SanitizeForRequest(virtual_url_, old_referrer); |
| // No need to compare the policy, as it doesn't change during |
| // sanitization. If there has been a change, the referrer needs to be |
| // stripped from the page state as well. |
| - if (referrer_.url != new_referrer.url) { |
| - referrer_ = content::Referrer(); |
| - page_state_ = page_state_.RemoveReferrer(); |
| + if (referrer_url_ != new_referrer.url) { |
| + referrer_url_ = GURL(); |
| + referrer_policy_ = GetDefaultReferrerPolicy(); |
| + encoded_page_state_ = |
| + content::PageState::CreateFromEncodedData(encoded_page_state_) |
| + .RemoveReferrer() |
| + .ToEncodedData(); |
| } |
| } |