• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
ReadGURL(PickleIterator * iter,GURL * url)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 
SerializeFormFieldDataVector(const std::vector<FormFieldData> & fields,Pickle * pickle)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 
DeserializeFormFieldDataVector(PickleIterator * iter,std::vector<FormFieldData> * fields)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 
LogDeserializationError(int version)51 void LogDeserializationError(int version) {
52   DVLOG(1) << "Could not deserialize version " << version
53              << " FormData from pickle.";
54 }
55 
56 }  // namespace
57 
FormData()58 FormData::FormData()
59     : user_submitted(false) {
60 }
61 
FormData(const FormData & data)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 
~FormData()70 FormData::~FormData() {
71 }
72 
operator ==(const FormData & form) const73 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 
operator !=(const FormData & form) const81 bool FormData::operator!=(const FormData& form) const {
82   return !operator==(form);
83 }
84 
operator <(const FormData & form) const85 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 
operator <<(std::ostream & os,const FormData & form)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 
SerializeFormData(const FormData & form_data,Pickle * pickle)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 
DeserializeFormData(PickleIterator * iter,FormData * form_data)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