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