| Index: chrome/renderer/autofill/password_autofill_manager.cc
|
| ===================================================================
|
| --- chrome/renderer/autofill/password_autofill_manager.cc (revision 133421)
|
| +++ chrome/renderer/autofill/password_autofill_manager.cc (working copy)
|
| @@ -196,6 +196,25 @@
|
| return StartsWith(username1, username2, true);
|
| }
|
|
|
| +// Get whether fill_data has a username or not.
|
| +bool HasUsernameField(const webkit::forms::PasswordFormFillData& fill_data) {
|
| + return fill_data.basic_data.fields.size() == 2;
|
| +}
|
| +
|
| +// Get the username field from fill_data.
|
| +// If it hasn't any username, calls NOTREACHED().
|
| +const webkit::forms::FormField& GetUsernameField(
|
| + const webkit::forms::PasswordFormFillData& fill_data) {
|
| + DCHECK(HasUsernameField(fill_data));
|
| + return fill_data.basic_data.fields[1];
|
| +}
|
| +
|
| +// Get the password field from fill_data.
|
| +const webkit::forms::FormField& GetPasswordField(
|
| + const webkit::forms::PasswordFormFillData& fill_data) {
|
| + DCHECK(!fill_data.basic_data.fields.empty());
|
| + return fill_data.basic_data.fields[0];
|
| +}
|
| } // namespace
|
|
|
| namespace autofill {
|
| @@ -448,15 +467,20 @@
|
| if (!form_data.wait_for_username)
|
| FillForm(form_elements.get(), form_data.basic_data);
|
|
|
| + // If there isn't any username, go to next iteration.
|
| + if (!HasUsernameField(form_data))
|
| + continue;
|
| +
|
| + // If there is a username, set the username and login_to_password_info_.
|
| // Attach autocomplete listener to enable selecting alternate logins.
|
| // First, get pointers to username element.
|
| WebKit::WebInputElement username_element =
|
| - form_elements->input_elements[form_data.basic_data.fields[0].name];
|
| + form_elements->input_elements[GetUsernameField(form_data).name];
|
|
|
| // Get pointer to password element. (We currently only support single
|
| // password forms).
|
| WebKit::WebInputElement password_element =
|
| - form_elements->input_elements[form_data.basic_data.fields[1].name];
|
| + form_elements->input_elements[GetPasswordField(form_data).name];
|
|
|
| // We might have already filled this form if there are two <form> elements
|
| // with identical markup.
|
| @@ -487,8 +511,11 @@
|
| const webkit::forms::PasswordFormFillData& fill_data,
|
| const string16& input,
|
| std::vector<string16>* suggestions) {
|
| - if (StartsWith(fill_data.basic_data.fields[0].value, input, false))
|
| - suggestions->push_back(fill_data.basic_data.fields[0].value);
|
| + // There are both a password and a username.
|
| + if (HasUsernameField(fill_data) &&
|
| + StartsWith(GetUsernameField(fill_data).value, input, false)) {
|
| + suggestions->push_back(GetUsernameField(fill_data).value);
|
| + }
|
|
|
| webkit::forms::PasswordFormFillData::LoginCollection::const_iterator iter;
|
| for (iter = fill_data.additional_logins.begin();
|
| @@ -553,11 +580,17 @@
|
| string16 username;
|
| string16 password;
|
|
|
| + // If there isn't any username form, just exit.
|
| + // Because this function is used for the case
|
| + // that the username form and the possword form exist.
|
| + if (!HasUsernameField(fill_data))
|
| + return false;
|
| +
|
| // Look for any suitable matches to current field text.
|
| - if (DoUsernamesMatch(fill_data.basic_data.fields[0].value, current_username,
|
| + if (DoUsernamesMatch(GetUsernameField(fill_data).value, current_username,
|
| exact_username_match)) {
|
| - username = fill_data.basic_data.fields[0].value;
|
| - password = fill_data.basic_data.fields[1].value;
|
| + username = GetUsernameField(fill_data).value;
|
| + password = GetPasswordField(fill_data).value;
|
| } else {
|
| // Scan additional logins for a match.
|
| webkit::forms::PasswordFormFillData::LoginCollection::const_iterator iter;
|
|
|