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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/autofill/form_structure.cc
===================================================================
--- chrome/browser/autofill/form_structure.cc (revision 72012)
+++ chrome/browser/autofill/form_structure.cc (working copy)
@@ -113,31 +113,30 @@
if (!auto_fillable)
return false;
- buzz::XmlElement autofil_request_xml(buzz::QName("autofillupload"));
+ buzz::XmlElement autofill_request_xml(buzz::QName("autofillupload"));
// Attributes for the <autofillupload> element.
//
// TODO(jhawkins): Work with toolbar devs to make a spec for autofill clients.
// For now these values are hacked from the toolbar code.
- autofil_request_xml.SetAttr(buzz::QName(kAttributeClientVersion),
- "6.1.1715.1442/en (GGLL)");
+ autofill_request_xml.SetAttr(buzz::QName(kAttributeClientVersion),
+ "6.1.1715.1442/en (GGLL)");
- autofil_request_xml.SetAttr(buzz::QName(kAttributeFormSignature),
- FormSignature());
+ autofill_request_xml.SetAttr(buzz::QName(kAttributeFormSignature),
+ FormSignature());
- autofil_request_xml.SetAttr(buzz::QName(kAttributeAutoFillUsed),
- auto_fill_used ? "true" : "false");
+ autofill_request_xml.SetAttr(buzz::QName(kAttributeAutoFillUsed),
+ auto_fill_used ? "true" : "false");
- // TODO(jhawkins): Hook this up to the personal data manager.
- // personaldata_manager_->GetDataPresent();
- autofil_request_xml.SetAttr(buzz::QName(kAttributeDataPresent), "");
+ autofill_request_xml.SetAttr(buzz::QName(kAttributeDataPresent),
+ ConvertPresenceBitsToString().c_str());
- if (!EncodeFormRequest(FormStructure::UPLOAD, &autofil_request_xml))
+ if (!EncodeFormRequest(FormStructure::UPLOAD, &autofill_request_xml))
return false; // Malformed form, skip it.
// Obtain the XML structure as a string.
*encoded_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
- *encoded_xml += autofil_request_xml.Str().c_str();
+ *encoded_xml += autofill_request_xml.Str().c_str();
return true;
}
@@ -151,13 +150,13 @@
encoded_xml->clear();
encoded_signatures->clear();
encoded_signatures->reserve(forms.size());
- buzz::XmlElement autofil_request_xml(buzz::QName("autofillquery"));
+ buzz::XmlElement autofill_request_xml(buzz::QName("autofillquery"));
// Attributes for the <autofillquery> element.
//
// TODO(jhawkins): Work with toolbar devs to make a spec for autofill clients.
// For now these values are hacked from the toolbar code.
- autofil_request_xml.SetAttr(buzz::QName(kAttributeClientVersion),
- "6.1.1715.1442/en (GGLL)");
+ autofill_request_xml.SetAttr(buzz::QName(kAttributeClientVersion),
+ "6.1.1715.1442/en (GGLL)");
// Some badly formatted web sites repeat forms - detect that and encode only
// one form as returned data would be the same for all the repeated forms.
std::set<std::string> processed_forms;
@@ -177,7 +176,7 @@
encompassing_xml_element.get()))
continue; // Malformed form, skip it.
- autofil_request_xml.AddElement(encompassing_xml_element.release());
+ autofill_request_xml.AddElement(encompassing_xml_element.release());
encoded_signatures->push_back(signature);
}
@@ -186,7 +185,7 @@
// Obtain the XML structure as a string.
*encoded_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
- *encoded_xml += autofil_request_xml.Str().c_str();
+ *encoded_xml += autofill_request_xml.Str().c_str();
return true;
}
@@ -413,17 +412,19 @@
const AutoFillField* field = fields_[index];
if (request_type == FormStructure::UPLOAD) {
FieldTypeSet types = field->possible_types();
- for (FieldTypeSet::const_iterator type = types.begin();
- type != types.end(); type++) {
- buzz::XmlElement *field_element = new buzz::XmlElement(
- buzz::QName(kXMLElementField));
+ // If we have more than one type for the field, report UNKNOWN_TYPE to not
+ // pollute crowd sourcing with inexact data.
+ AutoFillFieldType field_type = UNKNOWN_TYPE;
+ if (types.size() == 1)
+ field_type = *(types.begin());
+ buzz::XmlElement *field_element = new buzz::XmlElement(
+ buzz::QName(kXMLElementField));
- field_element->SetAttr(buzz::QName(kAttributeSignature),
- field->FieldSignature());
- field_element->SetAttr(buzz::QName(kAttributeAutoFillType),
- base::IntToString(*type));
- encompassing_xml_element->AddElement(field_element);
- }
+ field_element->SetAttr(buzz::QName(kAttributeSignature),
+ field->FieldSignature());
+ field_element->SetAttr(buzz::QName(kAttributeAutoFillType),
+ base::IntToString(field_type));
+ encompassing_xml_element->AddElement(field_element);
} else {
buzz::XmlElement *field_element = new buzz::XmlElement(
buzz::QName(kXMLElementField));
@@ -434,3 +435,43 @@
}
return true;
}
+
+std::string FormStructure::ConvertPresenceBitsToString() const {
+ std::vector<uint8> presence_bitfield;
+ // Determine all of the field types that were autofilled. Pack bits into
+ // |presence_bitfield|. The necessary size for |presence_bitfield| is
+ // ceil((MAX_VALID_FIELD_TYPE + 7) / 8) bytes (uint8).
+ presence_bitfield.resize((MAX_VALID_FIELD_TYPE + 0x7) >> 3);
dhollowa 2011/01/21 16:44:57 I'm with Ilya, I'd prefer we use div "/" and mod "
GeorgeY 2011/01/21 17:32:37 OK, but I am not really agree on more readable - d
+ for (size_t i = 0; i < presence_bitfield.size(); ++i)
+ presence_bitfield[i] = 0;
+
+ for (size_t i = 0; i < field_count(); ++i) {
+ const AutoFillField* field = fields_[i];
+ FieldTypeSet types = field->possible_types();
+ // If we have more than one type for the field, report UNKNOWN_TYPE to not
+ // pollute crowd sourcing with inexact data.
+ AutoFillFieldType field_type = UNKNOWN_TYPE;
+ if (types.size() == 1)
+ field_type = *(types.begin());
+ DCHECK(presence_bitfield.size() > (static_cast<size_t>(field_type) >> 3));
+ // Set bit in the bitfield: byte |field_type| >> 3, bit in byte
+ // |field_type| & 7 from the left.
+ presence_bitfield[field_type >> 3] |= (0x80 >> (field_type & 7));
+ }
+
+ std::string data_presence;
+ data_presence.reserve(presence_bitfield.size() * 2 + 1);
+
+ // Skip trailing zeroes. If all mask is 0 - return empty string.
+ size_t data_end = presence_bitfield.size();
+ for (; data_end > 0 && !presence_bitfield[data_end - 1]; --data_end) {
+ }
+
+ // Print all meaningfull bytes into the string.
+ for (size_t i = 0; i < data_end; ++i) {
+ base::StringAppendF(&data_presence, "%02x", presence_bitfield[i]);
+ }
+
+ return data_presence;
+}
+

Powered by Google App Engine
This is Rietveld 408576698