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 3f27c39b89cd19dd98c3f66bd1197072227e55cf..9bc97e2f5505c598566d3a66b4995d9839aa2dd4 100644 |
--- a/components/autofill/content/renderer/form_cache.cc |
+++ b/components/autofill/content/renderer/form_cache.cc |
@@ -119,10 +119,41 @@ |
parsed_forms_.insert(form); |
} |
} |
+ |
+ // Look for more parseable fields outside of forms. |
+ std::vector<WebElement> fieldsets; |
+ std::vector<WebFormControlElement> control_elements = |
+ GetUnownedAutofillableFormFieldElements(document.all(), &fieldsets); |
+ |
+ size_t num_editable_elements = |
+ ScanFormControlElements(control_elements, log_deprecation_messages); |
+ |
+ if (ShouldIgnoreForm(num_editable_elements, control_elements.size())) |
+ return forms; |
+ |
+ FormData synthetic_form; |
+ if (!UnownedFormElementsAndFieldSetsToFormData(fieldsets, control_elements, |
+ nullptr, document.url(), |
+ REQUIRE_NONE, extract_mask, |
+ &synthetic_form, nullptr)) { |
+ return forms; |
+ } |
+ |
+ num_fields_seen += synthetic_form.fields.size(); |
+ if (num_fields_seen > kMaxParseableFields) |
+ return forms; |
+ |
+ if (synthetic_form.fields.size() >= kRequiredAutofillFields && |
+ !parsed_forms_.count(synthetic_form)) { |
+ forms.push_back(synthetic_form); |
+ parsed_forms_.insert(synthetic_form); |
+ synthetic_form_ = synthetic_form; |
+ } |
return forms; |
} |
void FormCache::Reset() { |
+ synthetic_form_ = FormData(); |
parsed_forms_.clear(); |
initial_select_values_.clear(); |
initial_checked_state_.clear(); |
@@ -191,7 +222,15 @@ |
std::vector<WebFormControlElement> control_elements; |
+ // First check the synthetic form. |
bool found_synthetic_form = false; |
+ if (form.data.SameFormAs(synthetic_form_)) { |
+ found_synthetic_form = true; |
+ WebDocument document = frame_.document(); |
+ control_elements = |
+ GetUnownedAutofillableFormFieldElements(document.all(), nullptr); |
+ } |
+ |
if (!found_synthetic_form) { |
// Find the real form by searching through the WebDocuments. |
bool found_form = false; |