Index: components/autofill/content/renderer/form_autofill_util.cc |
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc |
index c9c6f8789db4e31532694666c8f93db64f4a4ede..7054a90b90a06815e0ab22835ea685d3cf196aa4 100644 |
--- a/components/autofill/content/renderer/form_autofill_util.cc |
+++ b/components/autofill/content/renderer/form_autofill_util.cc |
@@ -507,10 +507,9 @@ void ForEachMatchingFormField(const WebFormElement& form_element, |
// i.e. the field the user is currently editing and interacting with. |
const WebInputElement* input_element = toWebInputElement(element); |
if (!force_override && !is_initiating_element && |
- ((IsAutofillableInputElement(input_element) && |
- !input_element->value().isEmpty()) || |
- (IsTextAreaElement(*element) && |
- !element->toConst<WebTextAreaElement>().value().isEmpty()))) |
+ ((IsAutofillableInputElement(input_element) || |
+ IsTextAreaElement(*element)) && |
+ !element->value().isEmpty())) |
continue; |
if (((filters & FILTER_DISABLED_ELEMENTS) && !element->isEnabled()) || |
@@ -539,28 +538,24 @@ void FillFormField(const FormFieldData& data, |
// returns the default maxlength value. |
input_element->setValue( |
data.value.substr(0, input_element->maxLength()), true); |
- if (is_initiating_node) { |
- int length = input_element->value().length(); |
- input_element->setSelectionRange(length, length); |
- // Clear the current IME composition (the underline), if there is one. |
- input_element->document().frame()->unmarkText(); |
- } |
- } else if (IsTextAreaElement(*field)) { |
- WebTextAreaElement text_area = field->to<WebTextAreaElement>(); |
- if (text_area.value() != data.value) { |
- text_area.setValue(data.value); |
- text_area.dispatchFormControlChangeEvent(); |
- } |
- } 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 if (IsTextAreaElement(*field) || IsSelectElement(*field)) { |
+ if (field->value() != data.value) { |
+ field->setValue(data.value); |
+ field->dispatchFormControlChangeEvent(); |
} |
} else { |
DCHECK(IsCheckableElement(input_element)); |
input_element->setChecked(data.is_checked, true); |
} |
+ |
+ if (is_initiating_node && |
+ ((IsTextInput(input_element) || IsMonthInput(input_element)) || |
+ IsTextAreaElement(*field))) { |
+ int length = field->value().length(); |
+ field->setSelectionRange(length, length); |
+ // Clear the current IME composition (the underline), if there is one. |
+ field->document().frame()->unmarkText(); |
+ } |
} |
// Sets the |field|'s "suggested" (non JS visible) value to the value in |data|. |
@@ -582,17 +577,18 @@ void PreviewFormField(const FormFieldData& data, |
input_element->setSuggestedValue( |
data.value.substr(0, input_element->maxLength())); |
input_element->setAutofilled(true); |
- if (is_initiating_node) { |
- // Select the part of the text that the user didn't type. |
- input_element->setSelectionRange( |
- input_element->value().length(), |
- input_element->suggestedValue().length()); |
- } |
} else if (IsTextAreaElement(*field)) { |
- WebTextAreaElement textarea = field->to<WebTextAreaElement>(); |
- textarea.setSuggestedValue(data.value); |
+ field->setSuggestedValue(data.value); |
field->setAutofilled(true); |
} |
+ |
+ if (is_initiating_node && |
+ (IsTextInput(input_element) || IsTextAreaElement(*field))) { |
+ // Select the part of the text that the user didn't type. |
+ int start = field->value().length(); |
+ int end = field->suggestedValue().length(); |
+ field->setSelectionRange(start, end); |
+ } |
} |
std::string RetrievalMethodToString( |
@@ -772,17 +768,21 @@ void WebFormControlElementToFormField(const WebFormControlElement& element, |
return; |
const WebInputElement* input_element = toWebInputElement(&element); |
+ if (IsAutofillableInputElement(input_element) || |
+ IsTextAreaElement(element)) { |
+ field->is_autofilled = element.isAutofilled(); |
+ field->is_focusable = element.isFocusable(); |
+ field->should_autocomplete = element.autoComplete(); |
+ field->text_direction = element.directionForFormData() == |
+ "rtl" ? base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT; |
+ } |
+ |
if (IsAutofillableInputElement(input_element)) { |
if (IsTextInput(input_element)) |
field->max_length = input_element->maxLength(); |
- field->is_autofilled = input_element->isAutofilled(); |
- field->is_focusable = input_element->isFocusable(); |
field->is_checkable = IsCheckableElement(input_element); |
field->is_checked = input_element->isChecked(); |
- field->should_autocomplete = input_element->autoComplete(); |
- field->text_direction = input_element->directionForFormData() == "rtl" ? |
- base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT; |
} else if (IsTextAreaElement(element)) { |
// Nothing more to do in this case. |
} else if (extract_mask & EXTRACT_OPTIONS) { |
@@ -797,16 +797,10 @@ void WebFormControlElementToFormField(const WebFormControlElement& element, |
if (!(extract_mask & EXTRACT_VALUE)) |
return; |
- base::string16 value; |
- if (IsAutofillableInputElement(input_element)) { |
- value = input_element->value(); |
- } else if (IsTextAreaElement(element)) { |
- value = element.toConst<WebTextAreaElement>().value(); |
- } else { |
- DCHECK(IsSelectElement(element)); |
- const WebSelectElement select_element = element.toConst<WebSelectElement>(); |
- value = select_element.value(); |
+ base::string16 value = element.value(); |
+ if (IsSelectElement(element)) { |
+ const WebSelectElement select_element = element.toConst<WebSelectElement>(); |
// Convert the |select_element| value to text if requested. |
if (extract_mask & EXTRACT_OPTION_TEXT) { |
WebVector<WebElement> list_items = select_element.listItems(); |
@@ -971,10 +965,10 @@ bool WebFormElementToFormData( |
return true; |
} |
-bool FindFormAndFieldForInputElement(const WebInputElement& element, |
- FormData* form, |
- FormFieldData* field, |
- RequirementsMask requirements) { |
+bool FindFormAndFieldForFormControlElement(const WebFormControlElement& element, |
+ FormData* form, |
+ FormFieldData* field, |
+ RequirementsMask requirements) { |
if (!IsAutofillableElement(element)) |
return false; |
@@ -992,7 +986,7 @@ bool FindFormAndFieldForInputElement(const WebInputElement& element, |
field); |
} |
-void FillForm(const FormData& form, const WebInputElement& element) { |
+void FillForm(const FormData& form, const WebFormControlElement& element) { |
WebFormElement form_element = element.form(); |
if (form_element.isNull()) |
return; |
@@ -1033,7 +1027,7 @@ void FillFormForAllElements(const FormData& form_data, |
&FillFormField); |
} |
-void PreviewForm(const FormData& form, const WebInputElement& element) { |
+void PreviewForm(const FormData& form, const WebFormControlElement& element) { |
WebFormElement form_element = element.form(); |
if (form_element.isNull()) |
return; |
@@ -1046,7 +1040,7 @@ void PreviewForm(const FormData& form, const WebInputElement& element) { |
&PreviewFormField); |
} |
-bool ClearPreviewedFormWithElement(const WebInputElement& element, |
+bool ClearPreviewedFormWithElement(const WebFormControlElement& element, |
bool was_autofilled) { |
WebFormElement form_element = element.form(); |
if (form_element.isNull()) |
@@ -1074,39 +1068,28 @@ bool ClearPreviewedFormWithElement(const WebInputElement& element, |
if(!control_element.isAutofilled()) |
continue; |
- if ((IsTextInput(input_element) && |
- input_element->suggestedValue().isEmpty()) || |
- (IsMonthInput(input_element) && |
- input_element->suggestedValue().isEmpty()) || |
- (IsTextAreaElement(control_element) && |
- control_element.to<WebTextAreaElement>().suggestedValue().isEmpty())) |
+ if ((IsTextInput(input_element) || |
+ IsMonthInput(input_element) || |
+ IsTextAreaElement(control_element)) && |
+ control_element.suggestedValue().isEmpty()) |
continue; |
// Clear the suggested value. For the initiating node, also restore the |
// original value. |
- if (IsTextInput(input_element) || IsMonthInput(input_element)) { |
- input_element->setSuggestedValue(WebString()); |
- bool is_initiating_node = (element == *input_element); |
- if (is_initiating_node) |
- input_element->setAutofilled(was_autofilled); |
- else |
- input_element->setAutofilled(false); |
- |
- // Clearing the suggested value in the focused node (above) can cause |
- // selection to be lost. We force selection range to restore the text |
- // cursor. |
+ if (IsTextInput(input_element) || IsMonthInput(input_element) || |
+ IsTextAreaElement(control_element)) { |
+ control_element.setSuggestedValue(WebString()); |
+ bool is_initiating_node = (element == control_element); |
if (is_initiating_node) { |
- int length = input_element->value().length(); |
- input_element->setSelectionRange(length, length); |
- } |
- } else if (IsTextAreaElement(control_element)) { |
- WebTextAreaElement text_area = control_element.to<WebTextAreaElement>(); |
- text_area.setSuggestedValue(WebString()); |
- bool is_initiating_node = (element == text_area); |
- if (is_initiating_node) |
control_element.setAutofilled(was_autofilled); |
- else |
+ // Clearing the suggested value in the focused node (above) can cause |
+ // selection to be lost. We force selection range to restore the text |
+ // cursor. |
+ int length = control_element.value().length(); |
+ control_element.setSelectionRange(length, length); |
+ } else { |
control_element.setAutofilled(false); |
+ } |
} |
} |
@@ -1184,7 +1167,7 @@ bool IsWebElementEmpty(const blink::WebElement& element) { |
return true; |
} |
-gfx::RectF GetScaledBoundingBox(float scale, WebInputElement* element) { |
+gfx::RectF GetScaledBoundingBox(float scale, WebFormControlElement* element) { |
gfx::Rect bounding_box(element->boundsInViewportSpace()); |
return gfx::RectF(bounding_box.x() * scale, |
bounding_box.y() * scale, |