Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / components / sessions / serialized_navigation_entry.cc
index b45ffd7..8c35828 100644 (file)
@@ -6,14 +6,9 @@
 
 #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 {
 
@@ -28,53 +23,24 @@ SerializedNavigationEntry::SerializedNavigationEntry()
       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()) {
@@ -148,7 +114,7 @@ SerializedNavigationEntry SerializedNavigationEntry::FromSyncData(
 
   navigation.http_status_code_ = sync_data.http_status_code();
 
-  navigation.Sanitize();
+  SerializedNavigationDriver::Get()->Sanitize(&navigation);
 
   navigation.is_restored_ = true;
 
@@ -210,13 +176,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 +201,9 @@ 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 =
+      SerializedNavigationDriver::Get()->GetSanitizedPageStateForPickle(this);
+  WriteStringToPickle(pickle, &bytes_written, max_size, encoded_page_state);
 
   pickle->WriteInt(transition_type_);
 
@@ -248,9 +212,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 +231,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 +254,13 @@ 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_ =
+          SerializedNavigationDriver::Get()->GetDefaultReferrerPolicy();
 
     // If the original URL can't be found, leave it empty.
     std::string original_request_url_spec;
@@ -326,54 +287,20 @@ bool SerializedNavigationEntry::ReadFromPickle(PickleIterator* iterator) {
       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.
@@ -494,32 +421,4 @@ sync_pb::TabNavigation SerializedNavigationEntry::ToSyncData() const {
   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