1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/sessions/serialized_navigation_entry.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/pickle.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/favicon_status.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_controller.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "sync/protocol/session_specifics.pb.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "sync/util/time.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using content::NavigationEntry;
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace sessions {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSearchTermsKey[] = "search_terms";
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedNavigationEntry::SerializedNavigationEntry()
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : index_(-1),
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      unique_id_(0),
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      transition_type_(ui::PAGE_TRANSITION_TYPED),
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      has_post_data_(false),
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      post_id_(-1),
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      is_overriding_user_agent_(false),
29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      http_status_code_(0),
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_restored_(false),
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      blocked_state_(STATE_INVALID) {}
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedNavigationEntry::~SerializedNavigationEntry() {}
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedNavigationEntry SerializedNavigationEntry::FromNavigationEntry(
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int index,
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const NavigationEntry& entry) {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry navigation;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.index_ = index;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.unique_id_ = entry.GetUniqueID();
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.referrer_ = entry.GetReferrer();
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.virtual_url_ = entry.GetVirtualURL();
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.title_ = entry.GetTitle();
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  navigation.page_state_ = entry.GetPageState();
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.transition_type_ = entry.GetTransitionType();
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.has_post_data_ = entry.GetHasPostData();
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.post_id_ = entry.GetPostID();
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.original_request_url_ = entry.GetOriginalRequestURL();
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.is_overriding_user_agent_ = entry.GetIsOverridingUserAgent();
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.timestamp_ = entry.GetTimestamp();
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation.is_restored_ = entry.IsRestored();
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If you want to navigate a named frame in Chrome, you will first need to
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // add support for persisting it. It is currently only used for layout tests.
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(entry.GetFrameToNavigate().empty());
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry.GetExtraData(kSearchTermsKey, &navigation.search_terms_);
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (entry.GetFavicon().valid)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    navigation.favicon_url_ = entry.GetFavicon().url;
59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  navigation.http_status_code_ = entry.GetHttpStatusCode();
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  navigation.redirect_chain_ = entry.GetRedirectChain();
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return navigation;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedNavigationEntry SerializedNavigationEntry::FromSyncData(
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int index,
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const sync_pb::TabNavigation& sync_data) {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry navigation;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.index_ = index;
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.unique_id_ = sync_data.unique_id();
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation.referrer_ = content::Referrer(
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GURL(sync_data.referrer()),
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<blink::WebReferrerPolicy>(sync_data.referrer_policy()));
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.virtual_url_ = GURL(sync_data.virtual_url());
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation.title_ = base::UTF8ToUTF16(sync_data.title());
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  navigation.page_state_ =
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      content::PageState::CreateFromEncodedData(sync_data.state());
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32 transition = 0;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.has_page_transition()) {
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (sync_data.page_transition()) {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_LINK:
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_LINK;
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_TYPED:
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_TYPED;
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK:
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_AUTO_BOOKMARK;
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME:
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME;
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME:
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME;
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_GENERATED:
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_GENERATED;
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL:
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_AUTO_TOPLEVEL;
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_FORM_SUBMIT:
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_FORM_SUBMIT;
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_RELOAD:
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_RELOAD;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_KEYWORD:
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_KEYWORD;
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED:
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_KEYWORD_GENERATED;
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition = ui::PAGE_TRANSITION_LINK;
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if  (sync_data.has_redirect_type()) {
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (sync_data.redirect_type()) {
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT:
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition |= ui::PAGE_TRANSITION_CLIENT_REDIRECT;
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT:
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        transition |= ui::PAGE_TRANSITION_SERVER_REDIRECT;
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.navigation_forward_back())
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      transition |= ui::PAGE_TRANSITION_FORWARD_BACK;
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.navigation_from_address_bar())
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      transition |= ui::PAGE_TRANSITION_FROM_ADDRESS_BAR;
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.navigation_home_page())
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      transition |= ui::PAGE_TRANSITION_HOME_PAGE;
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.navigation_chain_start())
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      transition |= ui::PAGE_TRANSITION_CHAIN_START;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.navigation_chain_end())
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      transition |= ui::PAGE_TRANSITION_CHAIN_END;
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  navigation.transition_type_ = static_cast<ui::PageTransition>(transition);
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.timestamp_ = base::Time();
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation.search_terms_ = base::UTF8ToUTF16(sync_data.search_terms());
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.has_favicon_url())
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    navigation.favicon_url_ = GURL(sync_data.favicon_url());
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  navigation.http_status_code_ = sync_data.http_status_code();
150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation.Sanitize();
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation.is_restored_ = true;
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return navigation;
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Helper used by SerializedNavigationEntry::WriteToPickle(). It writes |str| to
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |pickle|, if and only if |str| fits within (|max_bytes| -
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |*bytes_written|).  |bytes_written| is incremented to reflect the
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// data written.
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(akalin): Unify this with the same function in
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// base_session_service.cc.
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WriteStringToPickle(Pickle* pickle,
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         int* bytes_written,
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         int max_bytes,
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         const std::string& str) {
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_bytes = str.size() * sizeof(char);
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (*bytes_written + num_bytes < max_bytes) {
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *bytes_written += num_bytes;
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pickle->WriteString(str);
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pickle->WriteString(std::string());
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// base::string16 version of WriteStringToPickle.
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(akalin): Unify this, too.
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WriteString16ToPickle(Pickle* pickle,
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int* bytes_written,
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int max_bytes,
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           const base::string16& str) {
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int num_bytes = str.size() * sizeof(base::char16);
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (*bytes_written + num_bytes < max_bytes) {
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *bytes_written += num_bytes;
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pickle->WriteString16(str);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    pickle->WriteString16(base::string16());
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A mask used for arbitrary boolean values needed to represent a
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// NavigationEntry. Currently only contains HAS_POST_DATA.
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// NOTE(akalin): We may want to just serialize |has_post_data_|
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// directly.  Other bools (|is_overriding_user_agent_|) haven't been
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// added to this mask.
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum TypeMask {
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HAS_POST_DATA = 1
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Pickle order:
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// index_
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// virtual_url_
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// title_
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// page_state_
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// transition_type_
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Added on later:
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// type_mask (has_post_data_)
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// referrer_
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// original_request_url_
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// is_overriding_user_agent_
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// timestamp_
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// search_terms_
224424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http_status_code_
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SerializedNavigationEntry::WriteToPickle(int max_size,
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              Pickle* pickle) const {
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteInt(index_);
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int bytes_written = 0;
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WriteStringToPickle(pickle, &bytes_written, max_size,
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      virtual_url_.spec());
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WriteString16ToPickle(pickle, &bytes_written, max_size, title_);
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::PageState page_state = page_state_;
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (has_post_data_)
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    page_state = page_state.RemovePasswordData();
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WriteStringToPickle(pickle, &bytes_written, max_size,
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      page_state.ToEncodedData());
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteInt(transition_type_);
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const int type_mask = has_post_data_ ? HAS_POST_DATA : 0;
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteInt(type_mask);
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WriteStringToPickle(
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pickle, &bytes_written, max_size,
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      referrer_.url.is_valid() ? referrer_.url.spec() : std::string());
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteInt(referrer_.policy);
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Save info required to override the user agent.
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WriteStringToPickle(
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pickle, &bytes_written, max_size,
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      original_request_url_.is_valid() ?
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      original_request_url_.spec() : std::string());
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteBool(is_overriding_user_agent_);
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteInt64(timestamp_.ToInternalValue());
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WriteString16ToPickle(pickle, &bytes_written, max_size, search_terms_);
264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  pickle->WriteInt(http_status_code_);
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool SerializedNavigationEntry::ReadFromPickle(PickleIterator* iterator) {
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *this = SerializedNavigationEntry();
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string virtual_url_spec, page_state_data;
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int transition_type_int = 0;
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!iterator->ReadInt(&index_) ||
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !iterator->ReadString(&virtual_url_spec) ||
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !iterator->ReadString16(&title_) ||
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      !iterator->ReadString(&page_state_data) ||
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !iterator->ReadInt(&transition_type_int))
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual_url_ = GURL(virtual_url_spec);
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  page_state_ = content::PageState::CreateFromEncodedData(page_state_data);
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  transition_type_ = ui::PageTransitionFromInt(transition_type_int);
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // type_mask did not always exist in the written stream. As such, we
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // don't fail if it can't be read.
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int type_mask = 0;
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_type_mask = iterator->ReadInt(&type_mask);
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (has_type_mask) {
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    has_post_data_ = type_mask & HAS_POST_DATA;
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the "referrer" property was added after type_mask to the written
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // stream. As such, we don't fail if it can't be read.
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string referrer_spec;
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!iterator->ReadString(&referrer_spec))
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      referrer_spec = std::string();
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The "referrer policy" property was added even later, so we fall back to
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the default policy if the property is not present.
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int policy_int;
297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebReferrerPolicy policy;
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (iterator->ReadInt(&policy_int))
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      policy = static_cast<blink::WebReferrerPolicy>(policy_int);
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      policy = blink::WebReferrerPolicyDefault;
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    referrer_ = content::Referrer(GURL(referrer_spec), policy);
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If the original URL can't be found, leave it empty.
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string original_request_url_spec;
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!iterator->ReadString(&original_request_url_spec))
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      original_request_url_spec = std::string();
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    original_request_url_ = GURL(original_request_url_spec);
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Default to not overriding the user agent if we don't have info.
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!iterator->ReadBool(&is_overriding_user_agent_))
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      is_overriding_user_agent_ = false;
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int64 timestamp_internal_value = 0;
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (iterator->ReadInt64(&timestamp_internal_value)) {
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      timestamp_ = base::Time::FromInternalValue(timestamp_internal_value);
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      timestamp_ = base::Time();
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If the search terms field can't be found, leave it empty.
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!iterator->ReadString16(&search_terms_))
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      search_terms_.clear();
324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (!iterator->ReadInt(&http_status_code_))
326424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      http_status_code_ = 0;
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Sanitize();
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  is_restored_ = true;
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<NavigationEntry> SerializedNavigationEntry::ToNavigationEntry(
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int page_id,
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* browser_context) const {
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<NavigationEntry> entry(
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::NavigationController::CreateNavigationEntry(
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          virtual_url_,
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          referrer_,
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          // Use a transition type of reload so that we don't incorrectly
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          // increase the typed count.
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ui::PAGE_TRANSITION_RELOAD,
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          false,
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          // The extra headers are not sync'ed across sessions.
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string(),
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          browser_context));
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetTitle(title_);
35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  entry->SetPageState(page_state_);
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetPageID(page_id);
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetHasPostData(has_post_data_);
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetPostID(post_id_);
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetOriginalRequestURL(original_request_url_);
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetIsOverridingUserAgent(is_overriding_user_agent_);
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetTimestamp(timestamp_);
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetExtraData(kSearchTermsKey, search_terms_);
360424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  entry->SetHttpStatusCode(http_status_code_);
3610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  entry->SetRedirectChain(redirect_chain_);
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // These fields should have default values.
36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK_EQ(STATE_INVALID, blocked_state_);
36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK_EQ(0u, content_pack_categories_.size());
36690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return entry.Pass();
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well?
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// See http://crbug.com/67068.
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)sync_pb::TabNavigation SerializedNavigationEntry::ToSyncData() const {
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_pb::TabNavigation sync_data;
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_virtual_url(virtual_url_.spec());
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_referrer(referrer_.url.spec());
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_data.set_referrer_policy(referrer_.policy);
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_data.set_title(base::UTF16ToUTF8(title_));
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Page transition core.
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPILE_ASSERT(ui::PAGE_TRANSITION_LAST_CORE ==
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 ui::PAGE_TRANSITION_KEYWORD_GENERATED,
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 PageTransitionCoreBounds);
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (ui::PageTransitionStripQualifier(transition_type_)) {
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ui::PAGE_TRANSITION_LINK:
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          sync_pb::SyncEnums_PageTransition_LINK);
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ui::PAGE_TRANSITION_TYPED:
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          sync_pb::SyncEnums_PageTransition_TYPED);
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ui::PAGE_TRANSITION_AUTO_BOOKMARK:
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK);
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ui::PAGE_TRANSITION_AUTO_SUBFRAME:
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME);
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ui::PAGE_TRANSITION_MANUAL_SUBFRAME:
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME);
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ui::PAGE_TRANSITION_GENERATED:
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_GENERATED);
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ui::PAGE_TRANSITION_AUTO_TOPLEVEL:
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL);
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ui::PAGE_TRANSITION_FORM_SUBMIT:
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_FORM_SUBMIT);
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ui::PAGE_TRANSITION_RELOAD:
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_RELOAD);
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ui::PAGE_TRANSITION_KEYWORD:
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_KEYWORD);
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ui::PAGE_TRANSITION_KEYWORD_GENERATED:
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED);
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Page transition qualifiers.
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ui::PageTransitionIsRedirect(transition_type_)) {
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (transition_type_ & ui::PAGE_TRANSITION_CLIENT_REDIRECT) {
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_redirect_type(
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT);
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } else if (transition_type_ & ui::PAGE_TRANSITION_SERVER_REDIRECT) {
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_redirect_type(
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT);
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_navigation_forward_back(
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (transition_type_ & ui::PAGE_TRANSITION_FORWARD_BACK) != 0);
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_navigation_from_address_bar(
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (transition_type_ & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR) != 0);
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_navigation_home_page(
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (transition_type_ & ui::PAGE_TRANSITION_HOME_PAGE) != 0);
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_navigation_chain_start(
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (transition_type_ & ui::PAGE_TRANSITION_CHAIN_START) != 0);
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_navigation_chain_end(
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (transition_type_ & ui::PAGE_TRANSITION_CHAIN_END) != 0);
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_unique_id(unique_id_);
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_timestamp_msec(syncer::TimeToProtoTime(timestamp_));
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The full-resolution timestamp works as a global ID.
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_global_id(timestamp_.ToInternalValue());
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_data.set_search_terms(base::UTF16ToUTF8(search_terms_));
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
460424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  sync_data.set_http_status_code(http_status_code_);
461424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (favicon_url_.is_valid())
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    sync_data.set_favicon_url(favicon_url_.spec());
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
46590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (blocked_state_ != STATE_INVALID) {
46690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    sync_data.set_blocked_state(
46790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        static_cast<sync_pb::TabNavigation_BlockedState>(blocked_state_));
46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
46990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
47090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (std::set<std::string>::const_iterator it =
47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           content_pack_categories_.begin();
47290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       it != content_pack_categories_.end(); ++it) {
47390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    sync_data.add_content_pack_categories(*it);
47490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
47590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Copy all redirect chain entries except the last URL (which should match
4770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // the virtual_url).
4780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (redirect_chain_.size() > 1) {  // Single entry chains have no redirection.
4790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    size_t last_entry = redirect_chain_.size() - 1;
4800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    for (size_t i = 0; i < last_entry; i++) {
4810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      sync_pb::NavigationRedirect* navigation_redirect =
4820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          sync_data.add_navigation_redirect();
4830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      navigation_redirect->set_url(redirect_chain_[i].spec());
4840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
4850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // If the last URL didn't match the virtual_url, record it separately.
4860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (sync_data.virtual_url() != redirect_chain_[last_entry].spec()) {
4870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      sync_data.set_last_navigation_redirect_url(
4880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          redirect_chain_[last_entry].spec());
4890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
4900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
4910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_data.set_is_restored(is_restored_);
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return sync_data;
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector<NavigationEntry*> SerializedNavigationEntry::ToNavigationEntries(
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::vector<SerializedNavigationEntry>& navigations,
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* browser_context) {
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int page_id = 0;
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<NavigationEntry*> entries;
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (std::vector<SerializedNavigationEntry>::const_iterator
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       it = navigations.begin(); it != navigations.end(); ++it) {
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    entries.push_back(
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        it->ToNavigationEntry(page_id, browser_context).release());
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++page_id;
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return entries;
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SerializedNavigationEntry::Sanitize() {
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  content::Referrer new_referrer =
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::Referrer::SanitizeForRequest(virtual_url_, referrer_);
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // No need to compare the policy, as it doesn't change during
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // sanitization. If there has been a change, the referrer needs to be
5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // stripped from the page state as well.
5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (referrer_.url != new_referrer.url) {
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    referrer_ = content::Referrer();
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    page_state_ = page_state_.RemoveReferrer();
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace sessions
526