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(×tamp)) 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