Index: chrome/browser/password_manager/password_store_proxy_mac.cc |
diff --git a/chrome/browser/password_manager/password_store_proxy_mac.cc b/chrome/browser/password_manager/password_store_proxy_mac.cc |
index 8e7bd5b7fb875dea67b5ca2c01c56deb0e1c1b5c..88f6c60109d3b59c8e6aef5c9db6b98af286f025 100644 |
--- a/chrome/browser/password_manager/password_store_proxy_mac.cc |
+++ b/chrome/browser/password_manager/password_store_proxy_mac.cc |
@@ -6,6 +6,7 @@ |
#include "chrome/browser/password_manager/password_store_mac.h" |
#include "chrome/browser/password_manager/simple_password_store_mac.h" |
+#include "content/public/browser/browser_thread.h" |
#include "crypto/apple_keychain.h" |
using password_manager::PasswordStoreChangeList; |
@@ -14,10 +15,12 @@ PasswordStoreProxyMac::PasswordStoreProxyMac( |
scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner, |
scoped_ptr<crypto::AppleKeychain> keychain, |
scoped_ptr<password_manager::LoginDatabase> login_db) |
- : PasswordStore(main_thread_runner, nullptr) { |
+ : PasswordStore(main_thread_runner, nullptr), |
+ login_metadata_db_(login_db.Pass()) { |
+ DCHECK(login_metadata_db_); |
// TODO(vasilii): for now the class is just a wrapper around PasswordStoreMac. |
- password_store_mac_ = new PasswordStoreMac(main_thread_runner, nullptr, |
- keychain.Pass(), login_db.Pass()); |
+ password_store_mac_ = new PasswordStoreMac( |
+ main_thread_runner, nullptr, keychain.Pass(), login_metadata_db_.get()); |
} |
PasswordStoreProxyMac::~PasswordStoreProxyMac() { |
@@ -25,11 +28,31 @@ PasswordStoreProxyMac::~PasswordStoreProxyMac() { |
bool PasswordStoreProxyMac::Init( |
const syncer::SyncableService::StartSyncFlare& flare) { |
- return GetBackend()->Init(flare); |
+ // Set up a background thread. |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ thread_.reset(new base::Thread("Chrome_PasswordStore_Thread")); |
+ |
+ if (!thread_->Start()) { |
+ thread_.reset(); |
+ return false; |
+ } |
+ |
+ ScheduleTask( |
+ base::Bind(&PasswordStoreProxyMac::InitOnBackgroundThread, this)); |
+ password_store_mac_->InitWithTaskRunner(GetBackgroundTaskRunner()); |
+ return password_manager::PasswordStore::Init(flare); |
} |
void PasswordStoreProxyMac::Shutdown() { |
- return GetBackend()->Shutdown(); |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ PasswordStore::Shutdown(); |
+ GetBackend()->Shutdown(); |
+ thread_->Stop(); |
+} |
+ |
+scoped_refptr<base::SingleThreadTaskRunner> |
+PasswordStoreProxyMac::GetBackgroundTaskRunner() { |
+ return thread_ ? thread_->task_runner() : nullptr; |
} |
password_manager::PasswordStore* PasswordStoreProxyMac::GetBackend() const { |
@@ -38,9 +61,12 @@ password_manager::PasswordStore* PasswordStoreProxyMac::GetBackend() const { |
return password_store_simple_.get(); |
} |
-scoped_refptr<base::SingleThreadTaskRunner> |
-PasswordStoreProxyMac::GetBackgroundTaskRunner() { |
- return GetBackend()->GetBackgroundTaskRunner(); |
+void PasswordStoreProxyMac::InitOnBackgroundThread() { |
+ DCHECK(GetBackgroundTaskRunner()->BelongsToCurrentThread()); |
+ if (!login_metadata_db_->Init()) { |
+ login_metadata_db_.reset(); |
+ LOG(ERROR) << "Could not create/open login database."; |
+ } |
} |
void PasswordStoreProxyMac::ReportMetricsImpl( |
@@ -83,16 +109,6 @@ ScopedVector<autofill::PasswordForm> PasswordStoreProxyMac::FillMatchingLogins( |
return GetBackend()->FillMatchingLogins(form, prompt_policy); |
} |
-void PasswordStoreProxyMac::GetAutofillableLoginsImpl( |
- scoped_ptr<PasswordStore::GetLoginsRequest> request) { |
- GetBackend()->GetAutofillableLoginsImpl(request.Pass()); |
-} |
- |
-void PasswordStoreProxyMac::GetBlacklistLoginsImpl( |
- scoped_ptr<PasswordStore::GetLoginsRequest> request) { |
- GetBackend()->GetBlacklistLoginsImpl(request.Pass()); |
-} |
- |
bool PasswordStoreProxyMac::FillAutofillableLogins( |
ScopedVector<autofill::PasswordForm>* forms) { |
return GetBackend()->FillAutofillableLogins(forms); |