| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef IOS_CHROME_BROWSER_NET_MODEL_ACCEPT_LANGUAGE_PREF_WATCHER_H_ |
| #define IOS_CHROME_BROWSER_NET_MODEL_ACCEPT_LANGUAGE_PREF_WATCHER_H_ |
| |
| #include <string> |
| |
| #import "base/memory/raw_ptr.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/synchronization/lock.h" |
| #include "components/prefs/pref_member.h" |
| |
| // Helper class to watch the value of AcceptLanguage preference on the UI |
| // thread and safely propagate the value to the IO thread. |
| class AcceptLanguagePrefWatcher { |
| public: |
| // The Handle class is a thread safe ref-counted object that holds the |
| // most recent version of the value of the AcceptLanguage in a format |
| // usable as an HTTP header. |
| class Handle : public base::RefCountedThreadSafe<Handle> { |
| public: |
| // Initializes the AcceptLanguage header from the preference value. |
| Handle(const std::string& languages); |
| |
| Handle(const Handle&) = delete; |
| const Handle& operator=(const Handle&) = delete; |
| |
| // Sets the value for the AcceptLanguage header from the pref value. |
| void SetAcceptLanguageHeaderFromPref(const std::string& languages); |
| |
| // Gets the value for the AcceptLanguage header. |
| std::string GetAcceptLanguageHeader() const; |
| |
| private: |
| friend class base::RefCountedThreadSafe<Handle>; |
| ~Handle(); |
| |
| mutable base::Lock lock_; |
| std::string accept_language_header_ GUARDED_BY(lock_); |
| }; |
| |
| // Initializes the instance with `pref_service` which must be valid and |
| // whose lifetime must exceed that of the AcceptLanguagePrefWatcher |
| explicit AcceptLanguagePrefWatcher(PrefService* pref_service); |
| |
| AcceptLanguagePrefWatcher(const AcceptLanguagePrefWatcher&) = delete; |
| const AcceptLanguagePrefWatcher& operator=(const AcceptLanguagePrefWatcher&) = |
| delete; |
| |
| ~AcceptLanguagePrefWatcher(); |
| |
| // Returns a pointer to the handle. This can be used on any thread to read |
| // the last value of the AcceptLanguage preference in a format usable as an |
| // HTTP header. |
| scoped_refptr<Handle> GetHandle(); |
| |
| private: |
| // Invoked by StringPrefMember when the preference value changes. |
| void OnPrefValueChanged(const std::string& pref_name); |
| |
| raw_ptr<PrefService> pref_service_ = nullptr; |
| StringPrefMember accept_language_pref_; |
| scoped_refptr<Handle> handle_; |
| }; |
| |
| #endif // IOS_CHROME_BROWSER_NET_MODEL_ACCEPT_LANGUAGE_PREF_WATCHER_H_ |