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 5d6815fd0c7c17ba142c0ba39e66aac118970b3c..2d95083e0b339058c2ce99224ac4cfe530bcc628 100644 |
--- a/components/autofill/core/browser/form_structure.cc |
+++ b/components/autofill/core/browser/form_structure.cc |
@@ -27,13 +27,14 @@ |
#include "components/autofill/core/browser/field_types.h" |
#include "components/autofill/core/browser/form_field.h" |
#include "components/autofill/core/common/autofill_constants.h" |
+#include "components/autofill/core/common/autofill_util.h" |
#include "components/autofill/core/common/form_data.h" |
#include "components/autofill/core/common/form_data_predictions.h" |
#include "components/autofill/core/common/form_field_data.h" |
#include "components/autofill/core/common/form_field_data_predictions.h" |
+#include "components/autofill/core/common/signatures_util.h" |
#include "components/rappor/rappor_service.h" |
#include "components/rappor/rappor_utils.h" |
-#include "third_party/re2/src/re2/re2.h" |
namespace autofill { |
namespace { |
@@ -42,9 +43,6 @@ const char kClientVersion[] = "6.1.1715.1442/en (GGLL)"; |
const char kBillingMode[] = "billing"; |
const char kShippingMode[] = "shipping"; |
-// Strip away >= 5 consecutive digits. |
-const char kIgnorePatternInFieldName[] = "\\d{5,}"; |
- |
// A form is considered to have a high prediction mismatch rate if the number of |
// mismatches exceeds this threshold. |
const int kNumberOfMismatchesThreshold = 3; |
@@ -272,14 +270,6 @@ HtmlFieldType FieldTypeFromAutocompleteAttributeValue( |
return HTML_TYPE_UNRECOGNIZED; |
} |
-std::string StripDigitsIfRequired(const base::string16& input) { |
- std::string return_string = base::UTF16ToUTF8(input); |
- |
- re2::RE2::GlobalReplace(&return_string, re2::RE2(kIgnorePatternInFieldName), |
- std::string()); |
- return return_string; |
-} |
- |
std::ostream& operator<<( |
std::ostream& out, |
const autofill::AutofillQueryResponseContents& response) { |
@@ -317,14 +307,8 @@ FormStructure::FormStructure(const FormData& form) |
// Copy the form fields. |
std::map<base::string16, size_t> unique_names; |
for (const FormFieldData& field : form.fields) { |
- if (!ShouldSkipField(field)) { |
- // Add all supported form fields (including with empty names) to the |
- // signature. This is a requirement for Autofill servers. |
- form_signature_field_names_.append("&"); |
- form_signature_field_names_.append(StripDigitsIfRequired(field.name)); |
- |
+ if (!ShouldSkipField(field)) |
++active_field_count_; |
- } |
if (field.form_control_type == "password") |
has_password_field_ = true; |
@@ -340,6 +324,7 @@ FormStructure::FormStructure(const FormData& form) |
fields_.push_back(new AutofillField(field, unique_name)); |
} |
+ form_signature_ = autofill::CalculateFormSignature(form); |
// Do further processing on the fields, as needed. |
ProcessExtractedFields(); |
} |
@@ -403,12 +388,12 @@ bool FormStructure::EncodeUploadRequest( |
upload->set_submission(observed_submission); |
upload->set_client_version(kClientVersion); |
- upload->set_form_signature(FormSignature64Bit()); |
+ upload->set_form_signature(form_signature()); |
upload->set_autofill_used(form_was_autofilled); |
upload->set_data_present(EncodeFieldTypes(available_field_types)); |
if (IsAutofillFieldMetadataEnabled()) { |
- upload->set_action_signature(Hash64Bit(target_url_.host())); |
+ upload->set_action_signature(StrToHash64Bit(target_url_.host())); |
if (!form_name().empty()) |
upload->set_form_name(base::UTF16ToUTF8(form_name())); |
} |
@@ -441,7 +426,7 @@ bool FormStructure::EncodeQueryRequest( |
// one form as returned data would be the same for all the repeated forms. |
std::set<std::string> processed_forms; |
for (const auto* form : forms) { |
- std::string signature(form->FormSignature()); |
+ std::string signature(form->FormSignatureAsStr()); |
if (processed_forms.find(signature) != processed_forms.end()) |
continue; |
processed_forms.insert(signature); |
@@ -545,13 +530,13 @@ std::vector<FormDataPredictions> FormStructure::GetFieldTypePredictions( |
form.data.origin = form_structure->source_url_; |
form.data.action = form_structure->target_url_; |
form.data.is_form_tag = form_structure->is_form_tag_; |
- form.signature = form_structure->FormSignature(); |
+ form.signature = form_structure->FormSignatureAsStr(); |
for (const AutofillField* field : form_structure->fields_) { |
form.data.fields.push_back(FormFieldData(*field)); |
FormFieldDataPredictions annotated_field; |
- annotated_field.signature = field->FieldSignature(); |
+ annotated_field.signature = field->FieldSignatureAsStr(); |
annotated_field.heuristic_type = |
AutofillType(field->heuristic_type()).ToString(); |
annotated_field.server_type = |
@@ -574,8 +559,8 @@ bool FormStructure::IsAutofillFieldMetadataEnabled() { |
return base::StartsWith(group_name, "Enabled", base::CompareCase::SENSITIVE); |
} |
-std::string FormStructure::FormSignature() const { |
- return base::Uint64ToString(FormSignature64Bit()); |
+std::string FormStructure::FormSignatureAsStr() const { |
+ return base::Uint64ToString(form_signature()); |
} |
bool FormStructure::IsAutofillable() const { |
@@ -642,12 +627,12 @@ void FormStructure::UpdateFromCache(const FormStructure& cached_form) { |
std::map<std::string, const AutofillField*> cached_fields; |
for (size_t i = 0; i < cached_form.field_count(); ++i) { |
const AutofillField* field = cached_form.field(i); |
- cached_fields[field->FieldSignature()] = field; |
+ cached_fields[field->FieldSignatureAsStr()] = field; |
} |
for (AutofillField* field : *this) { |
- std::map<std::string, const AutofillField*>::const_iterator |
- cached_field = cached_fields.find(field->FieldSignature()); |
+ std::map<std::string, const AutofillField*>::const_iterator cached_field = |
+ cached_fields.find(field->FieldSignatureAsStr()); |
if (cached_field != cached_fields.end()) { |
if (field->form_control_type != "select-one" && |
field->value == cached_field->second->value) { |
@@ -678,7 +663,7 @@ void FormStructure::UpdateFromCache(const FormStructure& cached_form) { |
DCHECK_EQ(cached_form.form_name_, form_name_); |
DCHECK_EQ(cached_form.source_url_, source_url_); |
DCHECK_EQ(cached_form.target_url_, target_url_); |
- form_signature_field_names_ = cached_form.form_signature_field_names_; |
+ form_signature_ = cached_form.form_signature_; |
} |
void FormStructure::LogQualityMetrics(const base::TimeTicks& load_time, |
@@ -1128,19 +1113,14 @@ void FormStructure::EncodeFormForQuery( |
AutofillQueryContents::Form* query_form) const { |
DCHECK(!IsMalformed()); |
- query_form->set_signature(FormSignature64Bit()); |
+ query_form->set_signature(form_signature()); |
for (const AutofillField* field : fields_) { |
if (ShouldSkipField(*field)) |
continue; |
AutofillQueryContents::Form::Field* added_field = query_form->add_field(); |
- unsigned sig = 0; |
- // The signature is a required field. If it can't be parsed, the proto would |
- // not serialize. |
- if (!base::StringToUint(field->FieldSignature(), &sig)) |
- continue; |
- added_field->set_signature(sig); |
+ added_field->set_signature(field->FieldSignature()); |
if (IsAutofillFieldMetadataEnabled()) { |
added_field->set_type(field->form_control_type); |
@@ -1176,12 +1156,7 @@ void FormStructure::EncodeFormForUpload(AutofillUploadContents* upload) const { |
field->form_classifier_outcome()); |
} |
- unsigned sig = 0; |
- // The signature is a required field. If it can't be parsed, the proto |
- // would not serialize. |
- if (!base::StringToUint(field->FieldSignature(), &sig)) |
- continue; |
- added_field->set_signature(sig); |
+ added_field->set_signature(field->FieldSignature()); |
if (IsAutofillFieldMetadataEnabled()) { |
added_field->set_type(field->form_control_type); |
@@ -1202,40 +1177,6 @@ void FormStructure::EncodeFormForUpload(AutofillUploadContents* upload) const { |
} |
} |
-uint64_t FormStructure::Hash64Bit(const std::string& str) { |
- std::string hash_bin = base::SHA1HashString(str); |
- DCHECK_EQ(base::kSHA1Length, hash_bin.length()); |
- |
- uint64_t hash64 = (((static_cast<uint64_t>(hash_bin[0])) & 0xFF) << 56) | |
- (((static_cast<uint64_t>(hash_bin[1])) & 0xFF) << 48) | |
- (((static_cast<uint64_t>(hash_bin[2])) & 0xFF) << 40) | |
- (((static_cast<uint64_t>(hash_bin[3])) & 0xFF) << 32) | |
- (((static_cast<uint64_t>(hash_bin[4])) & 0xFF) << 24) | |
- (((static_cast<uint64_t>(hash_bin[5])) & 0xFF) << 16) | |
- (((static_cast<uint64_t>(hash_bin[6])) & 0xFF) << 8) | |
- ((static_cast<uint64_t>(hash_bin[7])) & 0xFF); |
- |
- return hash64; |
-} |
- |
-uint64_t FormStructure::FormSignature64Bit() const { |
- std::string scheme(target_url_.scheme()); |
- std::string host(target_url_.host()); |
- |
- // If target host or scheme is empty, set scheme and host of source url. |
- // This is done to match the Toolbar's behavior. |
- if (scheme.empty() || host.empty()) { |
- scheme = source_url_.scheme(); |
- host = source_url_.host(); |
- } |
- |
- std::string form_string = scheme + "://" + host + "&" + |
- base::UTF16ToUTF8(form_name_) + |
- form_signature_field_names_; |
- |
- return Hash64Bit(form_string); |
-} |
- |
bool FormStructure::IsMalformed() const { |
if (!field_count()) // Nothing to add. |
return true; |