#include "base/pickle.h"
#include "base/strings/utf_string_conversions.h"
-#include "content/public/browser/favicon_status.h"
-#include "content/public/browser/navigation_controller.h"
-#include "content/public/browser/navigation_entry.h"
+#include "components/sessions/core/serialized_navigation_driver.h"
#include "sync/protocol/session_specifics.pb.h"
#include "sync/util/time.h"
-#include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
-
-using content::NavigationEntry;
namespace sessions {
is_overriding_user_agent_(false),
http_status_code_(0),
is_restored_(false),
- blocked_state_(STATE_INVALID) {}
+ blocked_state_(STATE_INVALID) {
+ referrer_policy_ =
+ SerializedNavigationDriver::Get()->GetDefaultReferrerPolicy();
+}
SerializedNavigationEntry::~SerializedNavigationEntry() {}
-// static
-SerializedNavigationEntry SerializedNavigationEntry::FromNavigationEntry(
- int index,
- const NavigationEntry& entry) {
- SerializedNavigationEntry navigation;
- navigation.index_ = index;
- navigation.unique_id_ = entry.GetUniqueID();
- navigation.referrer_ = entry.GetReferrer();
- navigation.virtual_url_ = entry.GetVirtualURL();
- navigation.title_ = entry.GetTitle();
- navigation.page_state_ = entry.GetPageState();
- navigation.transition_type_ = entry.GetTransitionType();
- navigation.has_post_data_ = entry.GetHasPostData();
- navigation.post_id_ = entry.GetPostID();
- navigation.original_request_url_ = entry.GetOriginalRequestURL();
- navigation.is_overriding_user_agent_ = entry.GetIsOverridingUserAgent();
- navigation.timestamp_ = entry.GetTimestamp();
- navigation.is_restored_ = entry.IsRestored();
- // If you want to navigate a named frame in Chrome, you will first need to
- // add support for persisting it. It is currently only used for layout tests.
- CHECK(entry.GetFrameToNavigate().empty());
- entry.GetExtraData(kSearchTermsKey, &navigation.search_terms_);
- if (entry.GetFavicon().valid)
- navigation.favicon_url_ = entry.GetFavicon().url;
- navigation.http_status_code_ = entry.GetHttpStatusCode();
- navigation.redirect_chain_ = entry.GetRedirectChain();
-
- return navigation;
-}
-
SerializedNavigationEntry SerializedNavigationEntry::FromSyncData(
int index,
const sync_pb::TabNavigation& sync_data) {
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()) {
navigation.http_status_code_ = sync_data.http_status_code();
- navigation.Sanitize();
+ SerializedNavigationDriver::Get()->Sanitize(&navigation);
navigation.is_restored_ = true;
// 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_
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 =
+ SerializedNavigationDriver::Get()->GetSanitizedPageStateForPickle(this);
+ WriteStringToPickle(pickle, &bytes_written, max_size, encoded_page_state);
pickle->WriteInt(transition_type_);
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(
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
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_ =
+ SerializedNavigationDriver::Get()->GetDefaultReferrerPolicy();
// If the original URL can't be found, leave it empty.
std::string original_request_url_spec;
http_status_code_ = 0;
}
- Sanitize();
+ SerializedNavigationDriver::Get()->Sanitize(this);
is_restored_ = true;
return true;
}
-scoped_ptr<NavigationEntry> SerializedNavigationEntry::ToNavigationEntry(
- int page_id,
- content::BrowserContext* browser_context) const {
- scoped_ptr<NavigationEntry> entry(
- content::NavigationController::CreateNavigationEntry(
- virtual_url_,
- referrer_,
- // Use a transition type of reload so that we don't incorrectly
- // increase the typed count.
- ui::PAGE_TRANSITION_RELOAD,
- false,
- // The extra headers are not sync'ed across sessions.
- std::string(),
- browser_context));
-
- entry->SetTitle(title_);
- entry->SetPageState(page_state_);
- entry->SetPageID(page_id);
- entry->SetHasPostData(has_post_data_);
- entry->SetPostID(post_id_);
- entry->SetOriginalRequestURL(original_request_url_);
- entry->SetIsOverridingUserAgent(is_overriding_user_agent_);
- entry->SetTimestamp(timestamp_);
- entry->SetExtraData(kSearchTermsKey, search_terms_);
- entry->SetHttpStatusCode(http_status_code_);
- entry->SetRedirectChain(redirect_chain_);
-
- // These fields should have default values.
- DCHECK_EQ(STATE_INVALID, blocked_state_);
- DCHECK_EQ(0u, content_pack_categories_.size());
-
- return entry.Pass();
-}
-
// 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());
- 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.
return sync_data;
}
-// static
-std::vector<NavigationEntry*> SerializedNavigationEntry::ToNavigationEntries(
- const std::vector<SerializedNavigationEntry>& navigations,
- content::BrowserContext* browser_context) {
- int page_id = 0;
- std::vector<NavigationEntry*> entries;
- for (std::vector<SerializedNavigationEntry>::const_iterator
- it = navigations.begin(); it != navigations.end(); ++it) {
- entries.push_back(
- it->ToNavigationEntry(page_id, browser_context).release());
- ++page_id;
- }
- return entries;
-}
-
-void SerializedNavigationEntry::Sanitize() {
- content::Referrer new_referrer =
- content::Referrer::SanitizeForRequest(virtual_url_, 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();
- }
-}
-
} // namespace sessions