OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/autofill/content/renderer/form_cache.h" | 5 #include "components/autofill/content/renderer/form_cache.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "components/autofill/content/renderer/form_autofill_util.h" | 10 #include "components/autofill/content/renderer/form_autofill_util.h" |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 | 74 |
75 FormCache::~FormCache() { | 75 FormCache::~FormCache() { |
76 } | 76 } |
77 | 77 |
78 std::vector<FormData> FormCache::ExtractNewForms() { | 78 std::vector<FormData> FormCache::ExtractNewForms() { |
79 std::vector<FormData> forms; | 79 std::vector<FormData> forms; |
80 WebDocument document = frame_.document(); | 80 WebDocument document = frame_.document(); |
81 if (document.isNull()) | 81 if (document.isNull()) |
82 return forms; | 82 return forms; |
83 | 83 |
| 84 initial_checked_state_.clear(); |
| 85 initial_select_values_.clear(); |
84 WebVector<WebFormElement> web_forms; | 86 WebVector<WebFormElement> web_forms; |
85 document.forms(web_forms); | 87 document.forms(web_forms); |
86 | 88 |
87 // Log an error message for deprecated attributes, but only the first time | 89 // Log an error message for deprecated attributes, but only the first time |
88 // the form is parsed. | 90 // the form is parsed. |
89 bool log_deprecation_messages = parsed_forms_.empty(); | 91 bool log_deprecation_messages = parsed_forms_.empty(); |
90 | 92 |
91 const ExtractMask extract_mask = | 93 const ExtractMask extract_mask = |
92 static_cast<ExtractMask>(EXTRACT_VALUE | EXTRACT_OPTIONS); | 94 static_cast<ExtractMask>(EXTRACT_VALUE | EXTRACT_OPTIONS); |
93 | 95 |
(...skipping 14 matching lines...) Expand all Loading... |
108 extract_mask, &form, nullptr)) { | 110 extract_mask, &form, nullptr)) { |
109 continue; | 111 continue; |
110 } | 112 } |
111 | 113 |
112 num_fields_seen += form.fields.size(); | 114 num_fields_seen += form.fields.size(); |
113 if (num_fields_seen > kMaxParseableFields) | 115 if (num_fields_seen > kMaxParseableFields) |
114 return forms; | 116 return forms; |
115 | 117 |
116 if (form.fields.size() >= kRequiredAutofillFields && | 118 if (form.fields.size() >= kRequiredAutofillFields && |
117 !ContainsKey(parsed_forms_, form)) { | 119 !ContainsKey(parsed_forms_, form)) { |
| 120 for (auto it = parsed_forms_.begin(); it != parsed_forms_.end(); ++it) { |
| 121 if (it->SameFormAs(form)) { |
| 122 parsed_forms_.erase(it); |
| 123 break; |
| 124 } |
| 125 } |
| 126 |
| 127 SaveInitialValues(control_elements); |
118 forms.push_back(form); | 128 forms.push_back(form); |
119 parsed_forms_.insert(form); | 129 parsed_forms_.insert(form); |
120 } | 130 } |
121 } | 131 } |
122 | 132 |
123 // Look for more parseable fields outside of forms. | 133 // Look for more parseable fields outside of forms. |
124 std::vector<WebElement> fieldsets; | 134 std::vector<WebElement> fieldsets; |
125 std::vector<WebFormControlElement> control_elements = | 135 std::vector<WebFormControlElement> control_elements = |
126 GetUnownedAutofillableFormFieldElements(document.all(), &fieldsets); | 136 GetUnownedAutofillableFormFieldElements(document.all(), &fieldsets); |
127 | 137 |
128 size_t num_editable_elements = | 138 size_t num_editable_elements = |
129 ScanFormControlElements(control_elements, log_deprecation_messages); | 139 ScanFormControlElements(control_elements, log_deprecation_messages); |
130 | 140 |
131 if (ShouldIgnoreForm(num_editable_elements, control_elements.size())) | 141 if (ShouldIgnoreForm(num_editable_elements, control_elements.size())) |
132 return forms; | 142 return forms; |
133 | 143 |
134 FormData synthetic_form; | 144 FormData synthetic_form; |
135 if (!UnownedFormElementsAndFieldSetsToFormData( | 145 if (!UnownedFormElementsAndFieldSetsToFormData( |
136 fieldsets, control_elements, nullptr, document, extract_mask, | 146 fieldsets, control_elements, nullptr, document, extract_mask, |
137 &synthetic_form, nullptr)) { | 147 &synthetic_form, nullptr)) { |
138 return forms; | 148 return forms; |
139 } | 149 } |
140 | 150 |
141 num_fields_seen += synthetic_form.fields.size(); | 151 num_fields_seen += synthetic_form.fields.size(); |
142 if (num_fields_seen > kMaxParseableFields) | 152 if (num_fields_seen > kMaxParseableFields) |
143 return forms; | 153 return forms; |
144 | 154 |
145 if (synthetic_form.fields.size() >= kRequiredAutofillFields && | 155 if (synthetic_form.fields.size() >= kRequiredAutofillFields && |
146 !parsed_forms_.count(synthetic_form)) { | 156 !parsed_forms_.count(synthetic_form)) { |
| 157 SaveInitialValues(control_elements); |
147 forms.push_back(synthetic_form); | 158 forms.push_back(synthetic_form); |
148 parsed_forms_.insert(synthetic_form); | 159 parsed_forms_.insert(synthetic_form); |
| 160 parsed_forms_.erase(synthetic_form_); |
149 synthetic_form_ = synthetic_form; | 161 synthetic_form_ = synthetic_form; |
150 } | 162 } |
151 return forms; | 163 return forms; |
152 } | 164 } |
153 | 165 |
154 void FormCache::Reset() { | 166 void FormCache::Reset() { |
155 synthetic_form_ = FormData(); | 167 synthetic_form_ = FormData(); |
156 parsed_forms_.clear(); | 168 parsed_forms_.clear(); |
157 initial_select_values_.clear(); | 169 initial_select_values_.clear(); |
158 initial_checked_state_.clear(); | 170 initial_checked_state_.clear(); |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 bool log_deprecation_messages) { | 304 bool log_deprecation_messages) { |
293 size_t num_editable_elements = 0; | 305 size_t num_editable_elements = 0; |
294 for (size_t i = 0; i < control_elements.size(); ++i) { | 306 for (size_t i = 0; i < control_elements.size(); ++i) { |
295 const WebFormControlElement& element = control_elements[i]; | 307 const WebFormControlElement& element = control_elements[i]; |
296 | 308 |
297 if (log_deprecation_messages) | 309 if (log_deprecation_messages) |
298 LogDeprecationMessages(element); | 310 LogDeprecationMessages(element); |
299 | 311 |
300 // Save original values of <select> elements so we can restore them | 312 // Save original values of <select> elements so we can restore them |
301 // when |ClearFormWithNode()| is invoked. | 313 // when |ClearFormWithNode()| is invoked. |
| 314 if (IsSelectElement(element) || IsTextAreaElement(element)) { |
| 315 ++num_editable_elements; |
| 316 } else { |
| 317 const WebInputElement input_element = element.toConst<WebInputElement>(); |
| 318 if (!IsCheckableElement(&input_element)) |
| 319 ++num_editable_elements; |
| 320 } |
| 321 } |
| 322 return num_editable_elements; |
| 323 } |
| 324 |
| 325 void FormCache::SaveInitialValues( |
| 326 const std::vector<WebFormControlElement>& control_elements) { |
| 327 for (const WebFormControlElement& element : control_elements) { |
302 if (IsSelectElement(element)) { | 328 if (IsSelectElement(element)) { |
303 const WebSelectElement select_element = | 329 const WebSelectElement select_element = |
304 element.toConst<WebSelectElement>(); | 330 element.toConst<WebSelectElement>(); |
305 initial_select_values_.insert( | 331 initial_select_values_.insert( |
306 std::make_pair(select_element, select_element.value())); | 332 std::make_pair(select_element, select_element.value())); |
307 ++num_editable_elements; | |
308 } else if (IsTextAreaElement(element)) { | |
309 ++num_editable_elements; | |
310 } else { | 333 } else { |
311 const WebInputElement input_element = | 334 const WebInputElement* input_element = toWebInputElement(&element); |
312 element.toConst<WebInputElement>(); | 335 if (IsCheckableElement(input_element)) { |
313 if (IsCheckableElement(&input_element)) { | |
314 initial_checked_state_.insert( | 336 initial_checked_state_.insert( |
315 std::make_pair(input_element, input_element.isChecked())); | 337 std::make_pair(*input_element, input_element->isChecked())); |
316 } else { | |
317 ++num_editable_elements; | |
318 } | 338 } |
319 } | 339 } |
320 } | 340 } |
321 return num_editable_elements; | |
322 } | 341 } |
323 | 342 |
324 } // namespace autofill | 343 } // namespace autofill |
OLD | NEW |