Home | History | Annotate | Download | only in prefs
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_PREFS_PREF_SERVICE_SYNCABLE_H_
      6 #define CHROME_BROWSER_PREFS_PREF_SERVICE_SYNCABLE_H_
      7 
      8 #include "base/prefs/pref_service.h"
      9 #include "chrome/browser/prefs/pref_model_associator.h"
     10 #include "chrome/browser/prefs/synced_pref_observer.h"
     11 #include "components/user_prefs/pref_registry_syncable.h"
     12 
     13 class PrefServiceSyncableObserver;
     14 class Profile;
     15 
     16 namespace syncer {
     17 class SyncableService;
     18 }
     19 
     20 // A PrefService that can be synced. Users are forced to declare
     21 // whether preferences are syncable or not when registering them to
     22 // this PrefService.
     23 class PrefServiceSyncable : public PrefService {
     24  public:
     25   // PrefServiceSyncable is a PrefService with added integration for
     26   // sync, and knowledge of how to create an incognito
     27   // PrefService. For code that does not need to know about the sync
     28   // integration, you should use only the plain PrefService type.
     29   //
     30   // For this reason, Profile does not expose an accessor for the
     31   // PrefServiceSyncable type. Instead, you can use the utilities
     32   // below to retrieve the PrefServiceSyncable (or its incognito
     33   // version) from a Profile.
     34   static PrefServiceSyncable* FromProfile(Profile* profile);
     35   static PrefServiceSyncable* IncognitoFromProfile(Profile* profile);
     36 
     37   // You may wish to use PrefServiceBuilder or one of its subclasses
     38   // for simplified construction.
     39   PrefServiceSyncable(
     40       PrefNotifierImpl* pref_notifier,
     41       PrefValueStore* pref_value_store,
     42       PersistentPrefStore* user_prefs,
     43       user_prefs::PrefRegistrySyncable* pref_registry,
     44       base::Callback<void(PersistentPrefStore::PrefReadError)>
     45           read_error_callback,
     46       bool async);
     47   virtual ~PrefServiceSyncable();
     48 
     49   // Creates an incognito copy of the pref service that shares most pref stores
     50   // but uses a fresh non-persistent overlay for the user pref store and an
     51   // individual extension pref store (to cache the effective extension prefs for
     52   // incognito windows).
     53   PrefServiceSyncable* CreateIncognitoPrefService(
     54       PrefStore* incognito_extension_prefs);
     55 
     56   // Returns true if preferences state has synchronized with the remote
     57   // preferences. If true is returned it can be assumed the local preferences
     58   // has applied changes from the remote preferences. The two may not be
     59   // identical if a change is in flight (from either side).
     60   //
     61   // TODO(albertb): Given that we now support priority preferences, callers of
     62   // this method are likely better off making the preferences they care about
     63   // into priority preferences and calling IsPrioritySyncing().
     64   bool IsSyncing();
     65 
     66   // Returns true if priority preferences state has synchronized with the remote
     67   // priority preferences.
     68   bool IsPrioritySyncing();
     69 
     70   // Returns true if the pref under the given name is pulled down from sync.
     71   // Note this does not refer to SYNCABLE_PREF.
     72   bool IsPrefSynced(const std::string& name) const;
     73 
     74   void AddObserver(PrefServiceSyncableObserver* observer);
     75   void RemoveObserver(PrefServiceSyncableObserver* observer);
     76 
     77   // TODO(zea): Have PrefServiceSyncable implement
     78   // syncer::SyncableService directly.
     79   syncer::SyncableService* GetSyncableService(const syncer::ModelType& type);
     80 
     81   // Do not call this after having derived an incognito or per tab pref service.
     82   virtual void UpdateCommandLinePrefStore(PrefStore* cmd_line_store) OVERRIDE;
     83 
     84   void AddSyncedPrefObserver(const std::string& name,
     85                              SyncedPrefObserver* observer);
     86   void RemoveSyncedPrefObserver(const std::string& name,
     87                                 SyncedPrefObserver* observer);
     88 
     89  private:
     90   friend class PrefModelAssociator;
     91 
     92   void AddRegisteredSyncablePreference(
     93       const char* path,
     94       const user_prefs::PrefRegistrySyncable::PrefSyncStatus sync_status);
     95 
     96   // Invoked internally when the IsSyncing() state changes.
     97   void OnIsSyncingChanged();
     98 
     99   // Process a local preference change. This can trigger new SyncChanges being
    100   // sent to the syncer.
    101   void ProcessPrefChange(const std::string& name);
    102 
    103   // Whether CreateIncognitoPrefService() has been called to create a
    104   // "forked" PrefService.
    105   bool pref_service_forked_;
    106 
    107   PrefModelAssociator pref_sync_associator_;
    108   PrefModelAssociator priority_pref_sync_associator_;
    109 
    110   ObserverList<PrefServiceSyncableObserver> observer_list_;
    111 
    112   DISALLOW_COPY_AND_ASSIGN(PrefServiceSyncable);
    113 };
    114 
    115 #endif  // CHROME_BROWSER_PREFS_PREF_SERVICE_SYNCABLE_H_
    116