| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_PROXY_MAC_H_ |
| #define CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_PROXY_MAC_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "base/threading/thread.h" |
| #include "components/password_manager/core/browser/keychain_migration_status_mac.h" |
| #include "components/password_manager/core/browser/password_store.h" |
| #include "components/password_manager/core/common/password_manager_pref_names.h" |
| #include "components/prefs/pref_member.h" |
| |
| namespace crypto { |
| class AppleKeychain; |
| } |
| |
| namespace password_manager { |
| class LoginDatabase; |
| } |
| |
| class PasswordStoreMac; |
| class SimplePasswordStoreMac; |
| |
| // The class is a proxy for either PasswordStoreMac or SimplePasswordStoreMac. |
| // It is responsible for performing migration from PasswordStoreMac to |
| // SimplePasswordStoreMac and instantiating a correct backend according to the |
| // user's state. |
| class PasswordStoreProxyMac : public password_manager::PasswordStore { |
| public: |
| PasswordStoreProxyMac( |
| scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner, |
| scoped_ptr<crypto::AppleKeychain> keychain, |
| scoped_ptr<password_manager::LoginDatabase> login_db, |
| PrefService* prefs); |
| |
| bool Init(const syncer::SyncableService::StartSyncFlare& flare) override; |
| void ShutdownOnUIThread() override; |
| scoped_refptr<base::SingleThreadTaskRunner> GetBackgroundTaskRunner() |
| override; |
| |
| #if defined(UNIT_TEST) |
| password_manager::LoginDatabase* login_metadata_db() { |
| return login_metadata_db_.get(); |
| } |
| |
| scoped_refptr<PasswordStoreMac> password_store_mac() { |
| return password_store_mac_; |
| } |
| #endif |
| |
| private: |
| ~PasswordStoreProxyMac() override; |
| |
| password_manager::PasswordStore* GetBackend() const; |
| |
| // Opens LoginDatabase on the background |thread_|. |
| void InitOnBackgroundThread(password_manager::MigrationStatus status); |
| |
| // Writes status to the prefs. |
| void UpdateStatusPref(password_manager::MigrationStatus status); |
| |
| // Executes |pending_ui_tasks_| on the UI thread. |
| void FlushPendingTasks(); |
| |
| // PasswordStore: |
| void ReportMetricsImpl(const std::string& sync_username, |
| bool custom_passphrase_sync_enabled) override; |
| password_manager::PasswordStoreChangeList AddLoginImpl( |
| const autofill::PasswordForm& form) override; |
| password_manager::PasswordStoreChangeList UpdateLoginImpl( |
| const autofill::PasswordForm& form) override; |
| password_manager::PasswordStoreChangeList RemoveLoginImpl( |
| const autofill::PasswordForm& form) override; |
| password_manager::PasswordStoreChangeList RemoveLoginsByOriginAndTimeImpl( |
| const url::Origin& origin, |
| base::Time delete_begin, |
| base::Time delete_end) override; |
| password_manager::PasswordStoreChangeList RemoveLoginsCreatedBetweenImpl( |
| base::Time delete_begin, |
| base::Time delete_end) override; |
| password_manager::PasswordStoreChangeList RemoveLoginsSyncedBetweenImpl( |
| base::Time delete_begin, |
| base::Time delete_end) override; |
| bool RemoveStatisticsCreatedBetweenImpl(base::Time delete_begin, |
| base::Time delete_end) override; |
| ScopedVector<autofill::PasswordForm> FillMatchingLogins( |
| const autofill::PasswordForm& form) override; |
| bool FillAutofillableLogins( |
| ScopedVector<autofill::PasswordForm>* forms) override; |
| bool FillBlacklistLogins( |
| ScopedVector<autofill::PasswordForm>* forms) override; |
| void AddSiteStatsImpl( |
| const password_manager::InteractionsStats& stats) override; |
| void RemoveSiteStatsImpl(const GURL& origin_domain) override; |
| std::vector<scoped_ptr<password_manager::InteractionsStats>> GetSiteStatsImpl( |
| const GURL& origin_domain) override; |
| |
| scoped_refptr<PasswordStoreMac> password_store_mac_; |
| scoped_refptr<SimplePasswordStoreMac> password_store_simple_; |
| |
| // The login metadata SQL database. If opening the DB on |thread_| fails, |
| // |login_metadata_db_| will be reset to NULL for the lifetime of |this|. |
| // The ownership may be transferred to |password_store_simple_|. |
| scoped_ptr<password_manager::LoginDatabase> login_metadata_db_; |
| |
| // Thread that the synchronous methods are run on. |
| scoped_ptr<base::Thread> thread_; |
| |
| // Current migration status for the profile. |
| IntegerPrefMember migration_status_; |
| |
| // List of tasks filled by InitOnBackgroundThread. They can't be just posted |
| // to the UI thread because the message loop can shut down before executing |
| // them. If this is the case then Shutdown() flushes the tasks after stopping |
| // the background thread. |
| // After InitOnBackgroundThread is run once, the queue may not be modified on |
| // the background thread any more. |
| std::vector<base::Closure> pending_ui_tasks_; |
| |
| DISALLOW_COPY_AND_ASSIGN(PasswordStoreProxyMac); |
| }; |
| |
| #endif // CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_PROXY_MAC_H_ |