| Index: chrome/browser/autofill/autofill_manager.cc
|
| diff --git a/chrome/browser/autofill/autofill_manager.cc b/chrome/browser/autofill/autofill_manager.cc
|
| index b7016a88b452c1a005705e2e86e466ac3c5fd761..b613feabdf5a171ce0ab9121a43cd1158378ea53 100644
|
| --- a/chrome/browser/autofill/autofill_manager.cc
|
| +++ b/chrome/browser/autofill/autofill_manager.cc
|
| @@ -498,14 +498,20 @@ void AutoFillManager::DeterminePossibleFieldTypesForUpload(
|
| void AutoFillManager::LogMetricsAboutSubmittedForm(
|
| const FormData& form,
|
| const FormStructure* submitted_form) {
|
| - FormStructure* cached_submitted_form = NULL;
|
| - AutoFillField* ignored;
|
| - if (!FindCachedFormAndField(form, form.fields.front(),
|
| - &cached_submitted_form, &ignored)) {
|
| - cached_submitted_form = NULL;
|
| + FormStructure* cached_submitted_form;
|
| + if (!FindCachedForm(form, &cached_submitted_form)) {
|
| + NOTREACHED();
|
| + return;
|
| }
|
|
|
| - for (size_t i = 0; i < submitted_form->field_count(); i++) {
|
| + // Map from field signatures to cached fields.
|
| + std::map<std::string, const AutoFillField*> cached_fields;
|
| + for (size_t i = 0; i < cached_submitted_form->field_count(); ++i) {
|
| + const AutoFillField* field = cached_submitted_form->field(i);
|
| + cached_fields[field->FieldSignature()] = field;
|
| + }
|
| +
|
| + for (size_t i = 0; i < submitted_form->field_count(); ++i) {
|
| const AutoFillField* field = submitted_form->field(i);
|
| FieldTypeSet field_types;
|
| personal_data_->GetPossibleFieldTypes(field->value(), &field_types);
|
| @@ -527,9 +533,15 @@ void AutoFillManager::LogMetricsAboutSubmittedForm(
|
| } else {
|
| metric_logger_->Log(AutoFillMetrics::FIELD_AUTOFILL_FAILED);
|
|
|
| - AutoFillFieldType heuristic_type = cached_submitted_form?
|
| - cached_submitted_form->field(i)->heuristic_type() :
|
| - UNKNOWN_TYPE;
|
| + AutoFillFieldType heuristic_type = UNKNOWN_TYPE;
|
| + AutoFillFieldType server_type = NO_SERVER_DATA;
|
| + std::map<std::string, const AutoFillField*>::const_iterator
|
| + cached_field = cached_fields.find(field->FieldSignature());
|
| + if (cached_field != cached_fields.end()) {
|
| + heuristic_type = cached_field->second->heuristic_type();
|
| + server_type = cached_field->second->server_type();
|
| + }
|
| +
|
| if (heuristic_type == UNKNOWN_TYPE)
|
| metric_logger_->Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_UNKNOWN);
|
| else if (field_types.count(heuristic_type))
|
| @@ -537,9 +549,6 @@ void AutoFillManager::LogMetricsAboutSubmittedForm(
|
| else
|
| metric_logger_->Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_MISMATCH);
|
|
|
| - AutoFillFieldType server_type = cached_submitted_form?
|
| - cached_submitted_form->field(i)->server_type() :
|
| - NO_SERVER_DATA;
|
| if (server_type == NO_SERVER_DATA)
|
| metric_logger_->Log(AutoFillMetrics::FIELD_SERVER_TYPE_UNKNOWN);
|
| else if (field_types.count(server_type))
|
| @@ -650,14 +659,12 @@ bool AutoFillManager::GetHost(const std::vector<AutoFillProfile*>& profiles,
|
| return true;
|
| }
|
|
|
| -bool AutoFillManager::FindCachedFormAndField(const FormData& form,
|
| - const FormField& field,
|
| - FormStructure** form_structure,
|
| - AutoFillField** autofill_field) {
|
| +bool AutoFillManager::FindCachedForm(const FormData& form,
|
| + FormStructure** form_structure) {
|
| // Find the FormStructure that corresponds to |form|.
|
| *form_structure = NULL;
|
| for (std::vector<FormStructure*>::const_iterator iter =
|
| - form_structures_.begin();
|
| + form_structures_.begin();
|
| iter != form_structures_.end(); ++iter) {
|
| if (**iter == form) {
|
| *form_structure = *iter;
|
| @@ -668,6 +675,17 @@ bool AutoFillManager::FindCachedFormAndField(const FormData& form,
|
| if (!(*form_structure))
|
| return false;
|
|
|
| + return true;
|
| +}
|
| +
|
| +bool AutoFillManager::FindCachedFormAndField(const FormData& form,
|
| + const FormField& field,
|
| + FormStructure** form_structure,
|
| + AutoFillField** autofill_field) {
|
| + // Find the FormStructure that corresponds to |form|.
|
| + if (!FindCachedForm(form, form_structure))
|
| + return false;
|
| +
|
| // No data to return if there are no auto-fillable fields.
|
| if (!(*form_structure)->autofill_count())
|
| return false;
|
|
|