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

Unified Diff: chrome/renderer/autofill/form_cache.cc

Issue 11415221: Add support for autofilling radio buttons and checkboxes. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Fixed review comments Created 8 years 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
Index: chrome/renderer/autofill/form_cache.cc
diff --git a/chrome/renderer/autofill/form_cache.cc b/chrome/renderer/autofill/form_cache.cc
index f7bec0342a014e362d700f47fe520ddbeb65cdab..21c316018d412fa9946e5636d14f09a64fcbce95 100644
--- a/chrome/renderer/autofill/form_cache.cc
+++ b/chrome/renderer/autofill/form_cache.cc
@@ -43,6 +43,29 @@ const size_t kRequiredAutofillFields = 3;
namespace autofill {
+// K should inherit from WebFormControlElement as the function looks to extract
+// WebFormElement for K.form().
Ilya Sherman 2012/12/11 05:56:19 nit: Prior to describing this implementation detai
Raman Kakilate 2012/12/11 17:45:45 Done.
+template <class K, class V>
+void RemoveOldElements(std::map<const K, V> states, const WebFrame& frame) {
Ilya Sherman 2012/12/11 05:56:19 The |states| map is meant to be updated, so it sho
Ilya Sherman 2012/12/11 05:56:19 nit: It doesn't seem necessary to include the "con
Raman Kakilate 2012/12/11 17:45:45 code doesn't compile. Leaving it as it.
Raman Kakilate 2012/12/11 17:45:45 Done.
+ std::vector<K> to_remove;
+ for (typename std::map<const K, V>::const_iterator it = states.begin();
+ it != states.end(); ++it) {
+ WebFormElement form_element = it->first.form();
+ if (form_element.isNull()) {
+ to_remove.push_back(it->first);
+ } else {
+ const WebFrame* element_frame = form_element.document().frame();
+ if (!element_frame || element_frame == &frame)
+ to_remove.push_back(it->first);
+ }
+ }
+
+ for (typename std::vector<K>::const_iterator it = to_remove.begin();
+ it != to_remove.end(); ++it) {
+ states.erase(*it);
+ }
+}
+
FormCache::FormCache() {
}
@@ -80,6 +103,13 @@ void FormCache::ExtractForms(const WebFrame& frame,
element.toConst<WebSelectElement>();
initial_select_values_.insert(std::make_pair(select_element,
select_element.value()));
+ } else {
+ const WebInputElement input_element =
+ element.toConst<WebInputElement>();
+ if (IsRadioButtonElement(&input_element) ||
+ IsCheckboxElement(&input_element))
+ initial_checked_state_.insert(
+ std::make_pair(input_element, input_element.isChecked()));
}
}
@@ -119,25 +149,8 @@ void FormCache::ResetFrame(const WebFrame& frame) {
web_documents_.erase(*it);
}
- std::vector<WebSelectElement> select_values_to_delete;
- for (std::map<const WebSelectElement, string16>::const_iterator it =
- initial_select_values_.begin();
- it != initial_select_values_.end(); ++it) {
- WebFormElement form_element = it->first.form();
- if (form_element.isNull()) {
- select_values_to_delete.push_back(it->first);
- } else {
- const WebFrame* element_frame = form_element.document().frame();
- if (!element_frame || element_frame == &frame)
- select_values_to_delete.push_back(it->first);
- }
- }
-
- for (std::vector<WebSelectElement>::const_iterator it =
- select_values_to_delete.begin();
- it != select_values_to_delete.end(); ++it) {
- initial_select_values_.erase(*it);
- }
+ RemoveOldElements(initial_select_values_, frame);
+ RemoveOldElements(initial_checked_state_, frame);
}
bool FormCache::ClearFormWithElement(const WebInputElement& element) {
@@ -165,8 +178,7 @@ bool FormCache::ClearFormWithElement(const WebInputElement& element) {
int length = input_element->value().length();
input_element->setSelectionRange(length, length);
}
- } else {
- DCHECK(IsSelectElement(control_element));
+ } else if (IsSelectElement(control_element)) {
WebSelectElement select_element = control_element.to<WebSelectElement>();
std::map<const WebSelectElement, string16>::const_iterator
@@ -176,6 +188,16 @@ bool FormCache::ClearFormWithElement(const WebInputElement& element) {
select_element.setValue(initial_value_iter->second);
select_element.dispatchFormControlChangeEvent();
}
+ } else {
+ WebInputElement input_element = control_element.to<WebInputElement>();
+ DCHECK(IsRadioButtonElement(&input_element) ||
+ IsCheckboxElement(&input_element));
+ std::map<const WebInputElement, bool>::const_iterator it =
+ initial_checked_state_.find(input_element);
+ if (it != initial_checked_state_.end() &&
+ input_element.isChecked() != it->second) {
+ input_element.setChecked(it->second, true);
+ }
}
}
« chrome/renderer/autofill/form_cache.h ('K') | « chrome/renderer/autofill/form_cache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698