Index: components/password_manager/core/browser/password_autofill_manager.cc |
diff --git a/components/password_manager/core/browser/password_autofill_manager.cc b/components/password_manager/core/browser/password_autofill_manager.cc |
index 01bf791bed010de8ddfda9ae442a1c79cb34dcd1..3517433edaba572b49d6d1cd295d8e8d7a80e4ea 100644 |
--- a/components/password_manager/core/browser/password_autofill_manager.cc |
+++ b/components/password_manager/core/browser/password_autofill_manager.cc |
@@ -2,16 +2,59 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "components/password_manager/core/browser/password_autofill_manager.h" |
+ |
+#include <vector> |
+ |
#include "base/logging.h" |
+#include "base/strings/string16.h" |
+#include "base/strings/string_util.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "components/autofill/core/browser/autofill_driver.h" |
#include "components/autofill/core/browser/popup_item_ids.h" |
#include "components/autofill/core/common/autofill_data_validation.h" |
-#include "components/password_manager/core/browser/password_autofill_manager.h" |
#include "components/password_manager/core/browser/password_manager_client.h" |
#include "components/password_manager/core/browser/password_manager_driver.h" |
namespace password_manager { |
+namespace { |
+ |
+// This function attempts to fill |suggestions| and |realms| form |fill_data| |
+// based on |current_username|. Unless |show_all| is true, it only picks |
+// suggestions where the username has |current_username| as a prefix. |
+void GetSuggestions(const autofill::PasswordFormFillData& fill_data, |
+ const base::string16& current_username, |
+ std::vector<base::string16>* suggestions, |
+ std::vector<base::string16>* realms, |
+ bool show_all) { |
+ if (show_all || |
+ StartsWith( |
+ fill_data.basic_data.fields[0].value, current_username, false)) { |
+ suggestions->push_back(fill_data.basic_data.fields[0].value); |
+ realms->push_back(base::UTF8ToUTF16(fill_data.preferred_realm)); |
+ } |
+ |
+ for (const auto& login : fill_data.additional_logins) { |
+ if (show_all || StartsWith(login.first, current_username, false)) { |
+ suggestions->push_back(login.first); |
+ realms->push_back(base::UTF8ToUTF16(login.second.realm)); |
+ } |
+ } |
+ |
+ for (const auto& usernames : fill_data.other_possible_usernames) { |
+ for (size_t i = 0; i < usernames.second.size(); ++i) { |
+ if (show_all || |
+ StartsWith(usernames.second[i], current_username, false)) { |
+ suggestions->push_back(usernames.second[i]); |
+ realms->push_back(base::UTF8ToUTF16(usernames.first.realm)); |
+ } |
+ } |
+ } |
+} |
+ |
+} // namespace |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// PasswordAutofillManager, public: |
@@ -66,9 +109,18 @@ void PasswordAutofillManager::OnAddPasswordFormMapping( |
void PasswordAutofillManager::OnShowPasswordSuggestions( |
const autofill::FormFieldData& field, |
- const gfx::RectF& bounds, |
- const std::vector<base::string16>& suggestions, |
- const std::vector<base::string16>& realms) { |
+ const base::string16& typed_username, |
+ bool show_all, |
+ const gfx::RectF& bounds) { |
+ std::vector<base::string16> suggestions; |
+ std::vector<base::string16> realms; |
+ LoginToPasswordInfoMap::const_iterator fill_data = |
Garrett Casto
2014/10/30 22:33:29
nit: Normally iterators are named in such a way th
vabr (Chromium)
2014/10/31 08:54:12
Done.
|
+ login_to_password_info_.find(field); |
+ DCHECK(fill_data != login_to_password_info_.end()); |
+ GetSuggestions(fill_data->second, typed_username, &suggestions, &realms, |
+ show_all); |
+ DCHECK_EQ(suggestions.size(), realms.size()); |
+ |
if (!autofill::IsValidString16Vector(suggestions) || |
!autofill::IsValidString16Vector(realms) || |
suggestions.size() != realms.size()) |