Index: chrome/renderer/form_manager.cc |
diff --git a/chrome/renderer/form_manager.cc b/chrome/renderer/form_manager.cc |
index 9f2b7856d74ce0c794068d392ef1e56082dd0c47..6cc4e176e92c2b8628fad5b3c04a22fb5329f3b7 100644 |
--- a/chrome/renderer/form_manager.cc |
+++ b/chrome/renderer/form_manager.cc |
@@ -316,7 +316,7 @@ bool FormManager::WebFormElementToFormData(const WebFormElement& element, |
continue; |
} |
- if (requirements & REQUIRE_ELEMENTS_ENABLED && !control_element.isEnabled()) |
+ if (requirements & REQUIRE_ENABLED && !control_element.isEnabled()) |
continue; |
// Create a new FormField, fill it out and map it to the field's name. |
@@ -519,14 +519,56 @@ bool FormManager::FillForm(const FormData& form) { |
if (!FindCachedFormElement(form, &form_element)) |
return false; |
- ForEachMatchingFormField( |
- form_element, form, NewCallback(this, &FormManager::FillFormField)); |
+ RequirementsMask requirements = static_cast<RequirementsMask>( |
+ REQUIRE_AUTOCOMPLETE | REQUIRE_ENABLED | REQUIRE_EMPTY); |
+ ForEachMatchingFormField(form_element, |
+ requirements, |
+ form, |
+ NewCallback(this, &FormManager::FillFormField)); |
return true; |
} |
-void FormManager::FillForms(const std::vector<webkit_glue::FormData>& forms) { |
- for (std::vector<webkit_glue::FormData>::const_iterator iter = forms.begin(); |
+bool FormManager::PreviewForm(const FormData& form) { |
+ FormElement* form_element = NULL; |
+ if (!FindCachedFormElement(form, &form_element)) |
+ return false; |
+ |
+ RequirementsMask requirements = static_cast<RequirementsMask>( |
+ REQUIRE_AUTOCOMPLETE | REQUIRE_ENABLED | REQUIRE_EMPTY); |
+ ForEachMatchingFormField(form_element, |
+ requirements, |
+ form, |
+ NewCallback(this, &FormManager::PreviewFormField)); |
+ |
+ return true; |
+} |
+ |
+void FormManager::ClearPreviewedForm(const FormData& form) { |
+ FormElement* form_element = NULL; |
+ if (!FindCachedFormElement(form, &form_element)) |
+ return; |
+ |
+ for (size_t i = 0; i < form_element->control_elements.size(); ++i) { |
+ WebFormControlElement* element = &form_element->control_elements[i]; |
+ |
+ // Only input elements can be previewed. |
+ if (element->formControlType() != WebString::fromUTF8("text")) |
+ continue; |
+ |
+ // If the input element has not been auto-filled, FormManager has not |
+ // previewed this field, so we have nothing to reset. |
+ WebInputElement input_element = element->to<WebInputElement>(); |
+ if (!input_element.isAutofilled()) |
+ continue; |
+ |
+ input_element.setPlaceholder(string16()); |
+ input_element.setAutofilled(false); |
+ } |
+} |
+ |
+void FormManager::FillForms(const std::vector<FormData>& forms) { |
+ for (std::vector<FormData>::const_iterator iter = forms.begin(); |
iter != forms.end(); ++iter) { |
FillForm(*iter); |
} |
@@ -582,7 +624,7 @@ bool FormManager::FormElementToFormData(const WebFrame* frame, |
continue; |
} |
- if (requirements & REQUIRE_ELEMENTS_ENABLED && !control_element.isEnabled()) |
+ if (requirements & REQUIRE_ENABLED && !control_element.isEnabled()) |
continue; |
FormField field; |
@@ -639,8 +681,10 @@ bool FormManager::FindCachedFormElement(const FormData& form, |
return false; |
} |
-void FormManager::ForEachMatchingFormField( |
- FormElement* form, const FormData& data, Callback* callback) { |
+void FormManager::ForEachMatchingFormField(FormElement* form, |
+ RequirementsMask requirements, |
+ const FormData& data, |
+ Callback* callback) { |
// It's possible that the site has injected fields into the form after the |
// page has loaded, so we can't assert that the size of the cached control |
// elements is equal to the size of the fields in |form|. Fortunately, the |
@@ -666,6 +710,26 @@ void FormManager::ForEachMatchingFormField( |
continue; |
DCHECK_EQ(data.fields[k].name(), element_name); |
+ |
+ // More than likely |requirements| will contain REQUIRE_AUTOCOMPLETE and/or |
+ // REQUIRE_EMPTY, which both require text form control elements, so special- |
+ // case this type of element. |
+ if (element->formControlType() == WebString::fromUTF8("text")) { |
+ const WebInputElement& input_element = |
+ element->toConst<WebInputElement>(); |
+ |
+ // TODO(jhawkins): WebKit currently doesn't handle the autocomplete |
+ // attribute for select control elements, but it probably should. |
+ if (requirements & REQUIRE_AUTOCOMPLETE && !input_element.autoComplete()) |
+ continue; |
+ |
+ if (requirements & REQUIRE_EMPTY && !input_element.value().isEmpty()) |
+ continue; |
+ } |
+ |
+ if (requirements & REQUIRE_ENABLED && !element->isEnabled()) |
+ continue; |
+ |
callback->Run(element, &data.fields[k]); |
// We found a matching form field so move on to the next. |
@@ -684,18 +748,6 @@ void FormManager::FillFormField(WebKit::WebFormControlElement* field, |
if (field->formControlType() == WebString::fromUTF8("text")) { |
WebInputElement input_element = field->to<WebInputElement>(); |
- // Don't auto-fill a disabled field. |
- if (!input_element.isEnabledFormControl()) |
- return; |
- |
- // Don't auto-fill a field with autocomplete=off. |
- if (!input_element.autoComplete()) |
- return; |
- |
- // Don't overwrite a pre-existing value in the field. |
- if (!input_element.value().isEmpty()) |
- return; |
- |
// If the maxlength attribute contains a negative value, maxLength() |
// returns the default maxlength value. |
input_element.setValue(data->value().substr(0, input_element.maxLength())); |
@@ -705,3 +757,22 @@ void FormManager::FillFormField(WebKit::WebFormControlElement* field, |
select_element.setValue(data->value()); |
} |
} |
+ |
+void FormManager::PreviewFormField(WebKit::WebFormControlElement* field, |
+ const FormField* data) { |
+ // Nothing to preview. |
+ if (data->value().empty()) |
+ return; |
+ |
+ // Only preview input fields. |
+ if (field->formControlType() != WebString::fromUTF8("text")) |
+ return; |
+ |
+ WebInputElement input_element = field->to<WebInputElement>(); |
+ |
+ // If the maxlength attribute contains a negative value, maxLength() |
+ // returns the default maxlength value. |
+ input_element.setPlaceholder( |
+ data->value().substr(0, input_element.maxLength())); |
+ input_element.setAutofilled(true); |
+} |