OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/autofill/form_structure.h" | 5 #include "chrome/browser/autofill/form_structure.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/sha1.h" | 9 #include "base/sha1.h" |
10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 } else { | 98 } else { |
99 // Either the method is 'get', or we don't know. In this case we default | 99 // Either the method is 'get', or we don't know. In this case we default |
100 // to GET. | 100 // to GET. |
101 method_ = GET; | 101 method_ = GET; |
102 } | 102 } |
103 } | 103 } |
104 | 104 |
105 FormStructure::~FormStructure() {} | 105 FormStructure::~FormStructure() {} |
106 | 106 |
107 bool FormStructure::EncodeUploadRequest(bool auto_fill_used, | 107 bool FormStructure::EncodeUploadRequest(bool auto_fill_used, |
| 108 char const* data_presence, |
108 std::string* encoded_xml) const { | 109 std::string* encoded_xml) const { |
109 DCHECK(encoded_xml); | 110 DCHECK(encoded_xml); |
110 encoded_xml->clear(); | 111 encoded_xml->clear(); |
111 bool auto_fillable = IsAutoFillable(false); | 112 bool auto_fillable = IsAutoFillable(false); |
112 DCHECK(auto_fillable); // Caller should've checked for search pages. | 113 DCHECK(auto_fillable); // Caller should've checked for search pages. |
113 if (!auto_fillable) | 114 if (!auto_fillable) |
114 return false; | 115 return false; |
115 | 116 |
116 buzz::XmlElement autofil_request_xml(buzz::QName("autofillupload")); | 117 buzz::XmlElement autofill_request_xml(buzz::QName("autofillupload")); |
117 | 118 |
118 // Attributes for the <autofillupload> element. | 119 // Attributes for the <autofillupload> element. |
119 // | 120 // |
120 // TODO(jhawkins): Work with toolbar devs to make a spec for autofill clients. | 121 // TODO(jhawkins): Work with toolbar devs to make a spec for autofill clients. |
121 // For now these values are hacked from the toolbar code. | 122 // For now these values are hacked from the toolbar code. |
122 autofil_request_xml.SetAttr(buzz::QName(kAttributeClientVersion), | 123 autofill_request_xml.SetAttr(buzz::QName(kAttributeClientVersion), |
123 "6.1.1715.1442/en (GGLL)"); | 124 "6.1.1715.1442/en (GGLL)"); |
124 | 125 |
125 autofil_request_xml.SetAttr(buzz::QName(kAttributeFormSignature), | 126 autofill_request_xml.SetAttr(buzz::QName(kAttributeFormSignature), |
126 FormSignature()); | 127 FormSignature()); |
127 | 128 |
128 autofil_request_xml.SetAttr(buzz::QName(kAttributeAutoFillUsed), | 129 autofill_request_xml.SetAttr(buzz::QName(kAttributeAutoFillUsed), |
129 auto_fill_used ? "true" : "false"); | 130 auto_fill_used ? "true" : "false"); |
130 | 131 |
131 // TODO(jhawkins): Hook this up to the personal data manager. | 132 autofill_request_xml.SetAttr(buzz::QName(kAttributeDataPresent), |
132 // personaldata_manager_->GetDataPresent(); | 133 data_presence); |
133 autofil_request_xml.SetAttr(buzz::QName(kAttributeDataPresent), ""); | |
134 | 134 |
135 if (!EncodeFormRequest(FormStructure::UPLOAD, &autofil_request_xml)) | 135 if (!EncodeFormRequest(FormStructure::UPLOAD, &autofill_request_xml)) |
136 return false; // Malformed form, skip it. | 136 return false; // Malformed form, skip it. |
137 | 137 |
138 // Obtain the XML structure as a string. | 138 // Obtain the XML structure as a string. |
139 *encoded_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; | 139 *encoded_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; |
140 *encoded_xml += autofil_request_xml.Str().c_str(); | 140 *encoded_xml += autofill_request_xml.Str().c_str(); |
141 | 141 |
142 return true; | 142 return true; |
143 } | 143 } |
144 | 144 |
145 // static | 145 // static |
146 bool FormStructure::EncodeQueryRequest(const ScopedVector<FormStructure>& forms, | 146 bool FormStructure::EncodeQueryRequest(const ScopedVector<FormStructure>& forms, |
147 std::vector<std::string>* encoded_signatures, | 147 std::vector<std::string>* encoded_signatures, |
148 std::string* encoded_xml) { | 148 std::string* encoded_xml) { |
149 DCHECK(encoded_signatures); | 149 DCHECK(encoded_signatures); |
150 DCHECK(encoded_xml); | 150 DCHECK(encoded_xml); |
151 encoded_xml->clear(); | 151 encoded_xml->clear(); |
152 encoded_signatures->clear(); | 152 encoded_signatures->clear(); |
153 encoded_signatures->reserve(forms.size()); | 153 encoded_signatures->reserve(forms.size()); |
154 buzz::XmlElement autofil_request_xml(buzz::QName("autofillquery")); | 154 buzz::XmlElement autofill_request_xml(buzz::QName("autofillquery")); |
155 // Attributes for the <autofillquery> element. | 155 // Attributes for the <autofillquery> element. |
156 // | 156 // |
157 // TODO(jhawkins): Work with toolbar devs to make a spec for autofill clients. | 157 // TODO(jhawkins): Work with toolbar devs to make a spec for autofill clients. |
158 // For now these values are hacked from the toolbar code. | 158 // For now these values are hacked from the toolbar code. |
159 autofil_request_xml.SetAttr(buzz::QName(kAttributeClientVersion), | 159 autofill_request_xml.SetAttr(buzz::QName(kAttributeClientVersion), |
160 "6.1.1715.1442/en (GGLL)"); | 160 "6.1.1715.1442/en (GGLL)"); |
161 // Some badly formatted web sites repeat forms - detect that and encode only | 161 // Some badly formatted web sites repeat forms - detect that and encode only |
162 // one form as returned data would be the same for all the repeated forms. | 162 // one form as returned data would be the same for all the repeated forms. |
163 std::set<std::string> processed_forms; | 163 std::set<std::string> processed_forms; |
164 for (ScopedVector<FormStructure>::const_iterator it = forms.begin(); | 164 for (ScopedVector<FormStructure>::const_iterator it = forms.begin(); |
165 it != forms.end(); | 165 it != forms.end(); |
166 ++it) { | 166 ++it) { |
167 std::string signature((*it)->FormSignature()); | 167 std::string signature((*it)->FormSignature()); |
168 if (processed_forms.find(signature) != processed_forms.end()) | 168 if (processed_forms.find(signature) != processed_forms.end()) |
169 continue; | 169 continue; |
170 processed_forms.insert(signature); | 170 processed_forms.insert(signature); |
171 scoped_ptr<buzz::XmlElement> encompassing_xml_element( | 171 scoped_ptr<buzz::XmlElement> encompassing_xml_element( |
172 new buzz::XmlElement(buzz::QName("form"))); | 172 new buzz::XmlElement(buzz::QName("form"))); |
173 encompassing_xml_element->SetAttr(buzz::QName(kAttributeSignature), | 173 encompassing_xml_element->SetAttr(buzz::QName(kAttributeSignature), |
174 signature); | 174 signature); |
175 | 175 |
176 if (!(*it)->EncodeFormRequest(FormStructure::QUERY, | 176 if (!(*it)->EncodeFormRequest(FormStructure::QUERY, |
177 encompassing_xml_element.get())) | 177 encompassing_xml_element.get())) |
178 continue; // Malformed form, skip it. | 178 continue; // Malformed form, skip it. |
179 | 179 |
180 autofil_request_xml.AddElement(encompassing_xml_element.release()); | 180 autofill_request_xml.AddElement(encompassing_xml_element.release()); |
181 encoded_signatures->push_back(signature); | 181 encoded_signatures->push_back(signature); |
182 } | 182 } |
183 | 183 |
184 if (!encoded_signatures->size()) | 184 if (!encoded_signatures->size()) |
185 return false; | 185 return false; |
186 | 186 |
187 // Obtain the XML structure as a string. | 187 // Obtain the XML structure as a string. |
188 *encoded_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; | 188 *encoded_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; |
189 *encoded_xml += autofil_request_xml.Str().c_str(); | 189 *encoded_xml += autofill_request_xml.Str().c_str(); |
190 | 190 |
191 return true; | 191 return true; |
192 } | 192 } |
193 | 193 |
194 // static | 194 // static |
195 void FormStructure::ParseQueryResponse(const std::string& response_xml, | 195 void FormStructure::ParseQueryResponse(const std::string& response_xml, |
196 const std::vector<FormStructure*>& forms, | 196 const std::vector<FormStructure*>& forms, |
197 UploadRequired* upload_required, | 197 UploadRequired* upload_required, |
198 const AutoFillMetrics& metric_logger) { | 198 const AutoFillMetrics& metric_logger) { |
199 metric_logger.Log(AutoFillMetrics::QUERY_RESPONSE_RECEIVED); | 199 metric_logger.Log(AutoFillMetrics::QUERY_RESPONSE_RECEIVED); |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 } else { | 427 } else { |
428 buzz::XmlElement *field_element = new buzz::XmlElement( | 428 buzz::XmlElement *field_element = new buzz::XmlElement( |
429 buzz::QName(kXMLElementField)); | 429 buzz::QName(kXMLElementField)); |
430 field_element->SetAttr(buzz::QName(kAttributeSignature), | 430 field_element->SetAttr(buzz::QName(kAttributeSignature), |
431 field->FieldSignature()); | 431 field->FieldSignature()); |
432 encompassing_xml_element->AddElement(field_element); | 432 encompassing_xml_element->AddElement(field_element); |
433 } | 433 } |
434 } | 434 } |
435 return true; | 435 return true; |
436 } | 436 } |
OLD | NEW |