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..26367a054bc52bcef4842f9213e2a05414597f71 100644 |
--- a/components/autofill/core/common/form_field_data.cc |
+++ b/components/autofill/core/common/form_field_data.cc |
@@ -4,9 +4,49 @@ |
#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(strings.size()); |
+ for (size_t i = 0; i < strings.size(); ++i) { |
+ pickle->WriteString16(strings[i]); |
+ } |
+} |
+ |
+bool ReadVector(PickleIterator* iter, std::vector<base::string16>* strings) { |
Evan Stade
2013/08/28 22:42:11
suggested fn name: ReadStringVector or ReadStrings
Garrett Casto
2013/08/29 06:48:34
Done.
|
+ int size; |
+ if (!iter->ReadInt(&size)) |
+ return false; |
+ |
+ string16 temp; |
Evan Stade
2013/08/28 22:42:11
nit: temp is not a super useful var name, how abou
Garrett Casto
2013/08/29 06:48:34
Done.
|
+ for (int i = 0; i < size; i++) { |
+ if (!iter->ReadString16(&temp)) |
+ return false; |
+ |
+ strings->push_back(temp); |
+ } |
+ return true; |
+} |
+ |
+bool ReadTextDirection(PickleIterator* iter, |
+ base::i18n::TextDirection* direction) { |
+ int temp; |
Evan Stade
2013/08/28 22:42:11
ditto
Garrett Casto
2013/08/29 06:48:34
Done.
|
+ if (!iter->ReadInt(&temp)) |
+ return false; |
+ |
+ *direction = static_cast<base::i18n::TextDirection>(temp); |
+ return true; |
+} |
+ |
+} // namespace |
+ |
namespace autofill { |
FormFieldData::FormFieldData() |
@@ -43,6 +83,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(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) || |
+ !iter->ReadUInt64(&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) || |
+ !ReadVector(iter, &field_data->option_values) || |
+ !ReadVector(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) |