Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(692)

Side by Side Diff: chrome/browser/autofill/form_structure.cc

Issue 6213002: Propagate correct data to the Toolbar servers (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 std::string* encoded_xml) const { 108 std::string* encoded_xml) const {
109 DCHECK(encoded_xml); 109 DCHECK(encoded_xml);
110 encoded_xml->clear(); 110 encoded_xml->clear();
111 bool auto_fillable = IsAutoFillable(false); 111 bool auto_fillable = IsAutoFillable(false);
dhollowa 2011/01/21 03:18:57 I am unclear why this test is needed. If I have a
Ilya Sherman 2011/01/21 03:30:22 Yeah, this should be changed to ShouldBeParsed(tru
GeorgeY 2011/01/21 03:41:32 Non autofillable forms are bigger than 50 items or
Ilya Sherman 2011/01/21 03:45:02 IsAutoFillable() judges the field count based on h
112 DCHECK(auto_fillable); // Caller should've checked for search pages. 112 DCHECK(auto_fillable); // Caller should've checked for search pages.
113 if (!auto_fillable) 113 if (!auto_fillable)
114 return false; 114 return false;
115 115
116 buzz::XmlElement autofil_request_xml(buzz::QName("autofillupload")); 116 buzz::XmlElement autofill_request_xml(buzz::QName("autofillupload"));
117 117
118 // Attributes for the <autofillupload> element. 118 // Attributes for the <autofillupload> element.
119 // 119 //
120 // TODO(jhawkins): Work with toolbar devs to make a spec for autofill clients. 120 // TODO(jhawkins): Work with toolbar devs to make a spec for autofill clients.
121 // For now these values are hacked from the toolbar code. 121 // For now these values are hacked from the toolbar code.
122 autofil_request_xml.SetAttr(buzz::QName(kAttributeClientVersion), 122 autofill_request_xml.SetAttr(buzz::QName(kAttributeClientVersion),
123 "6.1.1715.1442/en (GGLL)"); 123 "6.1.1715.1442/en (GGLL)");
124 124
125 autofil_request_xml.SetAttr(buzz::QName(kAttributeFormSignature), 125 autofill_request_xml.SetAttr(buzz::QName(kAttributeFormSignature),
126 FormSignature()); 126 FormSignature());
127 127
128 autofil_request_xml.SetAttr(buzz::QName(kAttributeAutoFillUsed), 128 autofill_request_xml.SetAttr(buzz::QName(kAttributeAutoFillUsed),
129 auto_fill_used ? "true" : "false"); 129 auto_fill_used ? "true" : "false");
130 130
131 // TODO(jhawkins): Hook this up to the personal data manager. 131 autofill_request_xml.SetAttr(buzz::QName(kAttributeDataPresent),
132 // personaldata_manager_->GetDataPresent(); 132 ConvertPresenceBitsToString().c_str());
133 autofil_request_xml.SetAttr(buzz::QName(kAttributeDataPresent), "");
134 133
135 if (!EncodeFormRequest(FormStructure::UPLOAD, &autofil_request_xml)) 134 if (!EncodeFormRequest(FormStructure::UPLOAD, &autofill_request_xml))
136 return false; // Malformed form, skip it. 135 return false; // Malformed form, skip it.
137 136
138 // Obtain the XML structure as a string. 137 // Obtain the XML structure as a string.
139 *encoded_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; 138 *encoded_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
140 *encoded_xml += autofil_request_xml.Str().c_str(); 139 *encoded_xml += autofill_request_xml.Str().c_str();
141 140
142 return true; 141 return true;
143 } 142 }
144 143
145 // static 144 // static
146 bool FormStructure::EncodeQueryRequest(const ScopedVector<FormStructure>& forms, 145 bool FormStructure::EncodeQueryRequest(const ScopedVector<FormStructure>& forms,
147 std::vector<std::string>* encoded_signatures, 146 std::vector<std::string>* encoded_signatures,
148 std::string* encoded_xml) { 147 std::string* encoded_xml) {
149 DCHECK(encoded_signatures); 148 DCHECK(encoded_signatures);
150 DCHECK(encoded_xml); 149 DCHECK(encoded_xml);
151 encoded_xml->clear(); 150 encoded_xml->clear();
152 encoded_signatures->clear(); 151 encoded_signatures->clear();
153 encoded_signatures->reserve(forms.size()); 152 encoded_signatures->reserve(forms.size());
154 buzz::XmlElement autofil_request_xml(buzz::QName("autofillquery")); 153 buzz::XmlElement autofill_request_xml(buzz::QName("autofillquery"));
155 // Attributes for the <autofillquery> element. 154 // Attributes for the <autofillquery> element.
156 // 155 //
157 // TODO(jhawkins): Work with toolbar devs to make a spec for autofill clients. 156 // TODO(jhawkins): Work with toolbar devs to make a spec for autofill clients.
158 // For now these values are hacked from the toolbar code. 157 // For now these values are hacked from the toolbar code.
159 autofil_request_xml.SetAttr(buzz::QName(kAttributeClientVersion), 158 autofill_request_xml.SetAttr(buzz::QName(kAttributeClientVersion),
160 "6.1.1715.1442/en (GGLL)"); 159 "6.1.1715.1442/en (GGLL)");
161 // Some badly formatted web sites repeat forms - detect that and encode only 160 // 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. 161 // one form as returned data would be the same for all the repeated forms.
163 std::set<std::string> processed_forms; 162 std::set<std::string> processed_forms;
164 for (ScopedVector<FormStructure>::const_iterator it = forms.begin(); 163 for (ScopedVector<FormStructure>::const_iterator it = forms.begin();
165 it != forms.end(); 164 it != forms.end();
166 ++it) { 165 ++it) {
167 std::string signature((*it)->FormSignature()); 166 std::string signature((*it)->FormSignature());
168 if (processed_forms.find(signature) != processed_forms.end()) 167 if (processed_forms.find(signature) != processed_forms.end())
169 continue; 168 continue;
170 processed_forms.insert(signature); 169 processed_forms.insert(signature);
171 scoped_ptr<buzz::XmlElement> encompassing_xml_element( 170 scoped_ptr<buzz::XmlElement> encompassing_xml_element(
172 new buzz::XmlElement(buzz::QName("form"))); 171 new buzz::XmlElement(buzz::QName("form")));
173 encompassing_xml_element->SetAttr(buzz::QName(kAttributeSignature), 172 encompassing_xml_element->SetAttr(buzz::QName(kAttributeSignature),
174 signature); 173 signature);
175 174
176 if (!(*it)->EncodeFormRequest(FormStructure::QUERY, 175 if (!(*it)->EncodeFormRequest(FormStructure::QUERY,
177 encompassing_xml_element.get())) 176 encompassing_xml_element.get()))
178 continue; // Malformed form, skip it. 177 continue; // Malformed form, skip it.
179 178
180 autofil_request_xml.AddElement(encompassing_xml_element.release()); 179 autofill_request_xml.AddElement(encompassing_xml_element.release());
181 encoded_signatures->push_back(signature); 180 encoded_signatures->push_back(signature);
182 } 181 }
183 182
184 if (!encoded_signatures->size()) 183 if (!encoded_signatures->size())
185 return false; 184 return false;
186 185
187 // Obtain the XML structure as a string. 186 // Obtain the XML structure as a string.
188 *encoded_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; 187 *encoded_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
189 *encoded_xml += autofil_request_xml.Str().c_str(); 188 *encoded_xml += autofill_request_xml.Str().c_str();
190 189
191 return true; 190 return true;
192 } 191 }
193 192
194 // static 193 // static
195 void FormStructure::ParseQueryResponse(const std::string& response_xml, 194 void FormStructure::ParseQueryResponse(const std::string& response_xml,
196 const std::vector<FormStructure*>& forms, 195 const std::vector<FormStructure*>& forms,
197 UploadRequired* upload_required, 196 UploadRequired* upload_required,
198 const AutoFillMetrics& metric_logger) { 197 const AutoFillMetrics& metric_logger) {
199 metric_logger.Log(AutoFillMetrics::QUERY_RESPONSE_RECEIVED); 198 metric_logger.Log(AutoFillMetrics::QUERY_RESPONSE_RECEIVED);
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 } else { 426 } else {
428 buzz::XmlElement *field_element = new buzz::XmlElement( 427 buzz::XmlElement *field_element = new buzz::XmlElement(
429 buzz::QName(kXMLElementField)); 428 buzz::QName(kXMLElementField));
430 field_element->SetAttr(buzz::QName(kAttributeSignature), 429 field_element->SetAttr(buzz::QName(kAttributeSignature),
431 field->FieldSignature()); 430 field->FieldSignature());
432 encompassing_xml_element->AddElement(field_element); 431 encompassing_xml_element->AddElement(field_element);
433 } 432 }
434 } 433 }
435 return true; 434 return true;
436 } 435 }
436
437 std::string FormStructure::ConvertPresenceBitsToString() const {
dhollowa 2011/01/21 04:05:43 It looks like we're setting a bit for UNKNOWN_TYPE
GeorgeY 2011/01/21 17:32:37 Why not? Isn't it a valid bit? I do not really wan
438 std::vector<uint8> presence_bitfield;
439 // Determine all of the field types that were autofilled. Pack bits into
440 // |presence_bitfield|. The necessary size for |presence_bitfield| is
441 // ceil((MAX_VALID_FIELD_TYPE + 7) / 8) bytes (uint8).
442 presence_bitfield.resize((MAX_VALID_FIELD_TYPE + 0x7) >> 3);
443 for (size_t i = 0; i < presence_bitfield.size(); ++i)
444 presence_bitfield[i] = 0;
445
446 for (size_t i = 0; i < field_count(); ++i) {
447 const AutoFillField* field = fields_[i];
448 FieldTypeSet types = field->possible_types();
449 for (FieldTypeSet::const_iterator field_type = types.begin();
450 field_type != types.end(); ++field_type) {
451 DCHECK(presence_bitfield.size() >
452 (static_cast<size_t>(*field_type) >> 3));
453 // Set bit in the bitfield: byte |field_type| / 8, bit in byte
454 // |field_type| % 8 from the left.
455 presence_bitfield[*field_type >> 3] |= (0x80 >> (*field_type & 7));
Ilya Sherman 2011/01/21 00:25:58 nit: Is it actually less efficient to write "/ 8"
GeorgeY 2011/01/21 00:39:02 Yes, but AFAIK it is both acceptable :)
Ilya Sherman 2011/01/21 00:46:51 Fair enough -- just a bit weird that the code does
GeorgeY 2011/01/21 03:41:32 Changed. On 2011/01/21 00:46:51, Ilya Sherman wrot
456 }
457 }
458
459 std::string data_presence;
460 data_presence.reserve(presence_bitfield.size() * 2 + 1);
461
462 // Skip trailing zeroes. If all mask is 0 - return empty string.
463 size_t data_end = presence_bitfield.size();
464 for (; data_end > 0 && !presence_bitfield[data_end - 1]; --data_end) {
465 }
466
467 // Print all non-zero bytes into the string.
Ilya Sherman 2011/01/21 00:25:58 nit: There might be zero bytes printed as well, as
GeorgeY 2011/01/21 00:39:02 Rephrased.
468 for (size_t i = 0; i < data_end; ++i) {
469 base::StringAppendF(&data_presence, "%02x", presence_bitfield[i]);
470 }
471
472 return data_presence;
473 }
474
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698