Chromium Code Reviews| Index: chrome/browser/password_manager/password_store_mac.cc |
| diff --git a/chrome/browser/password_manager/password_store_mac.cc b/chrome/browser/password_manager/password_store_mac.cc |
| index 416bab57ddb8d6d2f554b248cf953150344c4c98..7f2b451a6f73b7f3a23564af9b5a6eafa3e5042d 100644 |
| --- a/chrome/browser/password_manager/password_store_mac.cc |
| +++ b/chrome/browser/password_manager/password_store_mac.cc |
| @@ -864,12 +864,11 @@ PasswordStoreMac::PasswordStoreMac( |
| scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner, |
| scoped_refptr<base::SingleThreadTaskRunner> db_thread_runner, |
| AppleKeychain* keychain, |
| - password_manager::LoginDatabase* login_db) |
| + const base::FilePath& login_db_file_path) |
| : password_manager::PasswordStore(main_thread_runner, db_thread_runner), |
| keychain_(keychain), |
| - login_metadata_db_(login_db) { |
| + login_db_file_path_(login_db_file_path) { |
| DCHECK(keychain_.get()); |
| - DCHECK(login_metadata_db_.get()); |
| } |
| PasswordStoreMac::~PasswordStoreMac() {} |
| @@ -883,9 +882,19 @@ bool PasswordStoreMac::Init( |
| thread_.reset(NULL); |
| return false; |
| } |
| + |
| + ScheduleTask(base::Bind(&PasswordStoreMac::InitOnBackgroundThread, this)); |
| return password_manager::PasswordStore::Init(flare); |
| } |
| +void PasswordStoreMac::InitOnBackgroundThread() { |
| + login_metadata_db_.reset(new password_manager::LoginDatabase()); |
| + if (!login_metadata_db_->Init(login_db_file_path_)) { |
| + login_metadata_db_.reset(); |
| + LOG(ERROR) << "Could not initialize login database."; |
| + } |
| +} |
| + |
| void PasswordStoreMac::Shutdown() { |
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| password_manager::PasswordStore::Shutdown(); |
| @@ -903,6 +912,8 @@ PasswordStoreMac::GetBackgroundTaskRunner() { |
| void PasswordStoreMac::ReportMetricsImpl(const std::string& sync_username, |
| bool custom_passphrase_sync_enabled) { |
| + if (!login_metadata_db_) |
| + return; |
| login_metadata_db_->ReportMetrics(sync_username, |
| custom_passphrase_sync_enabled); |
| } |
| @@ -910,16 +921,17 @@ void PasswordStoreMac::ReportMetricsImpl(const std::string& sync_username, |
| PasswordStoreChangeList PasswordStoreMac::AddLoginImpl( |
| const PasswordForm& form) { |
| DCHECK(thread_->message_loop() == base::MessageLoop::current()); |
| - PasswordStoreChangeList changes; |
| - if (AddToKeychainIfNecessary(form)) { |
| - changes = login_metadata_db_->AddLogin(form); |
| - } |
| - return changes; |
| + if (!login_metadata_db_ && AddToKeychainIfNecessary(form)) |
| + return login_metadata_db_->AddLogin(form); |
| + return PasswordStoreChangeList(); |
| } |
| PasswordStoreChangeList PasswordStoreMac::UpdateLoginImpl( |
| const PasswordForm& form) { |
| DCHECK(thread_->message_loop() == base::MessageLoop::current()); |
| + if (!login_metadata_db_) |
| + return PasswordStoreChangeList(); |
| + |
| PasswordStoreChangeList changes = login_metadata_db_->UpdateLogin(form); |
| MacKeychainPasswordFormAdapter keychain_adapter(keychain_.get()); |
| @@ -942,7 +954,7 @@ PasswordStoreChangeList PasswordStoreMac::RemoveLoginImpl( |
| const PasswordForm& form) { |
| DCHECK(thread_->message_loop() == base::MessageLoop::current()); |
| PasswordStoreChangeList changes; |
| - if (login_metadata_db_->RemoveLogin(form)) { |
| + if (login_metadata_db_ && login_metadata_db_->RemoveLogin(form)) { |
| // See if we own a Keychain item associated with this item. We can do an |
| // exact search rather than messing around with trying to do fuzzy matching |
| // because passwords that we created will always have an exact-match |
| @@ -970,15 +982,15 @@ PasswordStoreChangeList PasswordStoreMac::RemoveLoginsCreatedBetweenImpl( |
| base::Time delete_end) { |
| PasswordStoreChangeList changes; |
| ScopedVector<PasswordForm> forms; |
| - if (login_metadata_db_->GetLoginsCreatedBetween(delete_begin, delete_end, |
| - &forms.get())) { |
| - if (login_metadata_db_->RemoveLoginsCreatedBetween(delete_begin, |
| - delete_end)) { |
| - RemoveKeychainForms(forms.get()); |
| - CleanOrphanedForms(&forms.get()); |
| - changes = FormsToRemoveChangeList(forms.get()); |
| - LogStatsForBulkDeletion(changes.size()); |
| - } |
| + if (login_metadata_db_ && |
| + login_metadata_db_->GetLoginsCreatedBetween(delete_begin, delete_end, |
| + &forms.get()) && |
| + login_metadata_db_->RemoveLoginsCreatedBetween(delete_begin, |
| + delete_end)) { |
| + RemoveKeychainForms(forms.get()); |
| + CleanOrphanedForms(&forms.get()); |
| + changes = FormsToRemoveChangeList(forms.get()); |
| + LogStatsForBulkDeletion(changes.size()); |
| } |
| return changes; |
| } |
| @@ -988,15 +1000,14 @@ PasswordStoreChangeList PasswordStoreMac::RemoveLoginsSyncedBetweenImpl( |
| base::Time delete_end) { |
| PasswordStoreChangeList changes; |
| ScopedVector<PasswordForm> forms; |
| - if (login_metadata_db_->GetLoginsSyncedBetween( |
| - delete_begin, delete_end, &forms.get())) { |
| - if (login_metadata_db_->RemoveLoginsSyncedBetween(delete_begin, |
| - delete_end)) { |
| - RemoveKeychainForms(forms.get()); |
| - CleanOrphanedForms(&forms.get()); |
| - changes = FormsToRemoveChangeList(forms.get()); |
| - LogStatsForBulkDeletionDuringRollback(changes.size()); |
| - } |
| + if (login_metadata_db_ && |
| + login_metadata_db_->GetLoginsSyncedBetween(delete_begin, delete_end, |
| + &forms.get()) && |
| + login_metadata_db_->RemoveLoginsSyncedBetween(delete_begin, delete_end)) { |
| + RemoveKeychainForms(forms.get()); |
| + CleanOrphanedForms(&forms.get()); |
| + changes = FormsToRemoveChangeList(forms.get()); |
| + LogStatsForBulkDeletionDuringRollback(changes.size()); |
| } |
| return changes; |
| } |
| @@ -1008,6 +1019,11 @@ void PasswordStoreMac::GetLoginsImpl( |
| chrome::ScopedSecKeychainSetUserInteractionAllowed user_interaction_allowed( |
| prompt_policy == ALLOW_PROMPT); |
| + if (!login_metadata_db_) { |
| + callback_runner.Run(std::vector<PasswordForm*>()); |
| + return; |
| + } |
| + |
| ScopedVector<PasswordForm> database_forms; |
| login_metadata_db_->GetLogins(form, &database_forms.get()); |
| @@ -1076,7 +1092,8 @@ bool PasswordStoreMac::FillAutofillableLogins( |
| DCHECK(thread_->message_loop() == base::MessageLoop::current()); |
| ScopedVector<PasswordForm> database_forms; |
| - if (!login_metadata_db_->GetAutofillableLogins(&database_forms.get())) |
| + if (!login_metadata_db_ || |
| + login_metadata_db_->GetAutofillableLogins(&database_forms.get())) |
|
Garrett Casto
2015/01/14 08:50:22
Shouldn't this be "!login_metadata_db_->GetAutofil
engedy
2015/01/14 14:36:54
Ouch. Done.
|
| return false; |
| std::vector<PasswordForm*> merged_forms = |
| @@ -1095,7 +1112,7 @@ bool PasswordStoreMac::FillAutofillableLogins( |
| bool PasswordStoreMac::FillBlacklistLogins( |
| std::vector<PasswordForm*>* forms) { |
| DCHECK(thread_->message_loop() == base::MessageLoop::current()); |
| - return login_metadata_db_->GetBlacklistLogins(forms); |
| + return login_metadata_db_ && login_metadata_db_->GetBlacklistLogins(forms); |
| } |
| bool PasswordStoreMac::AddToKeychainIfNecessary(const PasswordForm& form) { |
| @@ -1108,6 +1125,7 @@ bool PasswordStoreMac::AddToKeychainIfNecessary(const PasswordForm& form) { |
| bool PasswordStoreMac::DatabaseHasFormMatchingKeychainForm( |
| const autofill::PasswordForm& form) { |
| + DCHECK(login_metadata_db_); |
| bool has_match = false; |
| std::vector<PasswordForm*> database_forms; |
| login_metadata_db_->GetLogins(form, &database_forms); |
| @@ -1129,6 +1147,7 @@ bool PasswordStoreMac::DatabaseHasFormMatchingKeychainForm( |
| void PasswordStoreMac::RemoveDatabaseForms( |
| const std::vector<PasswordForm*>& forms) { |
| + DCHECK(login_metadata_db_); |
| for (std::vector<PasswordForm*>::const_iterator i = forms.begin(); |
| i != forms.end(); ++i) { |
| login_metadata_db_->RemoveLogin(**i); |
| @@ -1147,6 +1166,8 @@ void PasswordStoreMac::RemoveKeychainForms( |
| void PasswordStoreMac::CleanOrphanedForms(std::vector<PasswordForm*>* forms) { |
| DCHECK(forms); |
| + DCHECK(login_metadata_db_); |
| + |
| std::vector<PasswordForm*> database_forms; |
| login_metadata_db_->GetAutofillableLogins(&database_forms); |