12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_PREFS_PREF_SERVICE_SYNCABLE_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_PREFS_PREF_SERVICE_SYNCABLE_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_model_associator.h"
104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/browser/prefs/synced_pref_observer.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefServiceSyncableObserver;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile;
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace syncer {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SyncableService;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A PrefService that can be synced. Users are forced to declare
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// whether preferences are syncable or not when registering them to
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// this PrefService.
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefServiceSyncable : public PrefService {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PrefServiceSyncable is a PrefService with added integration for
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sync, and knowledge of how to create an incognito
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PrefService. For code that does not need to know about the sync
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // integration, you should use only the plain PrefService type.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For this reason, Profile does not expose an accessor for the
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PrefServiceSyncable type. Instead, you can use the utilities
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // below to retrieve the PrefServiceSyncable (or its incognito
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // version) from a Profile.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static PrefServiceSyncable* FromProfile(Profile* profile);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static PrefServiceSyncable* IncognitoFromProfile(Profile* profile);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // You may wish to use PrefServiceBuilder or one of its subclasses
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for simplified construction.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefServiceSyncable(
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefNotifierImpl* pref_notifier,
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefValueStore* pref_value_store,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PersistentPrefStore* user_prefs,
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable* pref_registry,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Callback<void(PersistentPrefStore::PrefReadError)>
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          read_error_callback,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool async);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~PrefServiceSyncable();
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates an incognito copy of the pref service that shares most pref stores
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but uses a fresh non-persistent overlay for the user pref store and an
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // individual extension pref store (to cache the effective extension prefs for
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // incognito windows).
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefServiceSyncable* CreateIncognitoPrefService(
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefStore* incognito_extension_prefs);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if preferences state has synchronized with the remote
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // preferences. If true is returned it can be assumed the local preferences
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // has applied changes from the remote preferences. The two may not be
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // identical if a change is in flight (from either side).
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(albertb): Given that we now support priority preferences, callers of
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // this method are likely better off making the preferences they care about
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // into priority preferences and calling IsPrioritySyncing().
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsSyncing();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if priority preferences state has synchronized with the remote
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // priority preferences.
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool IsPrioritySyncing();
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Returns true if the pref under the given name is pulled down from sync.
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note this does not refer to SYNCABLE_PREF.
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool IsPrefSynced(const std::string& name) const;
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddObserver(PrefServiceSyncableObserver* observer);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveObserver(PrefServiceSyncableObserver* observer);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(zea): Have PrefServiceSyncable implement
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // syncer::SyncableService directly.
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  syncer::SyncableService* GetSyncableService(const syncer::ModelType& type);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do not call this after having derived an incognito or per tab pref service.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UpdateCommandLinePrefStore(PrefStore* cmd_line_store) OVERRIDE;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void AddSyncedPrefObserver(const std::string& name,
854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                             SyncedPrefObserver* observer);
864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void RemoveSyncedPrefObserver(const std::string& name,
874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                SyncedPrefObserver* observer);
884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class PrefModelAssociator;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AddRegisteredSyncablePreference(
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const char* path,
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const user_prefs::PrefRegistrySyncable::PrefSyncStatus sync_status);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Invoked internally when the IsSyncing() state changes.
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnIsSyncingChanged();
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Process a local preference change. This can trigger new SyncChanges being
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // sent to the syncer.
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ProcessPrefChange(const std::string& name);
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether CreateIncognitoPrefService() has been called to create a
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // "forked" PrefService.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool pref_service_forked_;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefModelAssociator pref_sync_associator_;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PrefModelAssociator priority_pref_sync_associator_;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ObserverList<PrefServiceSyncableObserver> observer_list_;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrefServiceSyncable);
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_PREFS_PREF_SERVICE_SYNCABLE_H_
116