Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: chrome/browser/sync/sync_prefs.cc

Issue 9500005: Add a declarative way in c/b/s/sync_prefs.cc to say which data types have prefs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: akalin comments Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync/sync_prefs.h" 5 #include "chrome/browser/sync/sync_prefs.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/string_number_conversions.h" 8 #include "base/string_number_conversions.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 #include "build/build_config.h" 10 #include "build/build_config.h"
11 #include "chrome/browser/prefs/pref_service.h" 11 #include "chrome/browser/prefs/pref_service.h"
12 #include "chrome/common/chrome_notification_types.h" 12 #include "chrome/common/chrome_notification_types.h"
13 #include "chrome/common/pref_names.h" 13 #include "chrome/common/pref_names.h"
14 #include "content/public/browser/notification_details.h" 14 #include "content/public/browser/notification_details.h"
15 #include "content/public/browser/notification_source.h" 15 #include "content/public/browser/notification_source.h"
16 16
17 namespace browser_sync { 17 namespace browser_sync {
18 18
19 SyncPrefObserver::~SyncPrefObserver() {} 19 SyncPrefObserver::~SyncPrefObserver() {}
20 20
21 SyncPrefs::SyncPrefs(PrefService* pref_service) 21 SyncPrefs::SyncPrefs(PrefService* pref_service)
22 : pref_service_(pref_service) { 22 : pref_service_(pref_service) {
23 RegisterDependentTypes();
23 if (pref_service_) { 24 if (pref_service_) {
24 RegisterPreferences(); 25 RegisterPreferences();
25 // Watch the preference that indicates sync is managed so we can take 26 // Watch the preference that indicates sync is managed so we can take
26 // appropriate action. 27 // appropriate action.
27 pref_sync_managed_.Init(prefs::kSyncManaged, pref_service_, this); 28 pref_sync_managed_.Init(prefs::kSyncManaged, pref_service_, this);
28 } 29 }
29 } 30 }
30 31
31 SyncPrefs::~SyncPrefs() { 32 SyncPrefs::~SyncPrefs() {
32 DCHECK(non_thread_safe_.CalledOnValidThread()); 33 DCHECK(non_thread_safe_.CalledOnValidThread());
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 keep_everything_synced); 118 keep_everything_synced);
118 } 119 }
119 120
120 syncable::ModelTypeSet SyncPrefs::GetPreferredDataTypes( 121 syncable::ModelTypeSet SyncPrefs::GetPreferredDataTypes(
121 syncable::ModelTypeSet registered_types) const { 122 syncable::ModelTypeSet registered_types) const {
122 DCHECK(non_thread_safe_.CalledOnValidThread()); 123 DCHECK(non_thread_safe_.CalledOnValidThread());
123 if (!pref_service_) { 124 if (!pref_service_) {
124 return syncable::ModelTypeSet(); 125 return syncable::ModelTypeSet();
125 } 126 }
126 127
127 // First remove any datatypes that are inconsistent with the current 128 // First remove any datatypes that are inconsistent with the current policies
128 // policies on the client. 129 // on the client (so that "keep everything synced" doesn't include them).
129 if (pref_service_->HasPrefPath(prefs::kSavingBrowserHistoryDisabled) && 130 if (pref_service_->HasPrefPath(prefs::kSavingBrowserHistoryDisabled) &&
akalin 2012/03/01 07:40:59 Hmm...I'm a bit bothered by the fact that we filte
130 pref_service_->GetBoolean(prefs::kSavingBrowserHistoryDisabled)) { 131 pref_service_->GetBoolean(prefs::kSavingBrowserHistoryDisabled)) {
131 registered_types.Remove(syncable::TYPED_URLS); 132 registered_types.Remove(syncable::TYPED_URLS);
132 } 133 }
133 134
134 if (pref_service_->GetBoolean(prefs::kSyncKeepEverythingSynced)) { 135 if (pref_service_->GetBoolean(prefs::kSyncKeepEverythingSynced)) {
135 return registered_types; 136 return registered_types;
136 } 137 }
137 138
138 // Remove autofill_profile since it's controlled by autofill, and
139 // search_engines since it's controlled by preferences (see code below).
140 syncable::ModelTypeSet user_selectable_types(registered_types);
141 DCHECK(!user_selectable_types.Has(syncable::NIGORI));
142 user_selectable_types.Remove(syncable::AUTOFILL_PROFILE);
143 user_selectable_types.Remove(syncable::SEARCH_ENGINES);
144
145 // Remove app_notifications since it's controlled by apps (see
146 // code below).
147 // TODO(akalin): Centralize notion of all user selectable data types.
148 user_selectable_types.Remove(syncable::APP_NOTIFICATIONS);
149
150 syncable::ModelTypeSet preferred_types; 139 syncable::ModelTypeSet preferred_types;
151 140 for (syncable::ModelTypeSet::Iterator it = registered_types.First();
152 for (syncable::ModelTypeSet::Iterator it = user_selectable_types.First();
153 it.Good(); it.Inc()) { 141 it.Good(); it.Inc()) {
154 if (GetDataTypePreferred(it.Get())) { 142 if (GetDataTypePreferred(it.Get())) {
155 preferred_types.Put(it.Get()); 143 preferred_types.Put(it.Get());
156 } 144 }
157 } 145 }
158 146 return ResolveDependentTypes(registered_types, preferred_types);
159 // Group the enabled/disabled state of autofill_profile with autofill, and
160 // search_engines with preferences (since only autofill and preferences are
161 // shown on the UI).
162 if (registered_types.Has(syncable::AUTOFILL) &&
163 registered_types.Has(syncable::AUTOFILL_PROFILE) &&
164 GetDataTypePreferred(syncable::AUTOFILL)) {
165 preferred_types.Put(syncable::AUTOFILL_PROFILE);
166 }
167 if (registered_types.Has(syncable::PREFERENCES) &&
168 registered_types.Has(syncable::SEARCH_ENGINES) &&
169 GetDataTypePreferred(syncable::PREFERENCES)) {
170 preferred_types.Put(syncable::SEARCH_ENGINES);
171 }
172
173 // Set app_notifications to the same enabled/disabled state as
174 // apps (since only apps is shown on the UI).
175 if (registered_types.Has(syncable::APPS) &&
176 registered_types.Has(syncable::APP_NOTIFICATIONS) &&
177 GetDataTypePreferred(syncable::APPS)) {
178 preferred_types.Put(syncable::APP_NOTIFICATIONS);
179 }
180
181 return preferred_types;
182 } 147 }
183 148
184 void SyncPrefs::SetPreferredDataTypes( 149 void SyncPrefs::SetPreferredDataTypes(
185 syncable::ModelTypeSet registered_types, 150 syncable::ModelTypeSet registered_types,
186 syncable::ModelTypeSet preferred_types) { 151 syncable::ModelTypeSet preferred_types) {
187 DCHECK(non_thread_safe_.CalledOnValidThread()); 152 DCHECK(non_thread_safe_.CalledOnValidThread());
188 CHECK(pref_service_); 153 CHECK(pref_service_);
189 DCHECK(registered_types.HasAll(preferred_types)); 154 DCHECK(registered_types.HasAll(preferred_types));
190 syncable::ModelTypeSet preferred_types_with_dependents(preferred_types); 155 preferred_types = ResolveDependentTypes(registered_types, preferred_types);
191 // Set autofill_profile to the same enabled/disabled state as
192 // autofill (since only autofill is shown in the UI).
193 if (registered_types.Has(syncable::AUTOFILL) &&
194 registered_types.Has(syncable::AUTOFILL_PROFILE)) {
195 if (preferred_types_with_dependents.Has(syncable::AUTOFILL)) {
196 preferred_types_with_dependents.Put(syncable::AUTOFILL_PROFILE);
197 } else {
198 preferred_types_with_dependents.Remove(syncable::AUTOFILL_PROFILE);
199 }
200 }
201 // Set app_notifications to the same enabled/disabled state as
202 // apps (since only apps is shown in the UI).
203 if (registered_types.Has(syncable::APPS) &&
204 registered_types.Has(syncable::APP_NOTIFICATIONS)) {
205 if (preferred_types_with_dependents.Has(syncable::APPS)) {
206 preferred_types_with_dependents.Put(syncable::APP_NOTIFICATIONS);
207 } else {
208 preferred_types_with_dependents.Remove(syncable::APP_NOTIFICATIONS);
209 }
210 }
211 // Set search_engines to the same enabled/disabled state as
212 // preferences (since only preferences is shown in the UI).
213 if (registered_types.Has(syncable::PREFERENCES) &&
214 registered_types.Has(syncable::SEARCH_ENGINES)) {
215 if (preferred_types_with_dependents.Has(syncable::PREFERENCES)) {
216 preferred_types_with_dependents.Put(syncable::SEARCH_ENGINES);
217 } else {
218 preferred_types_with_dependents.Remove(syncable::SEARCH_ENGINES);
219 }
220 }
221
222 for (syncable::ModelTypeSet::Iterator it = registered_types.First(); 156 for (syncable::ModelTypeSet::Iterator it = registered_types.First();
223 it.Good(); it.Inc()) { 157 it.Good(); it.Inc()) {
224 SetDataTypePreferred( 158 SetDataTypePreferred(it.Get(), preferred_types.Has(it.Get()));
225 it.Get(), preferred_types_with_dependents.Has(it.Get()));
226 } 159 }
227 } 160 }
228 161
229 bool SyncPrefs::IsManaged() const { 162 bool SyncPrefs::IsManaged() const {
230 DCHECK(non_thread_safe_.CalledOnValidThread()); 163 DCHECK(non_thread_safe_.CalledOnValidThread());
231 return pref_service_ && pref_service_->GetBoolean(prefs::kSyncManaged); 164 return pref_service_ && pref_service_->GetBoolean(prefs::kSyncManaged);
232 } 165 }
233 166
234 std::string SyncPrefs::GetEncryptionBootstrapToken() const { 167 std::string SyncPrefs::GetEncryptionBootstrapToken() const {
235 DCHECK(non_thread_safe_.CalledOnValidThread()); 168 DCHECK(non_thread_safe_.CalledOnValidThread());
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 return prefs::kSyncAppNotifications; 331 return prefs::kSyncAppNotifications;
399 default: 332 default:
400 break; 333 break;
401 } 334 }
402 NOTREACHED(); 335 NOTREACHED();
403 return NULL; 336 return NULL;
404 } 337 }
405 338
406 } // namespace 339 } // namespace
407 340
341 void SyncPrefs::RegisterDependentTypes() {
342 dependent_types_[syncable::APP_NOTIFICATIONS] = syncable::APPS;
343 dependent_types_[syncable::APP_SETTINGS] = syncable::APPS;
344 dependent_types_[syncable::AUTOFILL_PROFILE] = syncable::AUTOFILL;
345 dependent_types_[syncable::EXTENSION_SETTINGS] = syncable::EXTENSIONS;
346 dependent_types_[syncable::SEARCH_ENGINES] = syncable::PREFERENCES;
347 }
348
408 void SyncPrefs::RegisterPreferences() { 349 void SyncPrefs::RegisterPreferences() {
409 DCHECK(non_thread_safe_.CalledOnValidThread()); 350 DCHECK(non_thread_safe_.CalledOnValidThread());
410 CHECK(pref_service_); 351 CHECK(pref_service_);
411 if (pref_service_->FindPreference(prefs::kSyncLastSyncedTime)) { 352 if (pref_service_->FindPreference(prefs::kSyncLastSyncedTime)) {
412 return; 353 return;
413 } 354 }
414 355
415 pref_service_->RegisterBooleanPref(prefs::kSyncHasSetupCompleted, 356 pref_service_->RegisterBooleanPref(prefs::kSyncHasSetupCompleted,
416 false, 357 false,
417 PrefService::UNSYNCABLE_PREF); 358 PrefService::UNSYNCABLE_PREF);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 DCHECK(non_thread_safe_.CalledOnValidThread()); 452 DCHECK(non_thread_safe_.CalledOnValidThread());
512 CHECK(pref_service_); 453 CHECK(pref_service_);
513 const char* pref_name = GetPrefNameForDataType(type); 454 const char* pref_name = GetPrefNameForDataType(type);
514 if (!pref_name) { 455 if (!pref_name) {
515 NOTREACHED(); 456 NOTREACHED();
516 return; 457 return;
517 } 458 }
518 pref_service_->SetBoolean(pref_name, is_preferred); 459 pref_service_->SetBoolean(pref_name, is_preferred);
519 } 460 }
520 461
462 syncable::ModelTypeSet SyncPrefs::ResolveDependentTypes(
463 const syncable::ModelTypeSet& registered_types,
akalin 2012/03/01 07:40:59 don't use refs for ModelTypeSet (they're <64 bits)
not at google - send to devlin 2012/03/01 23:39:36 Done.
464 const syncable::ModelTypeSet& types) const {
465 DCHECK(registered_types.HasAll(types));
466 syncable::ModelTypeSet with_dependent_types(types);
akalin 2012/03/01 07:40:59 I think we still want to first remove the types in
not at google - send to devlin 2012/03/01 23:39:36 Done (the equivalent of).
467 for (DependentTypesMap::const_iterator i = dependent_types_.begin();
468 i != dependent_types_.end(); ++i) {
469 if (types.Has(i->second) && registered_types.Has(i->first))
470 with_dependent_types.Put(i->first);
471 }
472 return with_dependent_types;
473 }
474
521 } // namespace browser_sync 475 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698