// Copyright 2013 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PERSONAL_DATA_MANAGER_H_ #define COMPONENTS_AUTOFILL_CORE_BROWSER_PERSONAL_DATA_MANAGER_H_ #include <memory> #include <string> #include "base/memory/raw_ptr.h" #include "base/observer_list.h" #include "base/scoped_observation.h" #include "components/autofill/core/browser/address_data_manager.h" #include "components/autofill/core/browser/autofill_shared_storage_handler.h" #include "components/autofill/core/browser/country_type.h" #include "components/autofill/core/browser/payments_data_manager.h" #include "components/autofill/core/browser/webdata/autofill_webdata_service.h" #include "components/history/core/browser/history_service.h" #include "components/history/core/browser/history_service_observer.h" #include "components/keyed_service/core/keyed_service.h" #include "components/signin/public/identity_manager/identity_manager.h" class PrefService; namespace syncer { class SyncService; } // namespace syncer namespace autofill { class AutofillImageFetcherBase; class PersonalDataManagerObserver; // The PersonalDataManager (PDM) has two main responsibilities: // - Caching the data stored in `AutofillTable` for synchronous retrieval. // - Posting changes to `AutofillTable` via the `AutofillWebDataService` // and updating its state accordingly. // Some payment-related changes (e.g. adding a new server card) don't pass // through the PDM. Instead, they are upstreamed to payments directly, before // Sync downstreams them to Chrome, making them available in `AutofillTable`. // // These responsibilities are split between address and payments data and // managed separately in the `AddressDataManager` (ADM) and // `PaymentsDataManager` (PayDM), respectively. The comment here explains the // general principles that apply to both. For data type specific information, // see those classes. // The ADM/PayDM are owned by the PDM. // TODO(crbug.com/322170538): Currently, only the PDM can be observed. Split the // PDM observer into an ADM and a PayDM observer. // // Since `AutofillTable` lives on a separate sequence, changes posted to the // ADM/PayDM are asynchronous. They only become effective in the ADM/PayDM // after/if the corresponding database operation successfully finished. // // Sync writes to `AutofillTable` directly, since sync bridges live on the same // sequence. In this case, the ADM/PayDM is notified via // `AutofillWebDataServiceObserverOnUISequence::OnAutofillChangedBySync()` and // it reloads all its data from `AutofillTable`. This is done via an operation // called `Refresh()`. // // ADM/PayDM getters such as `GetProfiles()` expose pointers to their internal // copy of `AutofillTable`'s data. As a result, whenever a `Refresh()` happens, // these pointer are invalidated. Do not store them as member variables, since a // refresh through Sync can happen anytime. // // The PDM is a `KeyedService`. However, no separate instance exists for // incognito mode. In incognito mode the original profile's PDM is used. It is // the responsibility of the consumers of the PDM to ensure that no data from an // incognito session is persisted unintentionally. class PersonalDataManager : public KeyedService, public history::HistoryServiceObserver, public AddressDataManager::Observer, public PaymentsDataManager::Observer { … }; } // namespace autofill #endif // COMPONENTS_AUTOFILL_CORE_BROWSER_PERSONAL_DATA_MANAGER_H_