Chromium Code Reviews| Index: components/autofill/content/renderer/form_cache.cc |
| diff --git a/components/autofill/content/renderer/form_cache.cc b/components/autofill/content/renderer/form_cache.cc |
| index 81ddf83574d53c6727ecbf50714fb6ef93bf38c9..184a4afa607868a8d6ddcfa80671faf9482f496a 100644 |
| --- a/components/autofill/content/renderer/form_cache.cc |
| +++ b/components/autofill/content/renderer/form_cache.cc |
| @@ -59,13 +59,23 @@ void LogDeprecationMessages(const WebFormControlElement& element) { |
| } |
| } |
| -// To avoid overly expensive computation, we impose a minimum number of |
| -// allowable fields. The corresponding maximum number of allowable fields |
| -// is imposed by WebFormElementToFormData(). |
| -bool ShouldIgnoreForm(size_t num_editable_elements, |
| - size_t num_control_elements) { |
| - return (num_editable_elements < kRequiredAutofillFields && |
| - num_control_elements > 0); |
| +// Determines whether the form is interesting enough to send to the browser |
| +// for further operations. |
| +bool IsFormInteresting(FormData form) { |
|
Mathieu
2015/11/17 15:45:06
const FormData& ?
sebsg
2015/11/18 16:40:27
Done.
|
| + if (form.fields.empty()) |
| + return false; |
| + |
| + // If the form has at least one field with an autocomplete attribute, it is a |
| + // candidate for autofill. |
| + for (auto field : form.fields) { |
|
Mathieu
2015/11/17 18:27:11
const auto& field ?
Evan Stade
2015/11/17 19:13:36
please don't use auto for simple types like this,
sebsg
2015/11/18 16:40:27
Acknowledged.
sebsg
2015/11/18 16:40:27
Done.
|
| + if (!field.autocomplete_attribute.empty()) |
| + return true; |
| + } |
| + |
| + // If there are no autocomplete attributes, the form needs to have at least |
| + // the required number of fields for the prediction routines to be a |
| + // candidate for autofill. |
| + return form.fields.size() >= kRequiredFieldsForPredictionRoutines; |
| } |
| } // namespace |
| @@ -104,7 +114,7 @@ std::vector<FormData> FormCache::ExtractNewForms() { |
| size_t num_editable_elements = |
| ScanFormControlElements(control_elements, log_deprecation_messages); |
| - if (ShouldIgnoreForm(num_editable_elements, control_elements.size())) |
| + if (num_editable_elements == 0) |
| continue; |
| FormData form; |
| @@ -117,8 +127,7 @@ std::vector<FormData> FormCache::ExtractNewForms() { |
| if (num_fields_seen > form_util::kMaxParseableFields) |
| return forms; |
| - if (form.fields.size() >= kRequiredAutofillFields && |
| - !ContainsKey(parsed_forms_, form)) { |
| + if (!ContainsKey(parsed_forms_, form) && IsFormInteresting(form)) { |
| for (auto it = parsed_forms_.begin(); it != parsed_forms_.end(); ++it) { |
| if (it->SameFormAs(form)) { |
| parsed_forms_.erase(it); |
| @@ -141,7 +150,7 @@ std::vector<FormData> FormCache::ExtractNewForms() { |
| size_t num_editable_elements = |
| ScanFormControlElements(control_elements, log_deprecation_messages); |
| - if (ShouldIgnoreForm(num_editable_elements, control_elements.size())) |
| + if (num_editable_elements == 0) |
| return forms; |
| FormData synthetic_form; |
| @@ -155,8 +164,8 @@ std::vector<FormData> FormCache::ExtractNewForms() { |
| if (num_fields_seen > form_util::kMaxParseableFields) |
| return forms; |
| - if (synthetic_form.fields.size() >= kRequiredAutofillFields && |
| - !parsed_forms_.count(synthetic_form)) { |
| + if (!parsed_forms_.count(synthetic_form) && |
| + IsFormInteresting(synthetic_form)) { |
| SaveInitialValues(control_elements); |
| forms.push_back(synthetic_form); |
| parsed_forms_.insert(synthetic_form); |