OLD | NEW |
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 RegisterPrefGroups(); |
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 Loading... |
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) && |
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 ResolvePrefGroups(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 = ResolvePrefGroups(registered_types, preferred_types); |
191 // Set autofill_profile to the same enabled/disabled state as | 156 for (syncable::ModelTypeSet::Iterator i = registered_types.First(); |
192 // autofill (since only autofill is shown in the UI). | 157 i.Good(); i.Inc()) { |
193 if (registered_types.Has(syncable::AUTOFILL) && | 158 SetDataTypePreferred(i.Get(), preferred_types.Has(i.Get())); |
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(); | |
223 it.Good(); it.Inc()) { | |
224 SetDataTypePreferred( | |
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 Loading... |
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::RegisterPrefGroups() { |
| 342 pref_groups_[syncable::APPS].Put(syncable::APP_NOTIFICATIONS); |
| 343 pref_groups_[syncable::APPS].Put(syncable::APP_SETTINGS); |
| 344 |
| 345 pref_groups_[syncable::AUTOFILL].Put(syncable::AUTOFILL_PROFILE); |
| 346 |
| 347 pref_groups_[syncable::EXTENSIONS].Put(syncable::EXTENSION_SETTINGS); |
| 348 |
| 349 pref_groups_[syncable::PREFERENCES].Put(syncable::SEARCH_ENGINES); |
| 350 } |
| 351 |
408 void SyncPrefs::RegisterPreferences() { | 352 void SyncPrefs::RegisterPreferences() { |
409 DCHECK(non_thread_safe_.CalledOnValidThread()); | 353 DCHECK(non_thread_safe_.CalledOnValidThread()); |
410 CHECK(pref_service_); | 354 CHECK(pref_service_); |
411 if (pref_service_->FindPreference(prefs::kSyncLastSyncedTime)) { | 355 if (pref_service_->FindPreference(prefs::kSyncLastSyncedTime)) { |
412 return; | 356 return; |
413 } | 357 } |
414 | 358 |
415 pref_service_->RegisterBooleanPref(prefs::kSyncHasSetupCompleted, | 359 pref_service_->RegisterBooleanPref(prefs::kSyncHasSetupCompleted, |
416 false, | 360 false, |
417 PrefService::UNSYNCABLE_PREF); | 361 PrefService::UNSYNCABLE_PREF); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 DCHECK(non_thread_safe_.CalledOnValidThread()); | 455 DCHECK(non_thread_safe_.CalledOnValidThread()); |
512 CHECK(pref_service_); | 456 CHECK(pref_service_); |
513 const char* pref_name = GetPrefNameForDataType(type); | 457 const char* pref_name = GetPrefNameForDataType(type); |
514 if (!pref_name) { | 458 if (!pref_name) { |
515 NOTREACHED(); | 459 NOTREACHED(); |
516 return; | 460 return; |
517 } | 461 } |
518 pref_service_->SetBoolean(pref_name, is_preferred); | 462 pref_service_->SetBoolean(pref_name, is_preferred); |
519 } | 463 } |
520 | 464 |
| 465 syncable::ModelTypeSet SyncPrefs::ResolvePrefGroups( |
| 466 syncable::ModelTypeSet registered_types, |
| 467 syncable::ModelTypeSet types) const { |
| 468 DCHECK(registered_types.HasAll(types)); |
| 469 syncable::ModelTypeSet types_with_groups = types; |
| 470 for (PrefGroupsMap::const_iterator i = pref_groups_.begin(); |
| 471 i != pref_groups_.end(); ++i) { |
| 472 if (types.Has(i->first)) |
| 473 types_with_groups.PutAll(i->second); |
| 474 else |
| 475 types_with_groups.RemoveAll(i->second); |
| 476 } |
| 477 types_with_groups.RetainAll(registered_types); |
| 478 return types_with_groups; |
| 479 } |
| 480 |
521 } // namespace browser_sync | 481 } // namespace browser_sync |
OLD | NEW |