serialized_navigation_entry.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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),
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      transition_type_(content::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();
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return navigation;
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedNavigationEntry SerializedNavigationEntry::FromSyncData(
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int index,
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const sync_pb::TabNavigation& sync_data) {
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry navigation;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.index_ = index;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.unique_id_ = sync_data.unique_id();
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation.referrer_ = content::Referrer(
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GURL(sync_data.referrer()),
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<blink::WebReferrerPolicy>(sync_data.referrer_policy()));
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.virtual_url_ = GURL(sync_data.virtual_url());
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation.title_ = base::UTF8ToUTF16(sync_data.title());
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  navigation.page_state_ =
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      content::PageState::CreateFromEncodedData(sync_data.state());
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32 transition = 0;
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.has_page_transition()) {
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (sync_data.page_transition()) {
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_LINK:
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition = content::PAGE_TRANSITION_LINK;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_TYPED:
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition = content::PAGE_TRANSITION_TYPED;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK:
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition = content::PAGE_TRANSITION_AUTO_BOOKMARK;
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME:
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition = content::PAGE_TRANSITION_AUTO_SUBFRAME;
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME:
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition = content::PAGE_TRANSITION_MANUAL_SUBFRAME;
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_GENERATED:
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition = content::PAGE_TRANSITION_GENERATED;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL:
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition = content::PAGE_TRANSITION_AUTO_TOPLEVEL;
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_FORM_SUBMIT:
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition = content::PAGE_TRANSITION_FORM_SUBMIT;
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_RELOAD:
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition = content::PAGE_TRANSITION_RELOAD;
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_KEYWORD:
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition = content::PAGE_TRANSITION_KEYWORD;
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED:
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition =
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            content::PAGE_TRANSITION_KEYWORD_GENERATED;
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition = content::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:
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition |= content::PAGE_TRANSITION_CLIENT_REDIRECT;
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT:
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        transition |= content::PAGE_TRANSITION_SERVER_REDIRECT;
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.navigation_forward_back())
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      transition |= content::PAGE_TRANSITION_FORWARD_BACK;
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.navigation_from_address_bar())
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      transition |= content::PAGE_TRANSITION_FROM_ADDRESS_BAR;
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.navigation_home_page())
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      transition |= content::PAGE_TRANSITION_HOME_PAGE;
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.navigation_chain_start())
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      transition |= content::PAGE_TRANSITION_CHAIN_START;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.navigation_chain_end())
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      transition |= content::PAGE_TRANSITION_CHAIN_END;
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.transition_type_ =
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      static_cast<content::PageTransition>(transition);
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation.timestamp_ = base::Time();
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation.search_terms_ = base::UTF8ToUTF16(sync_data.search_terms());
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sync_data.has_favicon_url())
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    navigation.favicon_url_ = GURL(sync_data.favicon_url());
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  navigation.http_status_code_ = sync_data.http_status_code();
151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We shouldn't sync session data for managed users down at the moment.
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!sync_data.has_blocked_state());
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK_EQ(0, sync_data.content_pack_categories_size());
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation.Sanitize();
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation.is_restored_ = true;
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return navigation;
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Helper used by SerializedNavigationEntry::WriteToPickle(). It writes |str| to
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |pickle|, if and only if |str| fits within (|max_bytes| -
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |*bytes_written|).  |bytes_written| is incremented to reflect the
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// data written.
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(akalin): Unify this with the same function in
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// base_session_service.cc.
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WriteStringToPickle(Pickle* pickle,
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         int* bytes_written,
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         int max_bytes,
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         const std::string& str) {
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_bytes = str.size() * sizeof(char);
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (*bytes_written + num_bytes < max_bytes) {
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *bytes_written += num_bytes;
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pickle->WriteString(str);
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pickle->WriteString(std::string());
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// base::string16 version of WriteStringToPickle.
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(akalin): Unify this, too.
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WriteString16ToPickle(Pickle* pickle,
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int* bytes_written,
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int max_bytes,
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           const base::string16& str) {
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int num_bytes = str.size() * sizeof(base::char16);
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (*bytes_written + num_bytes < max_bytes) {
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *bytes_written += num_bytes;
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pickle->WriteString16(str);
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    pickle->WriteString16(base::string16());
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A mask used for arbitrary boolean values needed to represent a
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// NavigationEntry. Currently only contains HAS_POST_DATA.
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// NOTE(akalin): We may want to just serialize |has_post_data_|
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// directly.  Other bools (|is_overriding_user_agent_|) haven't been
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// added to this mask.
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum TypeMask {
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HAS_POST_DATA = 1
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Pickle order:
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// index_
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// virtual_url_
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// title_
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// page_state_
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// transition_type_
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Added on later:
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// type_mask (has_post_data_)
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// referrer_
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// original_request_url_
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// is_overriding_user_agent_
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// timestamp_
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// search_terms_
229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http_status_code_
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SerializedNavigationEntry::WriteToPickle(int max_size,
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              Pickle* pickle) const {
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteInt(index_);
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int bytes_written = 0;
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WriteStringToPickle(pickle, &bytes_written, max_size,
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      virtual_url_.spec());
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WriteString16ToPickle(pickle, &bytes_written, max_size, title_);
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::PageState page_state = page_state_;
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (has_post_data_)
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    page_state = page_state.RemovePasswordData();
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WriteStringToPickle(pickle, &bytes_written, max_size,
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      page_state.ToEncodedData());
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteInt(transition_type_);
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const int type_mask = has_post_data_ ? HAS_POST_DATA : 0;
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteInt(type_mask);
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WriteStringToPickle(
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pickle, &bytes_written, max_size,
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      referrer_.url.is_valid() ? referrer_.url.spec() : std::string());
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteInt(referrer_.policy);
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Save info required to override the user agent.
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WriteStringToPickle(
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pickle, &bytes_written, max_size,
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      original_request_url_.is_valid() ?
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      original_request_url_.spec() : std::string());
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteBool(is_overriding_user_agent_);
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pickle->WriteInt64(timestamp_.ToInternalValue());
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WriteString16ToPickle(pickle, &bytes_written, max_size, search_terms_);
269424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
270424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  pickle->WriteInt(http_status_code_);
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool SerializedNavigationEntry::ReadFromPickle(PickleIterator* iterator) {
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *this = SerializedNavigationEntry();
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string virtual_url_spec, page_state_data;
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int transition_type_int = 0;
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!iterator->ReadInt(&index_) ||
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !iterator->ReadString(&virtual_url_spec) ||
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !iterator->ReadString16(&title_) ||
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      !iterator->ReadString(&page_state_data) ||
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !iterator->ReadInt(&transition_type_int))
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual_url_ = GURL(virtual_url_spec);
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  page_state_ = content::PageState::CreateFromEncodedData(page_state_data);
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  transition_type_ = static_cast<content::PageTransition>(transition_type_int);
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // type_mask did not always exist in the written stream. As such, we
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // don't fail if it can't be read.
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int type_mask = 0;
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_type_mask = iterator->ReadInt(&type_mask);
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (has_type_mask) {
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    has_post_data_ = type_mask & HAS_POST_DATA;
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the "referrer" property was added after type_mask to the written
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // stream. As such, we don't fail if it can't be read.
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string referrer_spec;
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!iterator->ReadString(&referrer_spec))
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      referrer_spec = std::string();
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The "referrer policy" property was added even later, so we fall back to
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the default policy if the property is not present.
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int policy_int;
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebReferrerPolicy policy;
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (iterator->ReadInt(&policy_int))
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      policy = static_cast<blink::WebReferrerPolicy>(policy_int);
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      policy = blink::WebReferrerPolicyDefault;
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    referrer_ = content::Referrer(GURL(referrer_spec), policy);
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If the original URL can't be found, leave it empty.
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string original_request_url_spec;
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!iterator->ReadString(&original_request_url_spec))
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      original_request_url_spec = std::string();
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    original_request_url_ = GURL(original_request_url_spec);
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Default to not overriding the user agent if we don't have info.
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!iterator->ReadBool(&is_overriding_user_agent_))
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      is_overriding_user_agent_ = false;
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int64 timestamp_internal_value = 0;
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (iterator->ReadInt64(&timestamp_internal_value)) {
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      timestamp_ = base::Time::FromInternalValue(timestamp_internal_value);
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      timestamp_ = base::Time();
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If the search terms field can't be found, leave it empty.
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!iterator->ReadString16(&search_terms_))
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      search_terms_.clear();
329424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
330424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (!iterator->ReadInt(&http_status_code_))
331424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      http_status_code_ = 0;
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Sanitize();
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  is_restored_ = true;
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<NavigationEntry> SerializedNavigationEntry::ToNavigationEntry(
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int page_id,
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* browser_context) const {
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<NavigationEntry> entry(
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::NavigationController::CreateNavigationEntry(
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          virtual_url_,
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          referrer_,
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          // Use a transition type of reload so that we don't incorrectly
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          // increase the typed count.
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          content::PAGE_TRANSITION_RELOAD,
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          false,
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          // The extra headers are not sync'ed across sessions.
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string(),
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          browser_context));
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetTitle(title_);
35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  entry->SetPageState(page_state_);
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetPageID(page_id);
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetHasPostData(has_post_data_);
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetPostID(post_id_);
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetOriginalRequestURL(original_request_url_);
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetIsOverridingUserAgent(is_overriding_user_agent_);
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetTimestamp(timestamp_);
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->SetExtraData(kSearchTermsKey, search_terms_);
365424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  entry->SetHttpStatusCode(http_status_code_);
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // These fields should have default values.
36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK_EQ(STATE_INVALID, blocked_state_);
36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK_EQ(0u, content_pack_categories_.size());
37090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return entry.Pass();
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well?
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// See http://crbug.com/67068.
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)sync_pb::TabNavigation SerializedNavigationEntry::ToSyncData() const {
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_pb::TabNavigation sync_data;
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_virtual_url(virtual_url_.spec());
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_referrer(referrer_.url.spec());
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_data.set_referrer_policy(referrer_.policy);
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_data.set_title(base::UTF16ToUTF8(title_));
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Page transition core.
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  COMPILE_ASSERT(content::PAGE_TRANSITION_LAST_CORE ==
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 content::PAGE_TRANSITION_KEYWORD_GENERATED,
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 PageTransitionCoreBounds);
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (PageTransitionStripQualifier(transition_type_)) {
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case content::PAGE_TRANSITION_LINK:
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          sync_pb::SyncEnums_PageTransition_LINK);
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case content::PAGE_TRANSITION_TYPED:
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          sync_pb::SyncEnums_PageTransition_TYPED);
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case content::PAGE_TRANSITION_AUTO_BOOKMARK:
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK);
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case content::PAGE_TRANSITION_AUTO_SUBFRAME:
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME);
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case content::PAGE_TRANSITION_MANUAL_SUBFRAME:
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME);
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case content::PAGE_TRANSITION_GENERATED:
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_GENERATED);
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case content::PAGE_TRANSITION_AUTO_TOPLEVEL:
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL);
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case content::PAGE_TRANSITION_FORM_SUBMIT:
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_FORM_SUBMIT);
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case content::PAGE_TRANSITION_RELOAD:
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_RELOAD);
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case content::PAGE_TRANSITION_KEYWORD:
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_KEYWORD);
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case content::PAGE_TRANSITION_KEYWORD_GENERATED:
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_page_transition(
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED);
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Page transition qualifiers.
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (PageTransitionIsRedirect(transition_type_)) {
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (transition_type_ & content::PAGE_TRANSITION_CLIENT_REDIRECT) {
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_redirect_type(
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT);
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (transition_type_ & content::PAGE_TRANSITION_SERVER_REDIRECT) {
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      sync_data.set_redirect_type(
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT);
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_navigation_forward_back(
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (transition_type_ & content::PAGE_TRANSITION_FORWARD_BACK) != 0);
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_navigation_from_address_bar(
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (transition_type_ & content::PAGE_TRANSITION_FROM_ADDRESS_BAR) != 0);
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_navigation_home_page(
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (transition_type_ & content::PAGE_TRANSITION_HOME_PAGE) != 0);
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_navigation_chain_start(
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (transition_type_ & content::PAGE_TRANSITION_CHAIN_START) != 0);
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_navigation_chain_end(
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (transition_type_ & content::PAGE_TRANSITION_CHAIN_END) != 0);
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_unique_id(unique_id_);
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_timestamp_msec(syncer::TimeToProtoTime(timestamp_));
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The full-resolution timestamp works as a global ID.
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_data.set_global_id(timestamp_.ToInternalValue());
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_data.set_search_terms(base::UTF16ToUTF8(search_terms_));
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
464424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  sync_data.set_http_status_code(http_status_code_);
465424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (favicon_url_.is_valid())
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    sync_data.set_favicon_url(favicon_url_.spec());
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
46990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (blocked_state_ != STATE_INVALID) {
47090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    sync_data.set_blocked_state(
47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        static_cast<sync_pb::TabNavigation_BlockedState>(blocked_state_));
47290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
47390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
47490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (std::set<std::string>::const_iterator it =
47590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           content_pack_categories_.begin();
47690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       it != content_pack_categories_.end(); ++it) {
47790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    sync_data.add_content_pack_categories(*it);
47890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
47990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_data.set_is_restored(is_restored_);
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return sync_data;
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector<NavigationEntry*> SerializedNavigationEntry::ToNavigationEntries(
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::vector<SerializedNavigationEntry>& navigations,
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* browser_context) {
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int page_id = 0;
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<NavigationEntry*> entries;
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (std::vector<SerializedNavigationEntry>::const_iterator
492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       it = navigations.begin(); it != navigations.end(); ++it) {
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    entries.push_back(
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        it->ToNavigationEntry(page_id, browser_context).release());
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++page_id;
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return entries;
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SerializedNavigationEntry::Sanitize() {
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Store original referrer so we can later see whether it was actually
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // changed during sanitization, and we need to strip the referrer from the
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // page state as well.
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::Referrer old_referrer = referrer_;
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!referrer_.url.SchemeIsHTTPOrHTTPS())
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    referrer_ = content::Referrer();
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switch (referrer_.policy) {
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case blink::WebReferrerPolicyNever:
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      referrer_.url = GURL();
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case blink::WebReferrerPolicyAlways:
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case blink::WebReferrerPolicyOrigin:
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      referrer_.url = referrer_.url.GetWithEmptyPath();
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case blink::WebReferrerPolicyDefault:
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Fall through.
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    default:
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      referrer_.policy = blink::WebReferrerPolicyDefault;
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (referrer_.url.SchemeIsSecure() && !virtual_url_.SchemeIsSecure())
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        referrer_.url = GURL();
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (referrer_.url != old_referrer.url ||
5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      referrer_.policy != old_referrer.policy) {
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    referrer_ = content::Referrer();
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    page_state_ = page_state_.RemoveReferrer();
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace sessions
533