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 8e3fc33a9acce657c46ebbaf2b2a7a0222a82bca..bc5519b2fd71e67b836150a0b0893629174ca1db 100644 |
--- a/components/autofill/content/renderer/form_cache.cc |
+++ b/components/autofill/content/renderer/form_cache.cc |
@@ -20,6 +20,7 @@ |
#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" |
@@ -68,22 +69,11 @@ FormCache::FormCache() { |
FormCache::~FormCache() { |
} |
-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); |
- |
+void FormCache::ExtractNewForms(const WebFrame& frame, |
+ std::vector<FormData>* forms) { |
WebDocument document = frame.document(); |
if (document.isNull()) |
- return false; |
+ return; |
web_documents_.insert(document); |
@@ -91,7 +81,6 @@ bool FormCache::ExtractFormsAndFormElements( |
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]; |
@@ -128,9 +117,8 @@ bool FormCache::ExtractFormsAndFormElements( |
// 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 < minimum_required_fields && |
+ if (num_editable_elements < kRequiredAutofillFields && |
control_elements.size() > 0) { |
- has_skipped_forms = true; |
continue; |
} |
@@ -147,17 +135,12 @@ bool FormCache::ExtractFormsAndFormElements( |
if (num_fields_seen > kMaxParseableFields) |
break; |
- if (form.fields.size() >= minimum_required_fields) { |
+ if (form.fields.size() >= kRequiredAutofillFields && |
+ !parsed_forms_[&frame].count(form)) { |
forms->push_back(form); |
- if (web_form_elements) |
- web_form_elements->push_back(form_element); |
- } else { |
- has_skipped_forms = true; |
+ parsed_forms_[&frame].insert(form); |
} |
} |
- |
- // Return true if there are any WebFormElements skipped, else false. |
- return has_skipped_forms; |
} |
void FormCache::ResetFrame(const WebFrame& frame) { |
@@ -175,6 +158,7 @@ void FormCache::ResetFrame(const WebFrame& frame) { |
web_documents_.erase(*it); |
} |
+ parsed_forms_[&frame].clear(); |
RemoveOldElements(frame, &initial_select_values_); |
RemoveOldElements(frame, &initial_checked_state_); |
} |