| 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..facd7e48a3045607847013b22838eae87026b379 100644
|
| --- a/components/sessions/serialized_navigation_entry.cc
|
| +++ b/components/sessions/serialized_navigation_entry.cc
|
| @@ -9,6 +9,8 @@
|
| #include "content/public/browser/favicon_status.h"
|
| #include "content/public/browser/navigation_controller.h"
|
| #include "content/public/browser/navigation_entry.h"
|
| +#include "content/public/common/page_state.h"
|
| +#include "content/public/common/referrer.h"
|
| #include "sync/protocol/session_specifics.pb.h"
|
| #include "sync/util/time.h"
|
| #include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
|
| @@ -28,7 +30,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 +43,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 +73,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 +213,14 @@ enum TypeMask {
|
| // index_
|
| // virtual_url_
|
| // title_
|
| -// page_state_
|
| +// encoded_page_state_
|
| // transition_type_
|
| //
|
| // Added on later:
|
| //
|
| // type_mask (has_post_data_)
|
| -// referrer_
|
| +// referrer_url_
|
| +// referrer_policy_
|
| // original_request_url_
|
| // is_overriding_user_agent_
|
| // timestamp_
|
| @@ -234,12 +238,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 +248,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 +267,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 +290,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 +335,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 +347,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 +371,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 +508,42 @@ std::vector<NavigationEntry*> SerializedNavigationEntry::ToNavigationEntries(
|
| return entries;
|
| }
|
|
|
| +// TODO(rohitrao): Move this content-specific code into a
|
| +// SerializedNavigationEntryHelper class.
|
| +int SerializedNavigationEntry::GetDefaultReferrerPolicy() const {
|
| + return blink::WebReferrerPolicyDefault;
|
| +}
|
| +
|
| +// TODO(rohitrao): Move this content-specific code into a
|
| +// SerializedNavigationEntryHelper class.
|
| +std::string SerializedNavigationEntry::GetSanitizedPageStateForPickle() const {
|
| + content::PageState page_state =
|
| + content::PageState::CreateFromEncodedData(encoded_page_state_);
|
| + 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();
|
| }
|
| }
|
|
|
|
|