form_data.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
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 "components/autofill/core/common/form_field_data.h"
10
11namespace autofill {
12
13namespace {
14
15const int kPickleVersion = 1;
16
17bool ReadGURL(PickleIterator* iter, GURL* url) {
18  std::string spec;
19  if (!iter->ReadString(&spec))
20    return false;
21
22  *url = GURL(spec);
23  return true;
24}
25
26void SerializeFormFieldDataVector(const std::vector<FormFieldData> fields,
27                                  Pickle* pickle) {
28  pickle->WriteInt(static_cast<int>(fields.size()));
29  for (size_t i = 0; i < fields.size(); ++i) {
30    SerializeFormFieldData(fields[i], pickle);
31  }
32}
33
34bool DeserializeFormFieldDataVector(PickleIterator* iter,
35                                    std::vector<FormFieldData>* fields) {
36  int size;
37  if (!iter->ReadInt(&size))
38    return false;
39
40  FormFieldData temp;
41  for (int i = 0; i < size; ++i) {
42    if (!DeserializeFormFieldData(iter, &temp))
43      return false;
44
45    fields->push_back(temp);
46  }
47  return true;
48}
49
50}  // namespace
51
52FormData::FormData()
53    : user_submitted(false) {
54}
55
56FormData::FormData(const FormData& data)
57    : name(data.name),
58      method(data.method),
59      origin(data.origin),
60      action(data.action),
61      user_submitted(data.user_submitted),
62      fields(data.fields) {
63}
64
65FormData::~FormData() {
66}
67
68bool FormData::operator==(const FormData& form) const {
69  return name == form.name &&
70         StringToLowerASCII(method) == StringToLowerASCII(form.method) &&
71         origin == form.origin &&
72         action == form.action &&
73         user_submitted == form.user_submitted &&
74         fields == form.fields;
75}
76
77bool FormData::operator!=(const FormData& form) const {
78  return !operator==(form);
79}
80
81void SerializeFormData(const FormData& form_data, Pickle* pickle) {
82  pickle->WriteInt(kPickleVersion);
83  pickle->WriteString16(form_data.name);
84  pickle->WriteString16(form_data.method);
85  pickle->WriteString(form_data.origin.spec());
86  pickle->WriteString(form_data.action.spec());
87  pickle->WriteBool(form_data.user_submitted);
88  SerializeFormFieldDataVector(form_data.fields, pickle);
89}
90
91bool DeserializeFormData(PickleIterator* iter, FormData* form_data) {
92  int version;
93  if (!iter->ReadInt(&version)) {
94    LOG(ERROR) << "Bad pickle of FormData, no version present";
95    return false;
96  }
97
98  switch (version) {
99    case 1: {
100      if (!iter->ReadString16(&form_data->name) ||
101          !iter->ReadString16(&form_data->method) ||
102          !ReadGURL(iter, &form_data->origin) ||
103          !ReadGURL(iter, &form_data->action) ||
104          !iter->ReadBool(&form_data->user_submitted) ||
105          !DeserializeFormFieldDataVector(iter, &form_data->fields)) {
106        LOG(ERROR) << "Could not deserialize FormData from pickle";
107        return false;
108      }
109      break;
110    }
111    default: {
112      LOG(ERROR) << "Unknown FormData pickle version " << version;
113      return false;
114    }
115  }
116  return true;
117}
118
119}  // namespace autofill
120