| Index: components/autofill/content/renderer/password_autofill_agent.cc
|
| diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc
|
| index 642f6ff863bf131e0268361f5924545bc5ba5fbc..952ba4f5c471683178392788b7ddd244a945fec1 100644
|
| --- a/components/autofill/content/renderer/password_autofill_agent.cc
|
| +++ b/components/autofill/content/renderer/password_autofill_agent.cc
|
| @@ -281,6 +281,20 @@ bool IsElementAutocompletable(const blink::WebInputElement& element) {
|
| return IsElementEditable(element);
|
| }
|
|
|
| +// Returns whether the |username_element| is allowed to be autofilled.
|
| +//
|
| +// Note that if the user interacts with the |password_field| and the
|
| +// |username_element| is user-defined (i.e., non-empty and non-autofilled), then
|
| +// this function returns false. This is a precaution, to not override the field
|
| +// if it has been classified as username by accident.
|
| +bool IsUsernameAmendable(const blink::WebInputElement& username_element,
|
| + bool is_password_field_selected) {
|
| + return !username_element.IsNull() &&
|
| + IsElementAutocompletable(username_element) &&
|
| + (!is_password_field_selected || username_element.IsAutofilled() ||
|
| + username_element.Value().IsEmpty());
|
| +}
|
| +
|
| // Return true if either password_value or new_password_value is not empty and
|
| // not default.
|
| bool FormContainsNonDefaultPasswordValue(const PasswordForm& password_form) {
|
| @@ -773,8 +787,9 @@ bool PasswordAutofillAgent::FillSuggestion(
|
| if (element->IsPasswordField()) {
|
| password_info->password_field_suggestion_was_accepted = true;
|
| password_info->password_field = password_element;
|
| - } else if (!username_element.IsNull() &&
|
| - IsElementAutocompletable(username_element)) {
|
| + }
|
| +
|
| + if (IsUsernameAmendable(username_element, element->IsPasswordField())) {
|
| username_element.SetAutofillValue(blink::WebString::FromUTF16(username));
|
| username_element.SetAutofilled(true);
|
| UpdateFieldValueAndPropertiesMaskMap(username_element, &username,
|
| @@ -814,8 +829,7 @@ bool PasswordAutofillAgent::PreviewSuggestion(
|
| return false;
|
| }
|
|
|
| - if (!element->IsPasswordField() && !username_element.IsNull() &&
|
| - IsElementAutocompletable(username_element)) {
|
| + if (IsUsernameAmendable(username_element, element->IsPasswordField())) {
|
| if (username_query_prefix_.empty())
|
| username_query_prefix_ = username_element.Value().Utf16();
|
|
|
| @@ -843,8 +857,9 @@ bool PasswordAutofillAgent::DidClearAutofillSelection(
|
| PasswordInfo* password_info;
|
|
|
| if (!FindPasswordInfoForElement(*element, &username_element,
|
| - &password_element, &password_info))
|
| + &password_element, &password_info)) {
|
| return false;
|
| + }
|
|
|
| ClearPreview(&username_element, &password_element);
|
| return true;
|
|
|