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

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

Issue 11415221: Add support for autofilling radio buttons and checkboxes. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: addressed review comments Created 8 years, 1 month 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_autofill_util.cc
diff --git a/chrome/renderer/autofill/form_autofill_util.cc b/chrome/renderer/autofill/form_autofill_util.cc
index 3da2f9869cd77763a64524f4d7aa7753684c9432..a7b698a0b29ed1705a046a07d6457a664e6429e8 100644
--- a/chrome/renderer/autofill/form_autofill_util.cc
+++ b/chrome/renderer/autofill/form_autofill_util.cc
@@ -42,8 +42,11 @@ using WebKit::WebVector;
namespace {
using autofill::ExtractAutofillableElements;
-using autofill::IsTextInput;
+using autofill::IsAutofillableInputElement;
+using autofill::IsCheckboxElement;
+using autofill::IsRadioButtonElement;
using autofill::IsSelectElement;
+using autofill::IsTextInput;
// The maximum length allowed for form data.
const size_t kMaxDataLength = 1024;
@@ -66,7 +69,7 @@ bool HasTagName(const WebNode& node, const WebKit::WebString& tag) {
bool IsAutofillableElement(const WebFormControlElement& element) {
const WebInputElement* input_element = toWebInputElement(&element);
- return IsTextInput(input_element) || IsSelectElement(element);
+ return IsAutofillableInputElement(input_element) || IsSelectElement(element);
}
// Appends |suffix| to |prefix| so that any intermediary whitespace is collapsed
@@ -458,10 +461,11 @@ void ForEachMatchingFormField(const WebFormElement& form_element,
bool is_initiating_element = (*element == initiating_element);
const WebInputElement* input_element = toWebInputElement(element);
- if (IsTextInput(input_element)) {
+ if (IsAutofillableInputElement(input_element)) {
// Only autofill empty fields and the field that initiated the filling,
// i.e. the field the user is currently editing and interacting with.
- if (!is_initiating_element && !input_element->value().isEmpty())
+ if (!is_initiating_element && IsTextInput(input_element) &&
+ !input_element->value().isEmpty())
Ilya Sherman 2012/12/01 00:54:12 nit: Let's just move this if-stmt to replace the o
Raman Kakilate 2012/12/06 01:54:05 Done.
continue;
}
@@ -495,13 +499,16 @@ void FillFormField(WebKit::WebFormControlElement* field,
// Clear the current IME composition (the underline), if there is one.
input_element->document().frame()->unmarkText();
}
- } else {
- DCHECK(IsSelectElement(*field));
+ } else if (IsSelectElement(*field)) {
WebSelectElement select_element = field->to<WebSelectElement>();
if (select_element.value() != data->value) {
select_element.setValue(data->value);
select_element.dispatchFormControlChangeEvent();
}
+ } else {
+ DCHECK(IsRadioButtonElement(input_element) ||
+ IsCheckboxElement(input_element));
+ input_element->setChecked(data->is_checked, true);
}
}
@@ -516,6 +523,8 @@ void PreviewFormField(WebKit::WebFormControlElement* field,
// Only preview input fields.
WebInputElement* input_element = toWebInputElement(field);
+ // Don't preview checkboxes and radio buttons, as there is no provision for
+ // setSuggestedCheckedValue in WebInputElement.
Ilya Sherman 2012/12/01 00:54:12 nit: Please combine this comment with the one on l
Raman Kakilate 2012/12/06 01:54:05 Done.
if (!IsTextInput(input_element))
return;
@@ -550,6 +559,25 @@ bool IsSelectElement(const WebFormControlElement& element) {
return element.formControlType() == ASCIIToUTF16("select-one");
}
+bool IsCheckboxElement(const WebInputElement* element) {
+ if (!element)
+ return false;
+
+ return element->formControlType() == ASCIIToUTF16("checkbox");
+}
+
+bool IsRadioButtonElement(const WebInputElement* element) {
+ if (!element)
+ return false;
+
+ return element->formControlType() == ASCIIToUTF16("radio");
+}
+
+bool IsAutofillableInputElement(const WebInputElement* element) {
+ return IsTextInput(element) || IsCheckboxElement(element) ||
+ IsRadioButtonElement(element);
+}
+
const string16 GetFormIdentifier(const WebFormElement& form) {
string16 identifier = form.name();
if (identifier.empty())
@@ -577,7 +605,8 @@ void ExtractAutofillableElements(
// TODO(jhawkins): WebKit currently doesn't handle the autocomplete
// attribute for select control elements, but it probably should.
WebInputElement* input_element = toWebInputElement(&control_elements[i]);
- if (IsTextInput(input_element) && !input_element->autoComplete())
+ if (IsAutofillableInputElement(input_element) &&
+ !input_element->autoComplete())
continue;
}
@@ -609,11 +638,15 @@ void WebFormControlElementToFormField(const WebFormControlElement& element,
return;
const WebInputElement* input_element = toWebInputElement(&element);
- if (IsTextInput(input_element)) {
+ if (IsAutofillableInputElement(input_element)) {
field->max_length = input_element->maxLength();
field->is_autofilled = input_element->isAutofilled();
field->is_focusable = input_element->isFocusable();
field->should_autocomplete = input_element->autoComplete();
+ if (IsRadioButtonElement(input_element) ||
+ IsCheckboxElement(input_element)) {
+ field->is_checkable = true;
+ }
} else if (extract_mask & EXTRACT_OPTIONS) {
// Set option strings on the field if available.
DCHECK(IsSelectElement(element));
@@ -627,7 +660,7 @@ void WebFormControlElementToFormField(const WebFormControlElement& element,
return;
string16 value;
- if (IsTextInput(input_element)) {
+ if (IsAutofillableInputElement(input_element)) {
value = input_element->value();
} else {
DCHECK(IsSelectElement(element));
@@ -704,7 +737,8 @@ bool WebFormElementToFormData(
continue;
const WebInputElement* input_element = toWebInputElement(&control_element);
- if (requirements & REQUIRE_AUTOCOMPLETE && IsTextInput(input_element) &&
+ if (requirements & REQUIRE_AUTOCOMPLETE &&
+ IsAutofillableInputElement(input_element) &&
!input_element->autoComplete())
continue;
@@ -846,7 +880,7 @@ bool ClearPreviewedFormWithElement(const WebInputElement& element,
for (size_t i = 0; i < control_elements.size(); ++i) {
// Only text input elements can be previewed.
WebInputElement* input_element = toWebInputElement(&control_elements[i]);
- if (!IsTextInput(input_element))
+ if (!IsAutofillableInputElement(input_element))
Ilya Sherman 2012/12/01 00:54:12 Given the comment on line 881, I would expect this
Raman Kakilate 2012/12/06 01:54:05 Done.
continue;
// If the input element is not auto-filled, we did not preview it, so there
@@ -892,7 +926,7 @@ bool FormWithElementIsAutofilled(const WebInputElement& element) {
&control_elements);
for (size_t i = 0; i < control_elements.size(); ++i) {
WebInputElement* input_element = toWebInputElement(&control_elements[i]);
- if (!IsTextInput(input_element))
+ if (!IsAutofillableInputElement(input_element))
continue;
if (input_element->isAutofilled())

Powered by Google App Engine
This is Rietveld 408576698