| 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 bc5519b2fd71e67b836150a0b0893629174ca1db..8e3fc33a9acce657c46ebbaf2b2a7a0222a82bca 100644
|
| --- a/components/autofill/content/renderer/form_cache.cc
|
| +++ b/components/autofill/content/renderer/form_cache.cc
|
| @@ -20,7 +20,6 @@
|
| #include "third_party/WebKit/public/web/WebFormElement.h"
|
| #include "third_party/WebKit/public/web/WebInputElement.h"
|
| #include "third_party/WebKit/public/web/WebLocalFrame.h"
|
| -#include "third_party/WebKit/public/web/WebNodeList.h"
|
| #include "third_party/WebKit/public/web/WebSelectElement.h"
|
| #include "third_party/WebKit/public/web/WebTextAreaElement.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
| @@ -69,11 +68,22 @@
|
| FormCache::~FormCache() {
|
| }
|
|
|
| -void FormCache::ExtractNewForms(const WebFrame& frame,
|
| - std::vector<FormData>* forms) {
|
| +void FormCache::ExtractForms(const WebFrame& frame,
|
| + std::vector<FormData>* forms) {
|
| + ExtractFormsAndFormElements(frame, kRequiredAutofillFields, forms, NULL);
|
| +}
|
| +
|
| +bool FormCache::ExtractFormsAndFormElements(
|
| + const WebFrame& frame,
|
| + size_t minimum_required_fields,
|
| + std::vector<FormData>* forms,
|
| + std::vector<WebFormElement>* web_form_elements) {
|
| + // Reset the cache for this frame.
|
| + ResetFrame(frame);
|
| +
|
| WebDocument document = frame.document();
|
| if (document.isNull())
|
| - return;
|
| + return false;
|
|
|
| web_documents_.insert(document);
|
|
|
| @@ -81,6 +91,7 @@
|
| document.forms(web_forms);
|
|
|
| size_t num_fields_seen = 0;
|
| + bool has_skipped_forms = false;
|
| for (size_t i = 0; i < web_forms.size(); ++i) {
|
| WebFormElement form_element = web_forms[i];
|
|
|
| @@ -117,8 +128,9 @@
|
| // To avoid overly expensive computation, we impose a minimum number of
|
| // allowable fields. The corresponding maximum number of allowable fields
|
| // is imposed by WebFormElementToFormData().
|
| - if (num_editable_elements < kRequiredAutofillFields &&
|
| + if (num_editable_elements < minimum_required_fields &&
|
| control_elements.size() > 0) {
|
| + has_skipped_forms = true;
|
| continue;
|
| }
|
|
|
| @@ -135,12 +147,17 @@
|
| if (num_fields_seen > kMaxParseableFields)
|
| break;
|
|
|
| - if (form.fields.size() >= kRequiredAutofillFields &&
|
| - !parsed_forms_[&frame].count(form)) {
|
| + if (form.fields.size() >= minimum_required_fields) {
|
| forms->push_back(form);
|
| - parsed_forms_[&frame].insert(form);
|
| - }
|
| - }
|
| + if (web_form_elements)
|
| + web_form_elements->push_back(form_element);
|
| + } else {
|
| + has_skipped_forms = true;
|
| + }
|
| + }
|
| +
|
| + // Return true if there are any WebFormElements skipped, else false.
|
| + return has_skipped_forms;
|
| }
|
|
|
| void FormCache::ResetFrame(const WebFrame& frame) {
|
| @@ -158,7 +175,6 @@
|
| web_documents_.erase(*it);
|
| }
|
|
|
| - parsed_forms_[&frame].clear();
|
| RemoveOldElements(frame, &initial_select_values_);
|
| RemoveOldElements(frame, &initial_checked_state_);
|
| }
|
|
|