1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// Use of this source code is governed by a BSD-style license that can be 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// found in the LICENSE file. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#ifndef CHROME_BROWSER_PREFS_PREF_MODEL_ASSOCIATOR_H_ 6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#define CHROME_BROWSER_PREFS_PREF_MODEL_ASSOCIATOR_H_ 7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <map> 9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <set> 10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <string> 11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include "base/basictypes.h" 13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include "base/compiler_specific.h" 14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include "base/containers/hash_tables.h" 15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include "base/gtest_prod_util.h" 16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include "base/observer_list.h" 17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include "base/threading/non_thread_safe.h" 18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include "chrome/browser/prefs/synced_pref_observer.h" 19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include "sync/api/sync_data.h" 20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include "sync/api/syncable_service.h" 21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoclass PrefRegistrySyncable; 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoclass PrefServiceSyncable; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratonamespace sync_pb { 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoclass PreferenceSpecifics; 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratonamespace base { 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoclass Value; 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// Contains all preference sync related logic. 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// TODO(sync): Merge this into PrefService once we separate the profile 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// PrefService from the local state PrefService. 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoclass PrefModelAssociator 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato : public syncer::SyncableService, 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public base::NonThreadSafe { 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public: 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato explicit PrefModelAssociator(syncer::ModelType type); 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato virtual ~PrefModelAssociator(); 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // See description above field for details. 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bool models_associated() const { return models_associated_; } 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // syncer::SyncableService implementation. 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato virtual syncer::SyncDataList GetAllSyncData( 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato syncer::ModelType type) const OVERRIDE; 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato virtual syncer::SyncError ProcessSyncChanges( 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const tracked_objects::Location& from_here, 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const syncer::SyncChangeList& change_list) OVERRIDE; 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato virtual syncer::SyncMergeResult MergeDataAndStartSyncing( 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato syncer::ModelType type, 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const syncer::SyncDataList& initial_sync_data, 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato scoped_ptr<syncer::SyncChangeProcessor> sync_processor, 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato scoped_ptr<syncer::SyncErrorFactory> sync_error_factory) OVERRIDE; 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato virtual void StopSyncing(syncer::ModelType type) OVERRIDE; 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Returns the list of preference names that are registered as syncable, and 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // hence should be monitored for changes. 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato std::set<std::string> registered_preferences() const; 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Register a preference with the specified name for syncing. We do not care 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // about the type at registration time, but when changes arrive from the 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // syncer, we check if they can be applied and if not drop them. 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Note: This should only be called at profile startup time (before sync 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // begins). 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato virtual void RegisterPref(const char* name); 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Returns true if the specified preference is registered for syncing. 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato virtual bool IsPrefRegistered(const char* name); 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Process a local preference change. This can trigger new SyncChanges being 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // sent to the syncer. 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato virtual void ProcessPrefChange(const std::string& name); 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato void SetPrefService(PrefServiceSyncable* pref_service); 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Merges the local_value into the supplied server_value and returns 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // the result (caller takes ownership). If there is a conflict, the server 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // value always takes precedence. Note that only certain preferences will 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // actually be merged, all others will return a copy of the server value. See 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // the method's implementation for details. 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato static scoped_ptr<base::Value> MergePreference( 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const std::string& name, 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const base::Value& local_value, 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const base::Value& server_value); 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fills |sync_data| with a sync representation of the preference data 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // provided. 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bool CreatePrefSyncData(const std::string& name, 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const base::Value& value, 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato syncer::SyncData* sync_data) const; 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Extract preference value from sync specifics. 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato base::Value* ReadPreferenceSpecifics( 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const sync_pb::PreferenceSpecifics& specifics); 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Returns true if the pref under the given name is pulled down from sync. 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Note this does not refer to SYNCABLE_PREF. 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bool IsPrefSynced(const std::string& name) const; 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Adds a SyncedPrefObserver to watch for changes to a specific pref. 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato void AddSyncedPrefObserver(const std::string& name, 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato SyncedPrefObserver* observer); 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Removes a SyncedPrefObserver from a pref's list of observers. 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato void RemoveSyncedPrefObserver(const std::string& name, 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato SyncedPrefObserver* observer); 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected: 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato friend class PrefsSyncableServiceTest; 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato typedef std::map<std::string, syncer::SyncData> SyncDataMap; 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create an association for a given preference. If |sync_pref| is valid, 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // signifying that sync has data for this preference, we reconcile their data 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // with ours and append a new UPDATE SyncChange to |sync_changes|. If 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // sync_pref is not set, we append an ADD SyncChange to |sync_changes| with 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // the current preference data. 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // |migrated_preference_list| points to a vector that may be updated with a 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // string containing the old name of the preference described by |pref_name|. 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Note: We do not modify the sync data for preferences that are either 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // controlled by policy (are not user modifiable) or have their default value 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // (are not user controlled). 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato void InitPrefAndAssociate(const syncer::SyncData& sync_pref, 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const std::string& pref_name, 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato syncer::SyncChangeList* sync_changes, 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato SyncDataMap* migrated_preference_list); 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato static base::Value* MergeListValues( 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const base::Value& from_value, const base::Value& to_value); 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato static base::Value* MergeDictionaryValues(const base::Value& from_value, 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const base::Value& to_value); 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Returns whether a given preference name is a new name of a migrated 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // preference. Exposed here for testing. 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato static bool IsMigratedPreference(const char* preference_name); 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato static bool IsOldMigratedPreference(const char* old_preference_name); 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Do we have an active association between the preferences and sync models? 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set when start syncing, reset in StopSyncing. While this is not set, we 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // ignore any local preference changes (when we start syncing we will look 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // up the most recent values anyways). 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bool models_associated_; 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Whether we're currently processing changes from the syncer. While this is 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // true, we ignore any local preference changes, since we triggered them. 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bool processing_syncer_changes_; 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // A set of preference names. 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato typedef std::set<std::string> PreferenceSet; 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // All preferences that have registered as being syncable with this profile. 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato PreferenceSet registered_preferences_; 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // The preferences that are currently synced (excludes those preferences 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // that have never had sync data and currently have default values or are 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // policy controlled). 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Note: this set never decreases, only grows to eventually match 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // registered_preferences_ as more preferences are synced. It determines 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // whether a preference change should update an existing sync node or create 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // a new sync node. 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato PreferenceSet synced_preferences_; 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // The PrefService we are syncing to. 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato PrefServiceSyncable* pref_service_; 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Sync's syncer::SyncChange handler. We push all our changes through this. 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato scoped_ptr<syncer::SyncChangeProcessor> sync_processor_; 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Sync's error handler. We use this to create sync errors. 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato scoped_ptr<syncer::SyncErrorFactory> sync_error_factory_; 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // The datatype that this associator is responible for, either PREFERENCES or 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // PRIORITY_PREFERENCES. 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato syncer::ModelType type_; 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private: 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Map prefs to lists of observers. Observers will receive notification when 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // a pref changes, including the detail of whether or not the change came 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // from sync. 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato typedef ObserverList<SyncedPrefObserver> SyncedPrefObserverList; 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato typedef base::hash_map<std::string, SyncedPrefObserverList*> 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato SyncedPrefObserverMap; 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato void NotifySyncedPrefObservers(const std::string& path, bool from_sync) const; 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato SyncedPrefObserverMap synced_pref_observers_; 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato DISALLOW_COPY_AND_ASSIGN(PrefModelAssociator); 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}; 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#endif // CHROME_BROWSER_PREFS_PREF_MODEL_ASSOCIATOR_H_ 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato