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_); |
} |