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