Index: components/sessions/serialized_navigation_entry.cc |
diff --git a/components/sessions/serialized_navigation_entry.cc b/components/sessions/serialized_navigation_entry.cc |
deleted file mode 100644 |
index e630c19959b349acd08287d9fbbc81fddc6d0994..0000000000000000000000000000000000000000 |
--- a/components/sessions/serialized_navigation_entry.cc |
+++ /dev/null |
@@ -1,473 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/sessions/serialized_navigation_entry.h" |
- |
-#include "base/pickle.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "components/sessions/core/serialized_navigation_driver.h" |
-#include "sync/protocol/session_specifics.pb.h" |
-#include "sync/util/time.h" |
- |
-namespace sessions { |
- |
-const char kSearchTermsKey[] = "search_terms"; |
- |
-SerializedNavigationEntry::SerializedNavigationEntry() |
- : index_(-1), |
- unique_id_(0), |
- transition_type_(ui::PAGE_TRANSITION_TYPED), |
- has_post_data_(false), |
- post_id_(-1), |
- is_overriding_user_agent_(false), |
- http_status_code_(0), |
- is_restored_(false), |
- blocked_state_(STATE_INVALID) { |
- referrer_policy_ = |
- SerializedNavigationDriver::Get()->GetDefaultReferrerPolicy(); |
-} |
- |
-SerializedNavigationEntry::~SerializedNavigationEntry() {} |
- |
-SerializedNavigationEntry SerializedNavigationEntry::FromSyncData( |
- int index, |
- const sync_pb::TabNavigation& sync_data) { |
- SerializedNavigationEntry navigation; |
- navigation.index_ = index; |
- navigation.unique_id_ = sync_data.unique_id(); |
- navigation.encoded_page_state_ = sync_data.state(); |
- if (sync_data.has_correct_referrer_policy()) { |
- navigation.referrer_url_ = GURL(sync_data.referrer()); |
- navigation.referrer_policy_ = sync_data.correct_referrer_policy(); |
- } else { |
- int mapped_referrer_policy; |
- if (SerializedNavigationDriver::Get()->MapReferrerPolicyToNewValues( |
- sync_data.obsolete_referrer_policy(), &mapped_referrer_policy)) { |
- navigation.referrer_url_ = GURL(sync_data.referrer()); |
- } else { |
- navigation.referrer_url_ = GURL(); |
- } |
- navigation.referrer_policy_ = mapped_referrer_policy; |
- navigation.encoded_page_state_ = |
- SerializedNavigationDriver::Get()->StripReferrerFromPageState( |
- navigation.encoded_page_state_); |
- } |
- navigation.virtual_url_ = GURL(sync_data.virtual_url()); |
- navigation.title_ = base::UTF8ToUTF16(sync_data.title()); |
- |
- uint32 transition = 0; |
- if (sync_data.has_page_transition()) { |
- switch (sync_data.page_transition()) { |
- case sync_pb::SyncEnums_PageTransition_LINK: |
- transition = ui::PAGE_TRANSITION_LINK; |
- break; |
- case sync_pb::SyncEnums_PageTransition_TYPED: |
- transition = ui::PAGE_TRANSITION_TYPED; |
- break; |
- case sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK: |
- transition = ui::PAGE_TRANSITION_AUTO_BOOKMARK; |
- break; |
- case sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME: |
- transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; |
- break; |
- case sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME: |
- transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; |
- break; |
- case sync_pb::SyncEnums_PageTransition_GENERATED: |
- transition = ui::PAGE_TRANSITION_GENERATED; |
- break; |
- case sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL: |
- transition = ui::PAGE_TRANSITION_AUTO_TOPLEVEL; |
- break; |
- case sync_pb::SyncEnums_PageTransition_FORM_SUBMIT: |
- transition = ui::PAGE_TRANSITION_FORM_SUBMIT; |
- break; |
- case sync_pb::SyncEnums_PageTransition_RELOAD: |
- transition = ui::PAGE_TRANSITION_RELOAD; |
- break; |
- case sync_pb::SyncEnums_PageTransition_KEYWORD: |
- transition = ui::PAGE_TRANSITION_KEYWORD; |
- break; |
- case sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED: |
- transition = ui::PAGE_TRANSITION_KEYWORD_GENERATED; |
- break; |
- default: |
- transition = ui::PAGE_TRANSITION_LINK; |
- break; |
- } |
- } |
- |
- if (sync_data.has_redirect_type()) { |
- switch (sync_data.redirect_type()) { |
- case sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT: |
- transition |= ui::PAGE_TRANSITION_CLIENT_REDIRECT; |
- break; |
- case sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT: |
- transition |= ui::PAGE_TRANSITION_SERVER_REDIRECT; |
- break; |
- } |
- } |
- if (sync_data.navigation_forward_back()) |
- transition |= ui::PAGE_TRANSITION_FORWARD_BACK; |
- if (sync_data.navigation_from_address_bar()) |
- transition |= ui::PAGE_TRANSITION_FROM_ADDRESS_BAR; |
- if (sync_data.navigation_home_page()) |
- transition |= ui::PAGE_TRANSITION_HOME_PAGE; |
- if (sync_data.navigation_chain_start()) |
- transition |= ui::PAGE_TRANSITION_CHAIN_START; |
- if (sync_data.navigation_chain_end()) |
- transition |= ui::PAGE_TRANSITION_CHAIN_END; |
- |
- navigation.transition_type_ = static_cast<ui::PageTransition>(transition); |
- |
- navigation.timestamp_ = base::Time(); |
- navigation.search_terms_ = base::UTF8ToUTF16(sync_data.search_terms()); |
- if (sync_data.has_favicon_url()) |
- navigation.favicon_url_ = GURL(sync_data.favicon_url()); |
- |
- navigation.http_status_code_ = sync_data.http_status_code(); |
- |
- SerializedNavigationDriver::Get()->Sanitize(&navigation); |
- |
- navigation.is_restored_ = true; |
- |
- return navigation; |
-} |
- |
-namespace { |
- |
-// Helper used by SerializedNavigationEntry::WriteToPickle(). 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. |
-// |
-// TODO(akalin): Unify this with the same function in |
-// base_session_service.cc. |
-void WriteStringToPickle(base::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()); |
- } |
-} |
- |
-// base::string16 version of WriteStringToPickle. |
-// |
-// TODO(akalin): Unify this, too. |
-void WriteString16ToPickle(base::Pickle* pickle, |
- int* bytes_written, |
- int max_bytes, |
- const base::string16& str) { |
- int num_bytes = str.size() * sizeof(base::char16); |
- if (*bytes_written + num_bytes < max_bytes) { |
- *bytes_written += num_bytes; |
- pickle->WriteString16(str); |
- } else { |
- pickle->WriteString16(base::string16()); |
- } |
-} |
- |
-// A mask used for arbitrary boolean values needed to represent a |
-// NavigationEntry. Currently only contains HAS_POST_DATA. |
-// |
-// NOTE(akalin): We may want to just serialize |has_post_data_| |
-// directly. Other bools (|is_overriding_user_agent_|) haven't been |
-// added to this mask. |
-enum TypeMask { |
- HAS_POST_DATA = 1 |
-}; |
- |
-} // namespace |
- |
-// Pickle order: |
-// |
-// index_ |
-// virtual_url_ |
-// title_ |
-// encoded_page_state_ |
-// transition_type_ |
-// |
-// Added on later: |
-// |
-// type_mask (has_post_data_) |
-// referrer_url_ |
-// referrer_policy_ (broken, crbug.com/450589) |
-// original_request_url_ |
-// is_overriding_user_agent_ |
-// timestamp_ |
-// search_terms_ |
-// http_status_code_ |
-// referrer_policy_ |
- |
-void SerializedNavigationEntry::WriteToPickle(int max_size, |
- base::Pickle* pickle) const { |
- pickle->WriteInt(index_); |
- |
- int bytes_written = 0; |
- |
- WriteStringToPickle(pickle, &bytes_written, max_size, |
- virtual_url_.spec()); |
- |
- WriteString16ToPickle(pickle, &bytes_written, max_size, title_); |
- |
- const std::string encoded_page_state = |
- SerializedNavigationDriver::Get()->GetSanitizedPageStateForPickle(this); |
- WriteStringToPickle(pickle, &bytes_written, max_size, encoded_page_state); |
- |
- pickle->WriteInt(transition_type_); |
- |
- const int type_mask = has_post_data_ ? HAS_POST_DATA : 0; |
- pickle->WriteInt(type_mask); |
- |
- int mapped_referrer_policy; |
- if (SerializedNavigationDriver::Get()->MapReferrerPolicyToOldValues( |
- referrer_policy_, &mapped_referrer_policy) && |
- referrer_url_.is_valid()) { |
- WriteStringToPickle(pickle, &bytes_written, max_size, referrer_url_.spec()); |
- } else { |
- WriteStringToPickle(pickle, &bytes_written, max_size, std::string()); |
- } |
- pickle->WriteInt(mapped_referrer_policy); |
- |
- // Save info required to override the user agent. |
- WriteStringToPickle( |
- pickle, &bytes_written, max_size, |
- original_request_url_.is_valid() ? |
- original_request_url_.spec() : std::string()); |
- pickle->WriteBool(is_overriding_user_agent_); |
- pickle->WriteInt64(timestamp_.ToInternalValue()); |
- |
- WriteString16ToPickle(pickle, &bytes_written, max_size, search_terms_); |
- |
- pickle->WriteInt(http_status_code_); |
- |
- pickle->WriteInt(referrer_policy_); |
-} |
- |
-bool SerializedNavigationEntry::ReadFromPickle(base::PickleIterator* iterator) { |
- *this = SerializedNavigationEntry(); |
- std::string virtual_url_spec; |
- int transition_type_int = 0; |
- if (!iterator->ReadInt(&index_) || |
- !iterator->ReadString(&virtual_url_spec) || |
- !iterator->ReadString16(&title_) || |
- !iterator->ReadString(&encoded_page_state_) || |
- !iterator->ReadInt(&transition_type_int)) |
- return false; |
- virtual_url_ = GURL(virtual_url_spec); |
- transition_type_ = ui::PageTransitionFromInt(transition_type_int); |
- |
- // type_mask did not always exist in the written stream. As such, we |
- // don't fail if it can't be read. |
- int type_mask = 0; |
- bool has_type_mask = iterator->ReadInt(&type_mask); |
- |
- if (has_type_mask) { |
- has_post_data_ = type_mask & HAS_POST_DATA; |
- // 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; |
- 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. |
- // |
- // Note: due to crbug.com/450589 this value might be incorrect, and a |
- // corrected version is stored later in the pickle. |
- if (!iterator->ReadInt(&referrer_policy_)) { |
- referrer_policy_ = |
- SerializedNavigationDriver::Get()->GetDefaultReferrerPolicy(); |
- } |
- |
- // If the original URL can't be found, leave it empty. |
- std::string original_request_url_spec; |
- if (!iterator->ReadString(&original_request_url_spec)) |
- original_request_url_spec = std::string(); |
- original_request_url_ = GURL(original_request_url_spec); |
- |
- // Default to not overriding the user agent if we don't have info. |
- if (!iterator->ReadBool(&is_overriding_user_agent_)) |
- is_overriding_user_agent_ = false; |
- |
- int64 timestamp_internal_value = 0; |
- if (iterator->ReadInt64(×tamp_internal_value)) { |
- timestamp_ = base::Time::FromInternalValue(timestamp_internal_value); |
- } else { |
- timestamp_ = base::Time(); |
- } |
- |
- // If the search terms field can't be found, leave it empty. |
- if (!iterator->ReadString16(&search_terms_)) |
- search_terms_.clear(); |
- |
- if (!iterator->ReadInt(&http_status_code_)) |
- http_status_code_ = 0; |
- |
- // Correct referrer policy (if present). |
- int correct_referrer_policy; |
- if (iterator->ReadInt(&correct_referrer_policy)) { |
- referrer_policy_ = correct_referrer_policy; |
- } else { |
- int mapped_referrer_policy; |
- if (!SerializedNavigationDriver::Get()->MapReferrerPolicyToNewValues( |
- referrer_policy_, &mapped_referrer_policy)) { |
- referrer_url_ = GURL(); |
- } |
- referrer_policy_ = mapped_referrer_policy; |
- encoded_page_state_ = |
- SerializedNavigationDriver::Get()->StripReferrerFromPageState( |
- encoded_page_state_); |
- } |
- } |
- |
- SerializedNavigationDriver::Get()->Sanitize(this); |
- |
- is_restored_ = true; |
- |
- return true; |
-} |
- |
-// TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well? |
-// See http://crbug.com/67068. |
-sync_pb::TabNavigation SerializedNavigationEntry::ToSyncData() const { |
- sync_pb::TabNavigation sync_data; |
- sync_data.set_virtual_url(virtual_url_.spec()); |
- int mapped_referrer_policy; |
- if (SerializedNavigationDriver::Get()->MapReferrerPolicyToOldValues( |
- referrer_policy_, &mapped_referrer_policy)) { |
- sync_data.set_referrer(referrer_url_.spec()); |
- } else { |
- sync_data.set_referrer(std::string()); |
- } |
- sync_data.set_obsolete_referrer_policy(mapped_referrer_policy); |
- sync_data.set_correct_referrer_policy(referrer_policy_); |
- sync_data.set_title(base::UTF16ToUTF8(title_)); |
- |
- // Page transition core. |
- static_assert(ui::PAGE_TRANSITION_LAST_CORE == |
- ui::PAGE_TRANSITION_KEYWORD_GENERATED, |
- "PAGE_TRANSITION_LAST_CORE must equal " |
- "PAGE_TRANSITION_KEYWORD_GENERATED"); |
- switch (ui::PageTransitionStripQualifier(transition_type_)) { |
- case ui::PAGE_TRANSITION_LINK: |
- sync_data.set_page_transition( |
- sync_pb::SyncEnums_PageTransition_LINK); |
- break; |
- case ui::PAGE_TRANSITION_TYPED: |
- sync_data.set_page_transition( |
- sync_pb::SyncEnums_PageTransition_TYPED); |
- break; |
- case ui::PAGE_TRANSITION_AUTO_BOOKMARK: |
- sync_data.set_page_transition( |
- sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK); |
- break; |
- case ui::PAGE_TRANSITION_AUTO_SUBFRAME: |
- sync_data.set_page_transition( |
- sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME); |
- break; |
- case ui::PAGE_TRANSITION_MANUAL_SUBFRAME: |
- sync_data.set_page_transition( |
- sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME); |
- break; |
- case ui::PAGE_TRANSITION_GENERATED: |
- sync_data.set_page_transition( |
- sync_pb::SyncEnums_PageTransition_GENERATED); |
- break; |
- case ui::PAGE_TRANSITION_AUTO_TOPLEVEL: |
- sync_data.set_page_transition( |
- sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL); |
- break; |
- case ui::PAGE_TRANSITION_FORM_SUBMIT: |
- sync_data.set_page_transition( |
- sync_pb::SyncEnums_PageTransition_FORM_SUBMIT); |
- break; |
- case ui::PAGE_TRANSITION_RELOAD: |
- sync_data.set_page_transition( |
- sync_pb::SyncEnums_PageTransition_RELOAD); |
- break; |
- case ui::PAGE_TRANSITION_KEYWORD: |
- sync_data.set_page_transition( |
- sync_pb::SyncEnums_PageTransition_KEYWORD); |
- break; |
- case ui::PAGE_TRANSITION_KEYWORD_GENERATED: |
- sync_data.set_page_transition( |
- sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED); |
- break; |
- default: |
- NOTREACHED(); |
- } |
- |
- // Page transition qualifiers. |
- if (ui::PageTransitionIsRedirect(transition_type_)) { |
- if (transition_type_ & ui::PAGE_TRANSITION_CLIENT_REDIRECT) { |
- sync_data.set_redirect_type( |
- sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT); |
- } else if (transition_type_ & ui::PAGE_TRANSITION_SERVER_REDIRECT) { |
- sync_data.set_redirect_type( |
- sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT); |
- } |
- } |
- sync_data.set_navigation_forward_back( |
- (transition_type_ & ui::PAGE_TRANSITION_FORWARD_BACK) != 0); |
- sync_data.set_navigation_from_address_bar( |
- (transition_type_ & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR) != 0); |
- sync_data.set_navigation_home_page( |
- (transition_type_ & ui::PAGE_TRANSITION_HOME_PAGE) != 0); |
- sync_data.set_navigation_chain_start( |
- (transition_type_ & ui::PAGE_TRANSITION_CHAIN_START) != 0); |
- sync_data.set_navigation_chain_end( |
- (transition_type_ & ui::PAGE_TRANSITION_CHAIN_END) != 0); |
- |
- sync_data.set_unique_id(unique_id_); |
- sync_data.set_timestamp_msec(syncer::TimeToProtoTime(timestamp_)); |
- // The full-resolution timestamp works as a global ID. |
- sync_data.set_global_id(timestamp_.ToInternalValue()); |
- |
- sync_data.set_search_terms(base::UTF16ToUTF8(search_terms_)); |
- |
- sync_data.set_http_status_code(http_status_code_); |
- |
- if (favicon_url_.is_valid()) |
- sync_data.set_favicon_url(favicon_url_.spec()); |
- |
- if (blocked_state_ != STATE_INVALID) { |
- sync_data.set_blocked_state( |
- static_cast<sync_pb::TabNavigation_BlockedState>(blocked_state_)); |
- } |
- |
- for (std::set<std::string>::const_iterator it = |
- content_pack_categories_.begin(); |
- it != content_pack_categories_.end(); ++it) { |
- sync_data.add_content_pack_categories(*it); |
- } |
- |
- // Copy all redirect chain entries except the last URL (which should match |
- // the virtual_url). |
- if (redirect_chain_.size() > 1) { // Single entry chains have no redirection. |
- size_t last_entry = redirect_chain_.size() - 1; |
- for (size_t i = 0; i < last_entry; i++) { |
- sync_pb::NavigationRedirect* navigation_redirect = |
- sync_data.add_navigation_redirect(); |
- navigation_redirect->set_url(redirect_chain_[i].spec()); |
- } |
- // If the last URL didn't match the virtual_url, record it separately. |
- if (sync_data.virtual_url() != redirect_chain_[last_entry].spec()) { |
- sync_data.set_last_navigation_redirect_url( |
- redirect_chain_[last_entry].spec()); |
- } |
- } |
- |
- sync_data.set_is_restored(is_restored_); |
- |
- return sync_data; |
-} |
- |
-} // namespace sessions |