Index: components/password_manager/core/browser/password_store.cc |
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc |
index 8a5792ceb7470c039d81050968ff4d786a2896eb..75cad5434884dbbb40ea271b638d57f269807bda 100644 |
--- a/components/password_manager/core/browser/password_store.cc |
+++ b/components/password_manager/core/browser/password_store.cc |
@@ -11,6 +11,7 @@ |
#include "base/metrics/histogram.h" |
#include "base/stl_util.h" |
#include "components/autofill/core/common/password_form.h" |
+#include "components/password_manager/core/browser/affiliated_match_helper.h" |
#include "components/password_manager/core/browser/password_store_consumer.h" |
#if defined(PASSWORD_MANAGER_ENABLE_SYNC) |
@@ -77,6 +78,13 @@ bool PasswordStore::Init(const syncer::SyncableService::StartSyncFlare& flare) { |
return true; |
} |
+void PasswordStore::SetAffiliatedMatchHelper( |
+ scoped_ptr<AffiliatedMatchHelper> helper) { |
+ DCHECK(helper); |
+ DCHECK(!affiliated_match_helper_); |
+ affiliated_match_helper_ = helper.Pass(); |
+} |
+ |
void PasswordStore::AddLogin(const PasswordForm& form) { |
CheckForEmptyUsernameAndPassword(form); |
ScheduleTask(base::Bind(&PasswordStore::AddLoginInternal, this, form)); |
@@ -125,8 +133,15 @@ void PasswordStore::GetLogins(const PasswordForm& form, |
} |
scoped_ptr<GetLoginsRequest> request(new GetLoginsRequest(consumer)); |
request->set_ignore_logins_cutoff(ignore_logins_cutoff); |
- ScheduleTask(base::Bind(&PasswordStore::GetLoginsImpl, this, form, |
- prompt_policy, base::Passed(&request))); |
+ |
+ if (affiliated_match_helper_) { |
+ affiliated_match_helper_->GetAffiliatedAndroidRealms( |
+ form, base::Bind(&PasswordStore::ScheduleGetLoginsWithAffiliations, |
+ this, form, prompt_policy, base::Passed(&request))); |
+ } else { |
+ ScheduleTask(base::Bind(&PasswordStore::GetLoginsImpl, this, form, |
+ prompt_policy, base::Passed(&request))); |
+ } |
} |
void PasswordStore::GetAutofillableLogins(PasswordStoreConsumer* consumer) { |
@@ -170,6 +185,8 @@ void PasswordStore::Shutdown() { |
#if defined(PASSWORD_MANAGER_ENABLE_SYNC) |
ScheduleTask(base::Bind(&PasswordStore::DestroySyncableService, this)); |
#endif |
+ // The AffiliationService must be destroyed from the main thread. |
+ affiliated_match_helper_.reset(); |
shutdown_called_ = true; |
} |
@@ -263,6 +280,36 @@ void PasswordStore::RemoveLoginsSyncedBetweenInternal(base::Time delete_begin, |
NotifyLoginsChanged(changes); |
} |
+void PasswordStore::GetLoginsWithAffiliationsImpl( |
+ const PasswordForm& form, |
+ AuthorizationPromptPolicy prompt_policy, |
+ scoped_ptr<GetLoginsRequest> request, |
+ const std::vector<std::string>& additional_android_realms) { |
+ DCHECK(GetBackgroundTaskRunner()->BelongsToCurrentThread()); |
+ ScopedVector<PasswordForm> results(FillMatchingLogins(form, prompt_policy)); |
+ for (const std::string& realm : additional_android_realms) { |
+ PasswordForm android_form; |
+ android_form.scheme = PasswordForm::SCHEME_HTML; |
+ android_form.signon_realm = realm; |
+ ScopedVector<PasswordForm> more_results( |
+ AffiliatedMatchHelper::TransformAffiliatedAndroidCredentials( |
+ form, FillMatchingLogins(android_form, DISALLOW_PROMPT))); |
+ results.insert(results.end(), more_results.begin(), more_results.end()); |
+ more_results.weak_clear(); |
+ } |
+ request->NotifyConsumerWithResults(results.Pass()); |
+} |
+ |
+void PasswordStore::ScheduleGetLoginsWithAffiliations( |
+ const PasswordForm& form, |
+ AuthorizationPromptPolicy prompt_policy, |
+ scoped_ptr<GetLoginsRequest> request, |
+ const std::vector<std::string>& additional_android_realms) { |
+ ScheduleTask(base::Bind(&PasswordStore::GetLoginsWithAffiliationsImpl, this, |
+ form, prompt_policy, base::Passed(&request), |
+ additional_android_realms)); |
+} |
+ |
#if defined(PASSWORD_MANAGER_ENABLE_SYNC) |
void PasswordStore::InitSyncableService( |
const syncer::SyncableService::StartSyncFlare& flare) { |