12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/native/state_serializer.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/pickle.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/public/browser/child_process_security_policy.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_controller.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/public/browser/render_process_host.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/page_state.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Reasons for not re-using TabNavigation under chrome/ as of 20121116:
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// * Android WebView has different requirements for fields to store since
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   we are the only ones using values like BaseURLForDataURL.
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// * TabNavigation does unnecessary copying of data, which in Android
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   WebView case, is undesired since save/restore is called in Android
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   very frequently.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// * TabNavigation is tightly integrated with the rest of chrome session
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   restore and sync code, and has other purpose in addition to serializing
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   NavigationEntry.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using std::string;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace android_webview {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sanity check value that we are restoring from a valid pickle.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This can potentially used as an actual serialization version number in the
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// future if we ever decide to support restoring from older versions.
38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)const uint32 AW_STATE_VERSION = 20130814;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WriteToPickle(const content::WebContents& web_contents,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   Pickle* pickle) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(pickle);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!internal::WriteHeaderToPickle(pickle))
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const content::NavigationController& controller =
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents.GetController();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int entry_count = controller.GetEntryCount();
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int selected_entry = controller.GetCurrentEntryIndex();
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_GE(entry_count, 0);
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_GE(selected_entry, -1);  // -1 is valid
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_LT(selected_entry, entry_count);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteInt(entry_count))
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteInt(selected_entry))
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < entry_count; ++i) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!internal::WriteNavigationEntryToPickle(*controller.GetEntryAtIndex(i),
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                pickle))
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Please update AW_STATE_VERSION if serialization format is changed.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RestoreFromPickle(PickleIterator* iterator,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       content::WebContents* web_contents) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(iterator);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(web_contents);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!internal::RestoreHeaderFromPickle(iterator))
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int entry_count = -1;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int selected_entry = -2;  // -1 is a valid value
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!iterator->ReadInt(&entry_count))
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!iterator->ReadInt(&selected_entry))
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (entry_count < 0)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (selected_entry < -1)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (selected_entry >= entry_count)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<content::NavigationEntry> restored_entries;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < entry_count; ++i) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    restored_entries.push_back(content::NavigationEntry::Create());
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!internal::RestoreNavigationEntryFromPickle(iterator,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    restored_entries[i]))
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    restored_entries[i]->SetPageID(i);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |web_contents| takes ownership of these entries after this call.
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  content::NavigationController& controller = web_contents->GetController();
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  controller.Restore(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      selected_entry,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &restored_entries.get());
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(0u, restored_entries.size());
1152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  if (controller.GetActiveEntry()) {
1172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    // Set up the file access rights for the selected navigation entry.
1182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    // TODO(joth): This is duplicated from chrome/.../session_restore.cc and
1192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    // should be shared e.g. in  NavigationController. http://crbug.com/68222
1202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    const int id = web_contents->GetRenderProcessHost()->GetID();
1212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    const content::PageState& page_state =
1222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        controller.GetActiveEntry()->GetPageState();
1232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    const std::vector<base::FilePath>& file_paths =
1242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        page_state.GetReferencedFiles();
1252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    for (std::vector<base::FilePath>::const_iterator file = file_paths.begin();
1262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch         file != file_paths.end(); ++file) {
1272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      content::ChildProcessSecurityPolicy::GetInstance()->GrantReadFile(id,
1282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                                                                        *file);
1292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    }
1302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  controller.LoadIfNecessary();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace internal {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WriteHeaderToPickle(Pickle* pickle) {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return pickle->WriteUInt32(AW_STATE_VERSION);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RestoreHeaderFromPickle(PickleIterator* iterator) {
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 state_version = -1;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!iterator->ReadUInt32(&state_version))
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (AW_STATE_VERSION != state_version)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WriteNavigationEntryToPickle(const content::NavigationEntry& entry,
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  Pickle* pickle) {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteString(entry.GetURL().spec()))
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteString(entry.GetVirtualURL().spec()))
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const content::Referrer& referrer = entry.GetReferrer();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteString(referrer.url.spec()))
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteInt(static_cast<int>(referrer.policy)))
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteString16(entry.GetTitle()))
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!pickle->WriteString(entry.GetPageState().ToEncodedData()))
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteBool(static_cast<int>(entry.GetHasPostData())))
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteString(entry.GetOriginalRequestURL().spec()))
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteString(entry.GetBaseURLForDataURL().spec()))
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteBool(static_cast<int>(entry.GetIsOverridingUserAgent())))
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pickle->WriteInt64(entry.GetTimestamp().ToInternalValue()))
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
189424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!pickle->WriteInt(entry.GetHttpStatusCode()))
190424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return false;
191424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Please update AW_STATE_VERSION if serialization format is changed.
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RestoreNavigationEntryFromPickle(PickleIterator* iterator,
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      content::NavigationEntry* entry) {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string url;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!iterator->ReadString(&url))
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entry->SetURL(GURL(url));
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string virtual_url;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!iterator->ReadString(&virtual_url))
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entry->SetVirtualURL(GURL(virtual_url));
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::Referrer referrer;
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string referrer_url;
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int policy;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!iterator->ReadString(&referrer_url))
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!iterator->ReadInt(&policy))
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    referrer.url = GURL(referrer_url);
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    referrer.policy = static_cast<blink::WebReferrerPolicy>(policy);
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entry->SetReferrer(referrer);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 title;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!iterator->ReadString16(&title))
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entry->SetTitle(title);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string content_state;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!iterator->ReadString(&content_state))
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    entry->SetPageState(
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        content::PageState::CreateFromEncodedData(content_state));
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool has_post_data;
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!iterator->ReadBool(&has_post_data))
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entry->SetHasPostData(has_post_data);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string original_request_url;
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!iterator->ReadString(&original_request_url))
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entry->SetOriginalRequestURL(GURL(original_request_url));
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string base_url_for_data_url;
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!iterator->ReadString(&base_url_for_data_url))
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entry->SetBaseURLForDataURL(GURL(base_url_for_data_url));
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool is_overriding_user_agent;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!iterator->ReadBool(&is_overriding_user_agent))
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entry->SetIsOverridingUserAgent(is_overriding_user_agent);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 timestamp;
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!iterator->ReadInt64(&timestamp))
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entry->SetTimestamp(base::Time::FromInternalValue(timestamp));
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
278424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  {
279424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    int http_status_code;
280424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (!iterator->ReadInt(&http_status_code))
281424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return false;
282424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    entry->SetHttpStatusCode(http_status_code);
283424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
284424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace internal
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace android_webview
291