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 c1a41a8cd82c0e9fdb59eb53f3c6ff0a8c88f9e1..a79957b06b65b169f5d09547399773ebff8b2128 100644 |
--- a/components/autofill/content/renderer/form_cache.cc |
+++ b/components/autofill/content/renderer/form_cache.cc |
@@ -81,6 +81,8 @@ std::vector<FormData> FormCache::ExtractNewForms() { |
if (document.isNull()) |
return forms; |
+ initial_checked_state_.clear(); |
+ initial_select_values_.clear(); |
WebVector<WebFormElement> web_forms; |
document.forms(web_forms); |
@@ -115,6 +117,14 @@ std::vector<FormData> FormCache::ExtractNewForms() { |
if (form.fields.size() >= kRequiredAutofillFields && |
!ContainsKey(parsed_forms_, form)) { |
+ for (auto it = parsed_forms_.begin(); it != parsed_forms_.end(); ++it) { |
+ if (it->SameFormAs(form)) { |
+ parsed_forms_.erase(it); |
+ break; |
+ } |
+ } |
+ |
+ SaveInitialValues(control_elements); |
forms.push_back(form); |
parsed_forms_.insert(form); |
} |
@@ -144,8 +154,10 @@ std::vector<FormData> FormCache::ExtractNewForms() { |
if (synthetic_form.fields.size() >= kRequiredAutofillFields && |
!parsed_forms_.count(synthetic_form)) { |
+ SaveInitialValues(control_elements); |
forms.push_back(synthetic_form); |
parsed_forms_.insert(synthetic_form); |
+ parsed_forms_.erase(synthetic_form_); |
synthetic_form_ = synthetic_form; |
} |
return forms; |
@@ -299,26 +311,33 @@ size_t FormCache::ScanFormControlElements( |
// Save original values of <select> elements so we can restore them |
// when |ClearFormWithNode()| is invoked. |
+ if (IsSelectElement(element) || IsTextAreaElement(element)) { |
+ ++num_editable_elements; |
+ } else { |
+ const WebInputElement input_element = element.toConst<WebInputElement>(); |
+ if (!IsCheckableElement(&input_element)) |
+ ++num_editable_elements; |
+ } |
+ } |
+ return num_editable_elements; |
+} |
+ |
+void FormCache::SaveInitialValues( |
+ const std::vector<WebFormControlElement>& control_elements) { |
+ for (const WebFormControlElement& element : control_elements) { |
if (IsSelectElement(element)) { |
const WebSelectElement select_element = |
element.toConst<WebSelectElement>(); |
initial_select_values_.insert( |
std::make_pair(select_element, select_element.value())); |
- ++num_editable_elements; |
- } else if (IsTextAreaElement(element)) { |
- ++num_editable_elements; |
} else { |
- const WebInputElement input_element = |
- element.toConst<WebInputElement>(); |
- if (IsCheckableElement(&input_element)) { |
+ const WebInputElement* input_element = toWebInputElement(&element); |
+ if (IsCheckableElement(input_element)) { |
initial_checked_state_.insert( |
- std::make_pair(input_element, input_element.isChecked())); |
- } else { |
- ++num_editable_elements; |
+ std::make_pair(*input_element, input_element->isChecked())); |
} |
} |
} |
- return num_editable_elements; |
} |
} // namespace autofill |