- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / prefs / pref_service_syncable.h
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_