Chromium Code Reviews| 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..baf6b6a2c63f0fa759b9cc393d9166f82911445d 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) || |
|
Ilya Sherman
2014/03/14 07:24:46
nit: No need for the first parenthesis on this lin
ziran.sun
2014/03/14 17:01:42
I feel that it's still needed. The condition is -
Ilya Sherman
2014/03/14 21:42:55
Sorry, you're absolutely right. Thanks for correc
|
| + IsTextAreaElement(*element)) && |
| + !element->value().isEmpty())) |
| continue; |
| if (((filters & FILTER_DISABLED_ELEMENTS) && !element->isEnabled()) || |
| @@ -539,28 +538,23 @@ 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)) && |
| + 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 +576,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 +767,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 +796,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 +964,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 +985,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 +1026,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 +1039,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()) |
| @@ -1079,35 +1072,35 @@ bool ClearPreviewedFormWithElement(const WebInputElement& element, |
| (IsMonthInput(input_element) && |
| input_element->suggestedValue().isEmpty()) || |
| (IsTextAreaElement(control_element) && |
| - control_element.to<WebTextAreaElement>().suggestedValue().isEmpty())) |
| + control_element.suggestedValue().isEmpty())) |
|
Ilya Sherman
2014/03/14 07:24:46
nit: Can this be shortened to the following?
if (
ziran.sun
2014/03/14 17:01:42
Done.
|
| continue; |
| // Clear the suggested value. For the initiating node, also restore the |
| // original value. |
| + bool is_initiating_node = false; |
|
Ilya Sherman
2014/03/14 07:24:46
nit: Can the logic be extracted out to here as "bo
ziran.sun
2014/03/14 17:01:42
Done.
|
| if (IsTextInput(input_element) || IsMonthInput(input_element)) { |
| input_element->setSuggestedValue(WebString()); |
| - bool is_initiating_node = (element == *input_element); |
| + is_initiating_node = (element == *input_element); |
| if (is_initiating_node) |
| input_element->setAutofilled(was_autofilled); |
| else |
| input_element->setAutofilled(false); |
|
Ilya Sherman
2014/03/14 07:24:46
nit: Please share these four lines between input e
ziran.sun
2014/03/14 17:01:42
Done.
|
| - |
| - // 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 (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); |
| + control_element.setSuggestedValue(WebString()); |
| + is_initiating_node = (element == control_element); |
| if (is_initiating_node) |
| control_element.setAutofilled(was_autofilled); |
| else |
| control_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 (is_initiating_node) { |
| + int length = control_element.value().length(); |
| + control_element.setSelectionRange(length, length); |
| + } |
| } |
| return true; |
| @@ -1184,7 +1177,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, |