| Index: components/autofill/core/common/form_field_data.cc
|
| diff --git a/components/autofill/core/common/form_field_data.cc b/components/autofill/core/common/form_field_data.cc
|
| index 1de786dcf3ca65b59ac429cc2f400000fdfdbb4f..afa9f53e0bc691f3df6b314583e3231307c7f5ab 100644
|
| --- a/components/autofill/core/common/form_field_data.cc
|
| +++ b/components/autofill/core/common/form_field_data.cc
|
| @@ -4,9 +4,59 @@
|
|
|
| #include "components/autofill/core/common/form_field_data.h"
|
|
|
| +#include "base/pickle.h"
|
| #include "base/strings/string_util.h"
|
| #include "base/strings/utf_string_conversions.h"
|
|
|
| +namespace {
|
| +
|
| +const int kPickleVersion = 1;
|
| +
|
| +void AddVectorToPickle(std::vector<base::string16> strings,
|
| + Pickle* pickle) {
|
| + pickle->WriteInt(static_cast<int>(strings.size()));
|
| + for (size_t i = 0; i < strings.size(); ++i) {
|
| + pickle->WriteString16(strings[i]);
|
| + }
|
| +}
|
| +
|
| +bool ReadStringVector(PickleIterator* iter,
|
| + std::vector<base::string16>* strings) {
|
| + int size;
|
| + if (!iter->ReadInt(&size))
|
| + return false;
|
| +
|
| + string16 pickle_data;
|
| + for (int i = 0; i < size; i++) {
|
| + if (!iter->ReadString16(&pickle_data))
|
| + return false;
|
| +
|
| + strings->push_back(pickle_data);
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +bool ReadTextDirection(PickleIterator* iter,
|
| + base::i18n::TextDirection* direction) {
|
| + int pickle_data;
|
| + if (!iter->ReadInt(&pickle_data))
|
| + return false;
|
| +
|
| + *direction = static_cast<base::i18n::TextDirection>(pickle_data);
|
| + return true;
|
| +}
|
| +
|
| +bool ReadSize(PickleIterator* iter, size_t* size) {
|
| + uint64 pickle_data;
|
| + if (!iter->ReadUInt64(&pickle_data))
|
| + return false;
|
| +
|
| + *size = static_cast<size_t>(pickle_data);
|
| + return true;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| namespace autofill {
|
|
|
| FormFieldData::FormFieldData()
|
| @@ -43,6 +93,62 @@ bool FormFieldData::operator<(const FormFieldData& field) const {
|
| return label < field.label;
|
| }
|
|
|
| +void SerializeFormFieldData(const FormFieldData& field_data,
|
| + Pickle* pickle) {
|
| + pickle->WriteInt(kPickleVersion);
|
| + pickle->WriteString16(field_data.label);
|
| + pickle->WriteString16(field_data.name);
|
| + pickle->WriteString16(field_data.value);
|
| + pickle->WriteString(field_data.form_control_type);
|
| + pickle->WriteString(field_data.autocomplete_attribute);
|
| + pickle->WriteUInt64(static_cast<uint64>(field_data.max_length));
|
| + pickle->WriteBool(field_data.is_autofilled);
|
| + pickle->WriteBool(field_data.is_checked);
|
| + pickle->WriteBool(field_data.is_checkable);
|
| + pickle->WriteBool(field_data.is_focusable);
|
| + pickle->WriteBool(field_data.should_autocomplete);
|
| + pickle->WriteInt(field_data.text_direction);
|
| + AddVectorToPickle(field_data.option_values, pickle);
|
| + AddVectorToPickle(field_data.option_contents, pickle);
|
| +}
|
| +
|
| +bool DeserializeFormFieldData(PickleIterator* iter,
|
| + FormFieldData* field_data) {
|
| + int version;
|
| + if (!iter->ReadInt(&version)) {
|
| + LOG(ERROR) << "Bad pickle of FormFieldData, no version present";
|
| + return false;
|
| + }
|
| +
|
| + switch (version) {
|
| + case 1: {
|
| + if (!iter->ReadString16(&field_data->label) ||
|
| + !iter->ReadString16(&field_data->name) ||
|
| + !iter->ReadString16(&field_data->value) ||
|
| + !iter->ReadString(&field_data->form_control_type) ||
|
| + !iter->ReadString(&field_data->autocomplete_attribute) ||
|
| + !ReadSize(iter, &field_data->max_length) ||
|
| + !iter->ReadBool(&field_data->is_autofilled) ||
|
| + !iter->ReadBool(&field_data->is_checked) ||
|
| + !iter->ReadBool(&field_data->is_checkable) ||
|
| + !iter->ReadBool(&field_data->is_focusable) ||
|
| + !iter->ReadBool(&field_data->should_autocomplete) ||
|
| + !ReadTextDirection(iter, &field_data->text_direction) ||
|
| + !ReadStringVector(iter, &field_data->option_values) ||
|
| + !ReadStringVector(iter, &field_data->option_contents)) {
|
| + LOG(ERROR) << "Could not deserialize FormFieldData from pickle";
|
| + return false;
|
| + }
|
| + break;
|
| + }
|
| + default: {
|
| + LOG(ERROR) << "Unknown FormFieldData pickle version " << version;
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| std::ostream& operator<<(std::ostream& os, const FormFieldData& field) {
|
| return os
|
| << UTF16ToUTF8(field.label)
|
|
|