page_state_serialization.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/common/page_state_serialization.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <algorithm> 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <limits> 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/pickle.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_number_conversions.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_util.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/utf_string_conversions.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/screen.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content { 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID) 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfloat g_device_scale_factor_for_testing = 0.0; 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//----------------------------------------------------------------------------- 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AppendDataToHttpBody(ExplodedHttpBody* http_body, const char* data, 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int data_length) { 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedHttpBodyElement element; 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.type = WebKit::WebHTTPBody::Element::TypeData; 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.data.assign(data, data_length); 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch http_body->elements.push_back(element); 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AppendFileRangeToHttpBody(ExplodedHttpBody* http_body, 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::NullableString16& file_path, 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int file_start, 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int file_length, 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch double file_modification_time) { 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedHttpBodyElement element; 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.type = WebKit::WebHTTPBody::Element::TypeFile; 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.file_path = file_path; 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.file_start = file_start; 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.file_length = file_length; 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.file_modification_time = file_modification_time; 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch http_body->elements.push_back(element); 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AppendURLRangeToHttpBody(ExplodedHttpBody* http_body, 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL& url, 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int file_start, 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int file_length, 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch double file_modification_time) { 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedHttpBodyElement element; 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.type = WebKit::WebHTTPBody::Element::TypeURL; 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.url = url; 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.file_start = file_start; 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.file_length = file_length; 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.file_modification_time = file_modification_time; 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch http_body->elements.push_back(element); 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AppendBlobToHttpBody(ExplodedHttpBody* http_body, const GURL& url) { 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedHttpBodyElement element; 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.type = WebKit::WebHTTPBody::Element::TypeBlob; 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.url = url; 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch http_body->elements.push_back(element); 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//---------------------------------------------------------------------------- 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AppendReferencedFilesFromHttpBody( 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<ExplodedHttpBodyElement>& elements, 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<base::NullableString16>* referenced_files) { 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < elements.size(); ++i) { 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (elements[i].type == WebKit::WebHTTPBody::Element::TypeFile) 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch referenced_files->push_back(elements[i].file_path); 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AppendReferencedFilesFromDocumentState( 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<base::NullableString16>& document_state, 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<base::NullableString16>* referenced_files) { 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (document_state.empty()) 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // This algorithm is adapted from Blink's core/html/FormController.cpp code. 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // We only care about how that code worked when this code snapshot was taken 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // as this code is only needed for backwards compat. 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // For reference, see FormController::formStatesFromStateVector at: 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // http://src.chromium.org/viewvc/blink/trunk/Source/core/html/FormController.cpp?pathrev=152274 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t index = 0; 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (document_state.size() < 3) 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch index++; // Skip over magic signature. 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch index++; // Skip over form key. 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t item_count; 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!base::StringToSizeT(document_state[index++].string(), &item_count)) 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch while (item_count--) { 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (index + 1 >= document_state.size()) 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch index++; // Skip over name. 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::NullableString16& type = document_state[index++]; 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (index >= document_state.size()) 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t value_size; 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!base::StringToSizeT(document_state[index++].string(), &value_size)) 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (index + value_size > document_state.size() || 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch index + value_size < index) // Check for overflow. 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (EqualsASCII(type.string(), "file")) { 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (value_size != 2) 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch referenced_files->push_back(document_state[index++]); 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch index++; // Skip over display name. 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch index += value_size; 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool RecursivelyAppendReferencedFiles( 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ExplodedFrameState& frame_state, 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<base::NullableString16>* referenced_files) { 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!frame_state.http_body.is_null) { 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AppendReferencedFilesFromHttpBody(frame_state.http_body.elements, 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch referenced_files); 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!AppendReferencedFilesFromDocumentState(frame_state.document_state, 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch referenced_files)) 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < frame_state.children.size(); ++i) { 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!RecursivelyAppendReferencedFiles(frame_state.children[i], 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch referenced_files)) 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//---------------------------------------------------------------------------- 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstruct SerializeObject { 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SerializeObject() 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : version(0), 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch parse_error(false) { 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SerializeObject(const char* data, int len) 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : pickle(data, len), 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch version(0), 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch parse_error(false) { 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter = PickleIterator(pickle); 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string GetAsString() { 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return std::string(static_cast<const char*>(pickle.data()), pickle.size()); 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Pickle pickle; 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PickleIterator iter; 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int version; 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool parse_error; 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Version ID of serialized format. 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 11: Min version 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 12: Adds support for contains_passwords in HTTP body 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 13: Adds support for URL (FileSystem URL) 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 14: Adds list of referenced files, version written only for first item. 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// NOTE: If the version is -1, then the pickle contains only a URL string. 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// See ReadPageState. 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst int kMinVersion = 11; 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst int kCurrentVersion = 14; 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// A bunch of convenience functions to read/write to SerializeObjects. The 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// de-serializers assume the input data will be in the correct format and fall 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// back to returning safe defaults when not. 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WriteData(const void* data, int length, SerializeObject* obj) { 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->pickle.WriteData(static_cast<const char*>(data), length); 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ReadData(SerializeObject* obj, const void** data, int* length) { 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* tmp; 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->pickle.ReadData(&obj->iter, &tmp, length)) { 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *data = tmp; 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->parse_error = true; 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *data = NULL; 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *length = 0; 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WriteInteger(int data, SerializeObject* obj) { 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->pickle.WriteInt(data); 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint ReadInteger(SerializeObject* obj) { 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int tmp; 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->pickle.ReadInt(&obj->iter, &tmp)) 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return tmp; 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->parse_error = true; 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return 0; 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ConsumeInteger(SerializeObject* obj) { 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int unused ALLOW_UNUSED = ReadInteger(obj); 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WriteInteger64(int64 data, SerializeObject* obj) { 230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->pickle.WriteInt64(data); 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint64 ReadInteger64(SerializeObject* obj) { 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 tmp = 0; 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->pickle.ReadInt64(&obj->iter, &tmp)) 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return tmp; 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->parse_error = true; 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return 0; 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WriteReal(double data, SerializeObject* obj) { 242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteData(&data, sizeof(double), obj); 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdouble ReadReal(SerializeObject* obj) { 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const void* tmp = NULL; 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int length = 0; 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch double value = 0.0; 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadData(obj, &tmp, &length); 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (length == static_cast<int>(sizeof(double))) { 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Use memcpy, as tmp may not be correctly aligned. 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch memcpy(&value, tmp, sizeof(double)); 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->parse_error = true; 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return value; 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WriteBoolean(bool data, SerializeObject* obj) { 260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->pickle.WriteInt(data ? 1 : 0); 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool ReadBoolean(SerializeObject* obj) { 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool tmp; 265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->pickle.ReadBool(&obj->iter, &tmp)) 266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return tmp; 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->parse_error = true; 268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WriteGURL(const GURL& url, SerializeObject* obj) { 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->pickle.WriteString(url.possibly_invalid_spec()); 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGURL ReadGURL(SerializeObject* obj) { 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string spec; 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->pickle.ReadString(&obj->iter, &spec)) 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return GURL(spec); 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->parse_error = true; 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return GURL(); 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// WriteString pickles the NullableString16 as <int length><char16* data>. 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// If length == -1, then the NullableString16 itself is null. Otherwise the 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// length is the number of char16 (not bytes) in the NullableString16. 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WriteString(const base::NullableString16& str, SerializeObject* obj) { 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (str.is_null()) { 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->pickle.WriteInt(-1); 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char16* data = str.string().data(); 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t length_in_bytes = str.string().length() * sizeof(char16); 292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK_LT(length_in_bytes, 294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<size_t>(std::numeric_limits<int>::max())); 295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->pickle.WriteInt(length_in_bytes); 296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->pickle.WriteBytes(data, length_in_bytes); 297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This reads a serialized NullableString16 from obj. If a string can't be 301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// read, NULL is returned. 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char16* ReadStringNoCopy(SerializeObject* obj, int* num_chars) { 303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int length_in_bytes; 304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!obj->pickle.ReadInt(&obj->iter, &length_in_bytes)) { 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->parse_error = true; 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NULL; 307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (length_in_bytes < 0) 310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NULL; 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* data; 313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!obj->pickle.ReadBytes(&obj->iter, &data, length_in_bytes)) { 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->parse_error = true; 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NULL; 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (num_chars) 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *num_chars = length_in_bytes / sizeof(char16); 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return reinterpret_cast<const char16*>(data); 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::NullableString16 ReadString(SerializeObject* obj) { 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int num_chars; 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char16* chars = ReadStringNoCopy(obj, &num_chars); 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return chars ? 327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::NullableString16(base::string16(chars, num_chars), false) : 328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::NullableString16(); 329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ConsumeString(SerializeObject* obj) { 332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char16* unused ALLOW_UNUSED = ReadStringNoCopy(obj, NULL); 333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <typename T> 336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WriteAndValidateVectorSize(const std::vector<T>& v, SerializeObject* obj) { 337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK_LT(v.size(), std::numeric_limits<int>::max() / sizeof(T)); 338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger(static_cast<int>(v.size()), obj); 339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochsize_t ReadAndValidateVectorSize(SerializeObject* obj, size_t element_size) { 342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t num_elements = static_cast<size_t>(ReadInteger(obj)); 343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Ensure that resizing a vector to size num_elements makes sense. 345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (std::numeric_limits<int>::max() / element_size <= num_elements) { 346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->parse_error = true; 347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return 0; 348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Ensure that it is plausible for the pickle to contain num_elements worth 351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // of data. 352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->pickle.payload_size() <= num_elements) { 353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->parse_error = true; 354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return 0; 355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return num_elements; 358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Writes a Vector of strings into a SerializeObject for serialization. 361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WriteStringVector( 362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<base::NullableString16>& data, SerializeObject* obj) { 363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteAndValidateVectorSize(data, obj); 364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < data.size(); ++i) { 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteString(data[i], obj); 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ReadStringVector(SerializeObject* obj, 370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<base::NullableString16>* result) { 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t num_elements = 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadAndValidateVectorSize(obj, sizeof(base::NullableString16)); 373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch result->resize(num_elements); 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < num_elements; ++i) 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (*result)[i] = ReadString(obj); 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Writes an ExplodedHttpBody object into a SerializeObject for serialization. 380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WriteHttpBody(const ExplodedHttpBody& http_body, SerializeObject* obj) { 381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteBoolean(!http_body.is_null, obj); 382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (http_body.is_null) 384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteAndValidateVectorSize(http_body.elements, obj); 387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < http_body.elements.size(); ++i) { 388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ExplodedHttpBodyElement& element = http_body.elements[i]; 389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger(element.type, obj); 390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (element.type == WebKit::WebHTTPBody::Element::TypeData) { 391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteData(element.data.data(), static_cast<int>(element.data.size()), 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj); 393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (element.type == WebKit::WebHTTPBody::Element::TypeFile) { 394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteString(element.file_path, obj); 395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger64(element.file_start, obj); 396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger64(element.file_length, obj); 397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteReal(element.file_modification_time, obj); 398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (element.type == WebKit::WebHTTPBody::Element::TypeURL) { 399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteGURL(element.url, obj); 400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger64(element.file_start, obj); 401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger64(element.file_length, obj); 402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteReal(element.file_modification_time, obj); 403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteGURL(element.url, obj); 405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger64(http_body.identifier, obj); 408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteBoolean(http_body.contains_passwords, obj); 409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ReadHttpBody(SerializeObject* obj, ExplodedHttpBody* http_body) { 412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // An initial boolean indicates if we have an HTTP body. 413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!ReadBoolean(obj)) 414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch http_body->is_null = false; 416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int num_elements = ReadInteger(obj); 418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (int i = 0; i < num_elements; ++i) { 420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int type = ReadInteger(obj); 421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == WebKit::WebHTTPBody::Element::TypeData) { 422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const void* data; 423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int length = -1; 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadData(obj, &data, &length); 425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (length >= 0) { 426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AppendDataToHttpBody(http_body, static_cast<const char*>(data), 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch length); 428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (type == WebKit::WebHTTPBody::Element::TypeFile) { 430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::NullableString16 file_path = ReadString(obj); 431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 file_start = ReadInteger64(obj); 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 file_length = ReadInteger64(obj); 433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch double file_modification_time = ReadReal(obj); 434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AppendFileRangeToHttpBody(http_body, file_path, file_start, file_length, 435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch file_modification_time); 436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (type == WebKit::WebHTTPBody::Element::TypeURL) { 437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL url = ReadGURL(obj); 438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 file_start = ReadInteger64(obj); 439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 file_length = ReadInteger64(obj); 440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch double file_modification_time = ReadReal(obj); 441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AppendURLRangeToHttpBody(http_body, url, file_start, file_length, 442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch file_modification_time); 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (type == WebKit::WebHTTPBody::Element::TypeBlob) { 444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL blob_url = ReadGURL(obj); 445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AppendBlobToHttpBody(http_body, blob_url); 446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch http_body->identifier = ReadInteger64(obj); 449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->version >= 12) 451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch http_body->contains_passwords = ReadBoolean(obj); 452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Writes the ExplodedFrameState data into the SerializeObject object for 455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// serialization. 456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WriteFrameState( 457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ExplodedFrameState& state, SerializeObject* obj, bool is_top) { 458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // WARNING: This data may be persisted for later use. As such, care must be 459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // taken when changing the serialized format. If a new field needs to be 460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // written, only adding at the end will make it easier to deal with loading 461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // older versions. Similarly, this should NOT save fields with sensitive 462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // data, such as password fields. 463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteString(state.url_string, obj); 465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteString(state.original_url_string, obj); 466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteString(state.target, obj); 467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteString(state.parent, obj); 468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteString(state.title, obj); 469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteString(state.alternate_title, obj); 470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteReal(state.visited_time, obj); 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger(state.scroll_offset.x(), obj); 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger(state.scroll_offset.y(), obj); 473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteBoolean(state.is_target_item, obj); 474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger(state.visit_count, obj); 475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteString(state.referrer, obj); 476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteStringVector(state.document_state, obj); 478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteReal(state.page_scale_factor, obj); 480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger64(state.item_sequence_number, obj); 481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger64(state.document_sequence_number, obj); 482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool has_state_object = !state.state_object.is_null(); 484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteBoolean(has_state_object, obj); 485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_state_object) 486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteString(state.state_object, obj); 487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteHttpBody(state.http_body, obj); 489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // NOTE: It is a quirk of the format that we still have to write the 491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // http_content_type field when the HTTP body is null. That's why this code 492eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // is here instead of inside WriteHttpBody. 493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteString(state.http_body.http_content_type, obj); 494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Subitems 496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<ExplodedFrameState>& children = state.children; 497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteAndValidateVectorSize(children, obj); 498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < children.size(); ++i) 499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteFrameState(children[i], obj, false); 500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ReadFrameState(SerializeObject* obj, bool is_top, 503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedFrameState* state) { 504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->version < 14 && !is_top) 505eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ConsumeInteger(obj); // Skip over redundant version field. 506eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->url_string = ReadString(obj); 508eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->original_url_string = ReadString(obj); 509eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->target = ReadString(obj); 510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->parent = ReadString(obj); 511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->title = ReadString(obj); 512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->alternate_title = ReadString(obj); 513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->visited_time = ReadReal(obj); 514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int x = ReadInteger(obj); 516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int y = ReadInteger(obj); 517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->scroll_offset = gfx::Point(x, y); 518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->is_target_item = ReadBoolean(obj); 520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->visit_count = ReadInteger(obj); 521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->referrer = ReadString(obj); 522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadStringVector(obj, &state->document_state); 524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->page_scale_factor = ReadReal(obj); 526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->item_sequence_number = ReadInteger64(obj); 527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->document_sequence_number = ReadInteger64(obj); 528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool has_state_object = ReadBoolean(obj); 530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_state_object) 531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->state_object = ReadString(obj); 532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadHttpBody(obj, &state->http_body); 534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // NOTE: It is a quirk of the format that we still have to read the 536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // http_content_type field when the HTTP body is null. That's why this code 537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // is here instead of inside ReadHttpBody. 538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->http_body.http_content_type = ReadString(obj); 539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->version < 14) 541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ConsumeString(obj); // Skip unused referrer string. 542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID) 544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->version == 11) { 545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Now-unused values that shipped in this version of Chrome for Android when 546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // it was on a private branch. 547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadReal(obj); 548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadBoolean(obj); 549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // In this version, page_scale_factor included device_scale_factor and 551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // scroll offsets were premultiplied by pageScaleFactor. 552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (state->page_scale_factor) { 553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch float device_scale_factor = g_device_scale_factor_for_testing; 554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!device_scale_factor) { 555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch device_scale_factor = 556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(). 557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch device_scale_factor(); 558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->scroll_offset = 560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Point(state->scroll_offset.x() / state->page_scale_factor, 561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->scroll_offset.y() / state->page_scale_factor); 562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->page_scale_factor /= device_scale_factor; 563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Subitems 568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t num_children = 569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadAndValidateVectorSize(obj, sizeof(ExplodedFrameState)); 570eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->children.resize(num_children); 571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < num_children; ++i) 572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadFrameState(obj, false, &state->children[i]); 573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WritePageState(const ExplodedPageState& state, SerializeObject* obj) { 576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteInteger(obj->version, obj); 577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteStringVector(state.referenced_files, obj); 578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WriteFrameState(state.top, obj, true); 579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ReadPageState(SerializeObject* obj, ExplodedPageState* state) { 582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->version = ReadInteger(obj); 583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->version == -1) { 585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL url = ReadGURL(obj); 586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // NOTE: GURL::possibly_invalid_spec() always returns valid UTF-8. 587eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->top.url_string = state->top.original_url_string = 588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::NullableString16(UTF8ToUTF16(url.possibly_invalid_spec()), false); 589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 591eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->version > kCurrentVersion || obj->version < kMinVersion) { 593eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj->parse_error = true; 594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->version >= 14) 598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadStringVector(obj, &state->referenced_files); 599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadFrameState(obj, true, &state->top); 601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj->version < 14) 603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RecursivelyAppendReferencedFiles(state->top, &state->referenced_files); 604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // De-dupe 606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->referenced_files.erase( 607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::unique(state->referenced_files.begin(), 608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->referenced_files.end()), 609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->referenced_files.end()); 610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 612eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochExplodedHttpBodyElement::ExplodedHttpBodyElement() 615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : type(WebKit::WebHTTPBody::Element::TypeData), 616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch file_start(0), 617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch file_length(-1), 618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch file_modification_time(std::numeric_limits<double>::quiet_NaN()) { 619eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochExplodedHttpBodyElement::~ExplodedHttpBodyElement() { 622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochExplodedHttpBody::ExplodedHttpBody() 625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : identifier(0), 626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch contains_passwords(false), 627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_null(true) { 628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochExplodedHttpBody::~ExplodedHttpBody() { 631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochExplodedFrameState::ExplodedFrameState() 634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : item_sequence_number(0), 635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch document_sequence_number(0), 636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch visit_count(0), 637eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch visited_time(0.0), 638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch page_scale_factor(0.0), 639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_target_item(false) { 640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochExplodedFrameState::~ExplodedFrameState() { 643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochExplodedPageState::ExplodedPageState() { 646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochExplodedPageState::~ExplodedPageState() { 649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool DecodePageState(const std::string& encoded, ExplodedPageState* exploded) { 652eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *exploded = ExplodedPageState(); 653eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 654eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (encoded.empty()) 655eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 656eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SerializeObject obj(encoded.data(), static_cast<int>(encoded.size())); 658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReadPageState(&obj, exploded); 659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return !obj.parse_error; 660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool EncodePageState(const ExplodedPageState& exploded, std::string* encoded) { 663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SerializeObject obj; 664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch obj.version = kCurrentVersion; 665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WritePageState(exploded, &obj); 666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *encoded = obj.GetAsString(); 667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID) 671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool DecodePageStateWithDeviceScaleFactorForTesting( 672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& encoded, 673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch float device_scale_factor, 674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedPageState* exploded) { 675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch g_device_scale_factor_for_testing = device_scale_factor; 676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool rv = DecodePageState(encoded, exploded); 677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch g_device_scale_factor_for_testing = 0.0; 678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace content 683