Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Unified Diff: components/autofill/content/renderer/form_cache.cc

Issue 1161793006: [Autofill] Don't hold onto stale form field pointers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: thestig review Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/autofill/content/renderer/form_cache.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « components/autofill/content/renderer/form_cache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698