form_field_data.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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_field_data.h"
6
7#include "base/pickle.h"
8#include "base/strings/string_util.h"
9#include "base/strings/utf_string_conversions.h"
10
11namespace {
12
13const int kPickleVersion = 1;
14
15void AddVectorToPickle(std::vector<base::string16> strings,
16                       Pickle* pickle) {
17  pickle->WriteInt(static_cast<int>(strings.size()));
18  for (size_t i = 0; i < strings.size(); ++i) {
19    pickle->WriteString16(strings[i]);
20  }
21}
22
23bool ReadStringVector(PickleIterator* iter,
24                      std::vector<base::string16>* strings) {
25  int size;
26  if (!iter->ReadInt(&size))
27    return false;
28
29  base::string16 pickle_data;
30  for (int i = 0; i < size; i++) {
31    if (!iter->ReadString16(&pickle_data))
32      return false;
33
34    strings->push_back(pickle_data);
35  }
36  return true;
37}
38
39bool ReadTextDirection(PickleIterator* iter,
40                       base::i18n::TextDirection* direction) {
41  int pickle_data;
42  if (!iter->ReadInt(&pickle_data))
43    return false;
44
45  *direction = static_cast<base::i18n::TextDirection>(pickle_data);
46  return true;
47}
48
49bool ReadSize(PickleIterator* iter, size_t* size) {
50  uint64 pickle_data;
51  if (!iter->ReadUInt64(&pickle_data))
52    return false;
53
54  *size = static_cast<size_t>(pickle_data);
55  return true;
56}
57
58}  // namespace
59
60namespace autofill {
61
62FormFieldData::FormFieldData()
63    : max_length(0),
64      is_autofilled(false),
65      is_checked(false),
66      is_checkable(false),
67      is_focusable(false),
68      should_autocomplete(true),
69      text_direction(base::i18n::UNKNOWN_DIRECTION) {
70}
71
72FormFieldData::~FormFieldData() {
73}
74
75bool FormFieldData::operator==(const FormFieldData& field) const {
76  // A FormFieldData stores a value, but the value is not part of the identity
77  // of the field, so we don't want to compare the values.
78  return (label == field.label &&
79          name == field.name &&
80          form_control_type == field.form_control_type &&
81          autocomplete_attribute == field.autocomplete_attribute &&
82          max_length == field.max_length);
83}
84
85bool FormFieldData::operator!=(const FormFieldData& field) const {
86  return !operator==(field);
87}
88
89bool FormFieldData::operator<(const FormFieldData& field) const {
90  if (label == field.label)
91    return name < field.name;
92
93  return label < field.label;
94}
95
96void SerializeFormFieldData(const FormFieldData& field_data,
97                            Pickle* pickle) {
98  pickle->WriteInt(kPickleVersion);
99  pickle->WriteString16(field_data.label);
100  pickle->WriteString16(field_data.name);
101  pickle->WriteString16(field_data.value);
102  pickle->WriteString(field_data.form_control_type);
103  pickle->WriteString(field_data.autocomplete_attribute);
104  pickle->WriteUInt64(static_cast<uint64>(field_data.max_length));
105  pickle->WriteBool(field_data.is_autofilled);
106  pickle->WriteBool(field_data.is_checked);
107  pickle->WriteBool(field_data.is_checkable);
108  pickle->WriteBool(field_data.is_focusable);
109  pickle->WriteBool(field_data.should_autocomplete);
110  pickle->WriteInt(field_data.text_direction);
111  AddVectorToPickle(field_data.option_values, pickle);
112  AddVectorToPickle(field_data.option_contents, pickle);
113}
114
115bool DeserializeFormFieldData(PickleIterator* iter,
116                              FormFieldData* field_data) {
117  int version;
118  if (!iter->ReadInt(&version)) {
119    LOG(ERROR) << "Bad pickle of FormFieldData, no version present";
120    return false;
121  }
122
123  switch (version) {
124    case 1: {
125      if (!iter->ReadString16(&field_data->label) ||
126          !iter->ReadString16(&field_data->name) ||
127          !iter->ReadString16(&field_data->value) ||
128          !iter->ReadString(&field_data->form_control_type) ||
129          !iter->ReadString(&field_data->autocomplete_attribute) ||
130          !ReadSize(iter, &field_data->max_length) ||
131          !iter->ReadBool(&field_data->is_autofilled) ||
132          !iter->ReadBool(&field_data->is_checked) ||
133          !iter->ReadBool(&field_data->is_checkable) ||
134          !iter->ReadBool(&field_data->is_focusable) ||
135          !iter->ReadBool(&field_data->should_autocomplete) ||
136          !ReadTextDirection(iter, &field_data->text_direction) ||
137          !ReadStringVector(iter, &field_data->option_values) ||
138          !ReadStringVector(iter, &field_data->option_contents)) {
139        LOG(ERROR) << "Could not deserialize FormFieldData from pickle";
140        return false;
141      }
142      break;
143    }
144    default: {
145      LOG(ERROR) << "Unknown FormFieldData pickle version " << version;
146      return false;
147    }
148  }
149  return true;
150}
151
152std::ostream& operator<<(std::ostream& os, const FormFieldData& field) {
153  return os
154      << base::UTF16ToUTF8(field.label)
155      << " "
156      << base::UTF16ToUTF8(field.name)
157      << " "
158      << base::UTF16ToUTF8(field.value)
159      << " "
160      << field.form_control_type
161      << " "
162      << field.autocomplete_attribute
163      << " "
164      << field.max_length
165      << " "
166      << (field.is_autofilled ? "true" : "false")
167      << " "
168      << (field.is_checked ? "true" : "false")
169      << " "
170      << (field.is_checkable ? "true" : "false")
171      << " "
172      << (field.is_focusable ? "true" : "false")
173      << " "
174      << (field.should_autocomplete ? "true" : "false")
175      << " "
176      << field.text_direction;
177}
178
179}  // namespace autofill
180