| Index: components/autofill/core/browser/form_structure.cc
|
| diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
|
| index 3c49b4509aa9793d4b86b13beda09bd42989d240..d502a0dee7660ec040f354d163048e01cdc0bb9c 100644
|
| --- a/components/autofill/core/browser/form_structure.cc
|
| +++ b/components/autofill/core/browser/form_structure.cc
|
| @@ -65,14 +65,15 @@ const char kIgnorePatternInFieldName[] = "\\d{5,}+";
|
|
|
| // Helper for |EncodeUploadRequest()| that creates a bit field corresponding to
|
| // |available_field_types| and returns the hex representation as a string.
|
| -std::string EncodeFieldTypes(const FieldTypeSet& available_field_types) {
|
| +std::string EncodeFieldTypes(const ServerFieldTypeSet& available_field_types) {
|
| // There are |MAX_VALID_FIELD_TYPE| different field types and 8 bits per byte,
|
| // so we need ceil(MAX_VALID_FIELD_TYPE / 8) bytes to encode the bit field.
|
| const size_t kNumBytes = (MAX_VALID_FIELD_TYPE + 0x7) / 8;
|
|
|
| // Pack the types in |available_field_types| into |bit_field|.
|
| std::vector<uint8> bit_field(kNumBytes, 0);
|
| - for (FieldTypeSet::const_iterator field_type = available_field_types.begin();
|
| + for (ServerFieldTypeSet::const_iterator field_type =
|
| + available_field_types.begin();
|
| field_type != available_field_types.end();
|
| ++field_type) {
|
| // Set the appropriate bit in the field. The bit we set is the one
|
| @@ -107,9 +108,9 @@ void EncodeFieldForUpload(const AutofillField& field,
|
| if (field.is_checkable)
|
| return;
|
|
|
| - FieldTypeSet types = field.possible_types();
|
| + ServerFieldTypeSet types = field.possible_types();
|
| // |types| could be empty in unit-tests only.
|
| - for (FieldTypeSet::iterator field_type = types.begin();
|
| + for (ServerFieldTypeSet::iterator field_type = types.begin();
|
| field_type != types.end(); ++field_type) {
|
| buzz::XmlElement *field_element = new buzz::XmlElement(
|
| buzz::QName(kXMLElementField));
|
| @@ -137,8 +138,8 @@ void EncodeFieldForQuery(const AutofillField& field,
|
| // in field assignments xml, and also add them to the parent XmlElement.
|
| void EncodeFieldForFieldAssignments(const AutofillField& field,
|
| buzz::XmlElement* parent) {
|
| - FieldTypeSet types = field.possible_types();
|
| - for (FieldTypeSet::iterator field_type = types.begin();
|
| + ServerFieldTypeSet types = field.possible_types();
|
| + for (ServerFieldTypeSet::iterator field_type = types.begin();
|
| field_type != types.end(); ++field_type) {
|
| buzz::XmlElement *field_element = new buzz::XmlElement(
|
| buzz::QName(kXMLElementFields));
|
| @@ -164,8 +165,9 @@ bool IsContactTypeHint(const std::string& token) {
|
| // Returns |true| iff the |token| is a type hint appropriate for a field of the
|
| // given |field_type|, as specified in the implementation section of
|
| // http://is.gd/whatwg_autocomplete
|
| +// TODO(isherman): This should use HTML field types, not native ones.
|
| bool ContactTypeHintMatchesFieldType(const std::string& token,
|
| - AutofillFieldType field_type) {
|
| + ServerFieldType field_type) {
|
| // The "home" and "work" type hints are only appropriate for email and phone
|
| // number field types.
|
| if (token == "home" || token == "work") {
|
| @@ -189,7 +191,8 @@ bool ContactTypeHintMatchesFieldType(const std::string& token,
|
| // |autocomplete_type|, if there is one, in the context of the given |field|.
|
| // Chrome Autofill supports a subset of the field types listed at
|
| // http://is.gd/whatwg_autocomplete
|
| -AutofillFieldType FieldTypeFromAutocompleteType(
|
| +// TODO(isherman): This should use HTML field types, not native ones.
|
| +ServerFieldType FieldTypeFromAutocompleteType(
|
| const std::string& autocomplete_type,
|
| const AutofillField& field) {
|
| if (autocomplete_type == "name")
|
| @@ -379,11 +382,12 @@ void FormStructure::DetermineHeuristicTypes(
|
| &has_author_specified_sections);
|
|
|
| if (!has_author_specified_types_) {
|
| - FieldTypeMap field_type_map;
|
| + ServerFieldTypeMap field_type_map;
|
| FormField::ParseFormFields(fields_.get(), &field_type_map);
|
| - for (size_t index = 0; index < field_count(); index++) {
|
| - AutofillField* field = fields_[index];
|
| - FieldTypeMap::iterator iter = field_type_map.find(field->unique_name());
|
| + for (size_t i = 0; i < field_count(); ++i) {
|
| + AutofillField* field = fields_[i];
|
| + ServerFieldTypeMap::iterator iter =
|
| + field_type_map.find(field->unique_name());
|
| if (iter != field_type_map.end())
|
| field->set_heuristic_type(iter->second);
|
| }
|
| @@ -403,7 +407,7 @@ void FormStructure::DetermineHeuristicTypes(
|
| }
|
|
|
| bool FormStructure::EncodeUploadRequest(
|
| - const FieldTypeSet& available_field_types,
|
| + const ServerFieldTypeSet& available_field_types,
|
| bool form_was_autofilled,
|
| std::string* encoded_xml) const {
|
| DCHECK(ShouldBeCrowdsourced());
|
| @@ -413,7 +417,8 @@ bool FormStructure::EncodeUploadRequest(
|
| for (std::vector<AutofillField*>::const_iterator field = begin();
|
| field != end();
|
| ++field) {
|
| - for (FieldTypeSet::const_iterator type = (*field)->possible_types().begin();
|
| + for (ServerFieldTypeSet::const_iterator type =
|
| + (*field)->possible_types().begin();
|
| type != (*field)->possible_types().end();
|
| ++type) {
|
| DCHECK(*type == UNKNOWN_TYPE ||
|
| @@ -448,7 +453,7 @@ bool FormStructure::EncodeUploadRequest(
|
| }
|
|
|
| bool FormStructure::EncodeFieldAssignments(
|
| - const FieldTypeSet& available_field_types,
|
| + const ServerFieldTypeSet& available_field_types,
|
| std::string* encoded_xml) const {
|
| DCHECK(ShouldBeCrowdsourced());
|
|
|
| @@ -597,12 +602,12 @@ void FormStructure::ParseQueryResponse(
|
| // UNKNOWN_TYPE is reserved for use by the client.
|
| DCHECK_NE(current_info->field_type, UNKNOWN_TYPE);
|
|
|
| - AutofillFieldType heuristic_type = (*field)->type();
|
| + ServerFieldType heuristic_type = (*field)->heuristic_type();
|
| if (heuristic_type != UNKNOWN_TYPE)
|
| heuristics_detected_fillable_field = true;
|
|
|
| (*field)->set_server_type(current_info->field_type);
|
| - if (heuristic_type != (*field)->type())
|
| + if (heuristic_type != (*field)->Type().server_type())
|
| query_response_overrode_heuristics = true;
|
|
|
| // Copy default value into the field if available.
|
| @@ -658,7 +663,7 @@ void FormStructure::GetFieldTypePredictions(
|
| annotated_field.server_type =
|
| AutofillType::FieldTypeToString((*field)->server_type());
|
| annotated_field.overall_type =
|
| - AutofillType::FieldTypeToString((*field)->type());
|
| + AutofillType::FieldTypeToString((*field)->Type().server_type());
|
| form.fields.push_back(annotated_field);
|
| }
|
|
|
| @@ -806,7 +811,7 @@ void FormStructure::LogQualityMetrics(
|
|
|
| // No further logging for empty fields nor for fields where the entered data
|
| // does not appear to already exist in the user's stored Autofill data.
|
| - const FieldTypeSet& field_types = field->possible_types();
|
| + const ServerFieldTypeSet& field_types = field->possible_types();
|
| DCHECK(!field_types.empty());
|
| if (field_types.count(EMPTY_TYPE) || field_types.count(UNKNOWN_TYPE))
|
| continue;
|
| @@ -819,8 +824,8 @@ void FormStructure::LogQualityMetrics(
|
|
|
| // Collapse field types that Chrome treats as identical, e.g. home and
|
| // billing address fields.
|
| - FieldTypeSet collapsed_field_types;
|
| - for (FieldTypeSet::const_iterator it = field_types.begin();
|
| + ServerFieldTypeSet collapsed_field_types;
|
| + for (ServerFieldTypeSet::const_iterator it = field_types.begin();
|
| it != field_types.end();
|
| ++it) {
|
| // Since we currently only support US phone numbers, the (city code + main
|
| @@ -834,13 +839,13 @@ void FormStructure::LogQualityMetrics(
|
| }
|
|
|
| // Capture the field's type, if it is unambiguous.
|
| - AutofillFieldType field_type = UNKNOWN_TYPE;
|
| + ServerFieldType field_type = UNKNOWN_TYPE;
|
| if (collapsed_field_types.size() == 1)
|
| field_type = *collapsed_field_types.begin();
|
|
|
| - AutofillFieldType heuristic_type = field->heuristic_type();
|
| - AutofillFieldType server_type = field->server_type();
|
| - AutofillFieldType predicted_type = field->type();
|
| + ServerFieldType heuristic_type = field->heuristic_type();
|
| + ServerFieldType server_type = field->server_type();
|
| + ServerFieldType predicted_type = field->Type().server_type();
|
|
|
| // Log heuristic, server, and overall type quality metrics, independently of
|
| // whether the field was autofilled.
|
| @@ -1127,7 +1132,7 @@ void FormStructure::ParseFieldTypesFromAutocompleteAttributes(
|
| DCHECK(!tokens.empty());
|
| std::string field_type_token = tokens.back();
|
| tokens.pop_back();
|
| - AutofillFieldType field_type =
|
| + ServerFieldType field_type =
|
| FieldTypeFromAutocompleteType(field_type_token, *field);
|
| if (field_type == UNKNOWN_TYPE)
|
| continue;
|
| @@ -1205,13 +1210,13 @@ void FormStructure::IdentifySections(bool has_author_specified_sections) {
|
| base::string16 current_section = fields_.front()->unique_name();
|
|
|
| // Keep track of the types we've seen in this section.
|
| - std::set<AutofillFieldType> seen_types;
|
| - AutofillFieldType previous_type = UNKNOWN_TYPE;
|
| + std::set<ServerFieldType> seen_types;
|
| + ServerFieldType previous_type = UNKNOWN_TYPE;
|
|
|
| for (std::vector<AutofillField*>::iterator field = fields_.begin();
|
| field != fields_.end(); ++field) {
|
| - const AutofillFieldType current_type =
|
| - AutofillType::GetEquivalentFieldType((*field)->type());
|
| + const ServerFieldType current_type =
|
| + AutofillType::GetEquivalentFieldType((*field)->Type().server_type());
|
|
|
| bool already_saw_current_type = seen_types.count(current_type) > 0;
|
|
|
| @@ -1250,7 +1255,7 @@ void FormStructure::IdentifySections(bool has_author_specified_sections) {
|
| // This simplifies the section-aware logic in autofill_manager.cc.
|
| for (std::vector<AutofillField*>::iterator field = fields_.begin();
|
| field != fields_.end(); ++field) {
|
| - FieldTypeGroup field_type_group = AutofillType((*field)->type()).group();
|
| + FieldTypeGroup field_type_group = (*field)->Type().group();
|
| if (field_type_group == CREDIT_CARD)
|
| (*field)->set_section((*field)->section() + "-cc");
|
| else
|
|
|