1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "components/autofill/core/common/form_data.h" 6 7 #include "base/pickle.h" 8 #include "base/strings/string_util.h" 9 #include "base/strings/utf_string_conversions.h" 10 #include "components/autofill/core/common/form_field_data.h" 11 12 namespace autofill { 13 14 namespace { 15 16 const int kPickleVersion = 2; 17 18 bool ReadGURL(PickleIterator* iter, GURL* url) { 19 std::string spec; 20 if (!iter->ReadString(&spec)) 21 return false; 22 23 *url = GURL(spec); 24 return true; 25 } 26 27 void SerializeFormFieldDataVector(const std::vector<FormFieldData>& fields, 28 Pickle* pickle) { 29 pickle->WriteInt(static_cast<int>(fields.size())); 30 for (size_t i = 0; i < fields.size(); ++i) { 31 SerializeFormFieldData(fields[i], pickle); 32 } 33 } 34 35 bool DeserializeFormFieldDataVector(PickleIterator* iter, 36 std::vector<FormFieldData>* fields) { 37 int size; 38 if (!iter->ReadInt(&size)) 39 return false; 40 41 FormFieldData temp; 42 for (int i = 0; i < size; ++i) { 43 if (!DeserializeFormFieldData(iter, &temp)) 44 return false; 45 46 fields->push_back(temp); 47 } 48 return true; 49 } 50 51 void LogDeserializationError(int version) { 52 DVLOG(1) << "Could not deserialize version " << version 53 << " FormData from pickle."; 54 } 55 56 } // namespace 57 58 FormData::FormData() 59 : user_submitted(false) { 60 } 61 62 FormData::FormData(const FormData& data) 63 : name(data.name), 64 origin(data.origin), 65 action(data.action), 66 user_submitted(data.user_submitted), 67 fields(data.fields) { 68 } 69 70 FormData::~FormData() { 71 } 72 73 bool FormData::operator==(const FormData& form) const { 74 return name == form.name && 75 origin == form.origin && 76 action == form.action && 77 user_submitted == form.user_submitted && 78 fields == form.fields; 79 } 80 81 bool FormData::operator!=(const FormData& form) const { 82 return !operator==(form); 83 } 84 85 bool FormData::operator<(const FormData& form) const { 86 if (name != form.name) 87 return name < form.name; 88 if (origin != form.origin) 89 return origin < form.origin; 90 if (action != form.action) 91 return action < form.action; 92 if (user_submitted != form.user_submitted) 93 return user_submitted < form.user_submitted; 94 return fields < form.fields; 95 } 96 97 std::ostream& operator<<(std::ostream& os, const FormData& form) { 98 os << base::UTF16ToUTF8(form.name) << " " 99 << form.origin << " " 100 << form.action << " " 101 << form.user_submitted << " " 102 << "Fields:"; 103 for (size_t i = 0; i < form.fields.size(); ++i) { 104 os << form.fields[i] << ","; 105 } 106 return os; 107 } 108 109 void SerializeFormData(const FormData& form_data, Pickle* pickle) { 110 pickle->WriteInt(kPickleVersion); 111 pickle->WriteString16(form_data.name); 112 pickle->WriteString(form_data.origin.spec()); 113 pickle->WriteString(form_data.action.spec()); 114 pickle->WriteBool(form_data.user_submitted); 115 SerializeFormFieldDataVector(form_data.fields, pickle); 116 } 117 118 bool DeserializeFormData(PickleIterator* iter, FormData* form_data) { 119 int version; 120 if (!iter->ReadInt(&version)) { 121 DVLOG(1) << "Bad pickle of FormData, no version present"; 122 return false; 123 } 124 125 switch (version) { 126 case 1: { 127 base::string16 method; 128 if (!iter->ReadString16(&form_data->name) || 129 !iter->ReadString16(&method) || 130 !ReadGURL(iter, &form_data->origin) || 131 !ReadGURL(iter, &form_data->action) || 132 !iter->ReadBool(&form_data->user_submitted) || 133 !DeserializeFormFieldDataVector(iter, &form_data->fields)) { 134 LogDeserializationError(version); 135 return false; 136 } 137 break; 138 } 139 case 2: 140 if (!iter->ReadString16(&form_data->name) || 141 !ReadGURL(iter, &form_data->origin) || 142 !ReadGURL(iter, &form_data->action) || 143 !iter->ReadBool(&form_data->user_submitted) || 144 !DeserializeFormFieldDataVector(iter, &form_data->fields)) { 145 LogDeserializationError(version); 146 return false; 147 } 148 break; 149 default: { 150 DVLOG(1) << "Unknown FormData pickle version " << version; 151 return false; 152 } 153 } 154 return true; 155 } 156 157 } // namespace autofill 158