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); |