| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_LACROS_PREFS_ASH_OBSERVER_H_ |
| #define CHROME_BROWSER_LACROS_PREFS_ASH_OBSERVER_H_ |
| |
| #include <memory> |
| |
| #include "base/functional/callback.h" |
| #include "base/gtest_prod_util.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/values.h" |
| #include "chromeos/lacros/crosapi_pref_observer.h" |
| #include "components/prefs/pref_service.h" |
| |
| class PrefService; |
| class Profile; |
| |
| // Observes ash-chrome for changes and propagates them to the local state and |
| // user pref services. |
| class PrefsAshObserver { |
| public: |
| explicit PrefsAshObserver(PrefService* local_state); |
| PrefsAshObserver(const PrefsAshObserver&) = delete; |
| PrefsAshObserver& operator=(const PrefsAshObserver&) = delete; |
| ~PrefsAshObserver(); |
| |
| void Init(); |
| void InitPostProfileInitialized(Profile* profile); |
| |
| private: |
| FRIEND_TEST_ALL_PREFIXES(PrefsAshObserver, LocalStateUpdatedOnChange); |
| |
| void OnDnsOverHttpsModeChanged(base::Value value); |
| void OnDnsOverHttpsTemplatesChanged(base::Value value); |
| void OnDnsOverHttpsTemplatesWithIdentifiersChanged(base::Value value); |
| void OnDnsOverHttpsSaltChanged(base::Value value); |
| void OnUserProfileValueChanged(const std::string& target_pref, |
| base::Value value); |
| static void ListChangedHandler(PrefService* pref_service, |
| const std::string& pref_name, |
| base::Value value); |
| |
| // Pref values that are supposed to be propagated to the user pref service |
| // could be sent from ash to lacros before the user profile is created. |
| // Attempting to propagate the value at this time will prematurely create the |
| // user profile and will trigger pref access for prefs that are not registered |
| // yet (c.f. crbug.com/1459027). Pref values that are received before the user |
| // profile is initialized are cached in `pre_profile_initialized_values_` and |
| // propagated using the handlers registered in |
| // `post_profile_initialized_handlers_` as soon as the user profile is |
| // initialized. |
| std::map<std::string, base::Value> pre_profile_initialized_values_; |
| std::map< |
| std::string, |
| base::RepeatingCallback< |
| void(PrefService*, const std::string& pref_name, base::Value value)>> |
| post_profile_initialized_handlers_; |
| // `is_profile_initialized_` determines whether a user pref needs to be cached |
| // or can be forwarded immediately after the profile is initialized. |
| bool is_profile_initialized_ = false; |
| |
| raw_ptr<PrefService> local_state_{nullptr}; |
| std::unique_ptr<CrosapiPrefObserver> doh_mode_observer_; |
| std::unique_ptr<CrosapiPrefObserver> doh_templates_observer_; |
| std::unique_ptr<CrosapiPrefObserver> doh_templates_with_identifiers_observer_; |
| std::unique_ptr<CrosapiPrefObserver> doh_salt_observer_; |
| std::unique_ptr<CrosapiPrefObserver> |
| access_to_get_all_screens_media_in_session_allowed_for_urls_observer_; |
| }; |
| |
| #endif // CHROME_BROWSER_LACROS_PREFS_ASH_OBSERVER_H_ |