Chromium Code Reviews| 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 if (pref_service_) { | 23 if (pref_service_) { |
| 24 RegisterDeterminedTypes(); | |
|
akalin
2012/02/29 05:33:03
this doesn't need to be in the if statement
not at google - send to devlin
2012/03/01 03:14:40
Done.
| |
| 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()); |
| 33 } | 34 } |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 128 // policies on the client. | 129 // policies on the client. |
| 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); | 139 syncable::ModelTypeSet user_selectable_types(registered_types); |
| 141 DCHECK(!user_selectable_types.Has(syncable::NIGORI)); | 140 DCHECK(!user_selectable_types.Has(syncable::NIGORI)); |
| 142 user_selectable_types.Remove(syncable::AUTOFILL_PROFILE); | |
| 143 user_selectable_types.Remove(syncable::SEARCH_ENGINES); | |
| 144 | 141 |
| 145 // Remove app_notifications since it's controlled by apps (see | 142 // Remove any data types whose prefs depend on other types (will be added |
|
akalin
2012/02/29 05:33:03
with ApplyTypeDependencies as described in the com
| |
| 146 // code below). | 143 // below if applicable). |
| 147 // TODO(akalin): Centralize notion of all user selectable data types. | 144 for (TypesDeterminedByMap::const_iterator i = types_determined_by_.begin(); |
| 148 user_selectable_types.Remove(syncable::APP_NOTIFICATIONS); | 145 i != types_determined_by_.end(); ++i) { |
| 146 user_selectable_types.Remove(i->first); | |
| 147 } | |
| 149 | 148 |
| 150 syncable::ModelTypeSet preferred_types; | 149 syncable::ModelTypeSet preferred_types; |
| 151 | 150 |
| 152 for (syncable::ModelTypeSet::Iterator it = user_selectable_types.First(); | 151 for (syncable::ModelTypeSet::Iterator it = user_selectable_types.First(); |
| 153 it.Good(); it.Inc()) { | 152 it.Good(); it.Inc()) { |
| 154 if (GetDataTypePreferred(it.Get())) { | 153 if (GetDataTypePreferred(it.Get())) { |
| 155 preferred_types.Put(it.Get()); | 154 preferred_types.Put(it.Get()); |
| 156 } | 155 } |
| 157 } | 156 } |
| 158 | 157 |
| 159 // Group the enabled/disabled state of autofill_profile with autofill, and | 158 // Add any determined types if what they're determined by has been added. |
| 160 // search_engines with preferences (since only autofill and preferences are | 159 for (TypesDeterminedByMap::const_iterator i = types_determined_by_.begin(); |
| 161 // shown on the UI). | 160 i != types_determined_by_.end(); ++i) { |
| 162 if (registered_types.Has(syncable::AUTOFILL) && | 161 if (registered_types.Has(i->first) && |
| 163 registered_types.Has(syncable::AUTOFILL_PROFILE) && | 162 registered_types.Has(i->second) && |
| 164 GetDataTypePreferred(syncable::AUTOFILL)) { | 163 GetDataTypePreferred(i->second)) { |
| 165 preferred_types.Put(syncable::AUTOFILL_PROFILE); | 164 preferred_types.Put(i->first); |
| 166 } | 165 } |
| 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 } | 166 } |
| 180 | 167 |
| 181 return preferred_types; | 168 return preferred_types; |
| 182 } | 169 } |
| 183 | 170 |
| 184 void SyncPrefs::SetPreferredDataTypes( | 171 void SyncPrefs::SetPreferredDataTypes( |
| 185 syncable::ModelTypeSet registered_types, | 172 syncable::ModelTypeSet registered_types, |
| 186 syncable::ModelTypeSet preferred_types) { | 173 syncable::ModelTypeSet preferred_types) { |
| 187 DCHECK(non_thread_safe_.CalledOnValidThread()); | 174 DCHECK(non_thread_safe_.CalledOnValidThread()); |
| 188 CHECK(pref_service_); | 175 CHECK(pref_service_); |
| 189 DCHECK(registered_types.HasAll(preferred_types)); | 176 DCHECK(registered_types.HasAll(preferred_types)); |
| 190 syncable::ModelTypeSet preferred_types_with_dependents(preferred_types); | 177 syncable::ModelTypeSet preferred_types_with_dependents(preferred_types); |
| 191 // Set autofill_profile to the same enabled/disabled state as | 178 |
| 192 // autofill (since only autofill is shown in the UI). | 179 // Set the pref of any determined types to the pref of what they are |
| 193 if (registered_types.Has(syncable::AUTOFILL) && | 180 // determined by. |
| 194 registered_types.Has(syncable::AUTOFILL_PROFILE)) { | 181 for (TypesDeterminedByMap::const_iterator i = types_determined_by_.begin(); |
| 195 if (preferred_types_with_dependents.Has(syncable::AUTOFILL)) { | 182 i != types_determined_by_.end(); ++i) { |
|
akalin
2012/02/29 05:33:03
this is almost the same logic as in GetPreferredDa
| |
| 196 preferred_types_with_dependents.Put(syncable::AUTOFILL_PROFILE); | 183 if (registered_types.Has(i->first) && |
| 197 } else { | 184 registered_types.Has(i->second)) { |
| 198 preferred_types_with_dependents.Remove(syncable::AUTOFILL_PROFILE); | 185 if (preferred_types.Has(i->second)) |
| 199 } | 186 preferred_types_with_dependents.Put(i->first); |
| 200 } | 187 else |
| 201 // Set app_notifications to the same enabled/disabled state as | 188 preferred_types_with_dependents.Remove(i->first); |
| 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 } | 189 } |
| 220 } | 190 } |
| 221 | 191 |
| 222 for (syncable::ModelTypeSet::Iterator it = registered_types.First(); | 192 for (syncable::ModelTypeSet::Iterator it = registered_types.First(); |
| 223 it.Good(); it.Inc()) { | 193 it.Good(); it.Inc()) { |
| 224 SetDataTypePreferred( | 194 SetDataTypePreferred( |
| 225 it.Get(), preferred_types_with_dependents.Has(it.Get())); | 195 it.Get(), preferred_types_with_dependents.Has(it.Get())); |
| 226 } | 196 } |
| 227 } | 197 } |
| 228 | 198 |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 398 return prefs::kSyncAppNotifications; | 368 return prefs::kSyncAppNotifications; |
| 399 default: | 369 default: |
| 400 break; | 370 break; |
| 401 } | 371 } |
| 402 NOTREACHED(); | 372 NOTREACHED(); |
| 403 return NULL; | 373 return NULL; |
| 404 } | 374 } |
| 405 | 375 |
| 406 } // namespace | 376 } // namespace |
| 407 | 377 |
| 378 void SyncPrefs::RegisterDeterminedTypes() { | |
| 379 types_determined_by_[syncable::APP_NOTIFICATIONS] = syncable::APPS; | |
| 380 types_determined_by_[syncable::APP_SETTINGS] = syncable::APPS; | |
| 381 types_determined_by_[syncable::AUTOFILL_PROFILE] = syncable::AUTOFILL; | |
| 382 types_determined_by_[syncable::EXTENSION_SETTINGS] = syncable::EXTENSIONS; | |
| 383 types_determined_by_[syncable::SEARCH_ENGINES] = syncable::PREFERENCES; | |
| 384 } | |
| 385 | |
| 408 void SyncPrefs::RegisterPreferences() { | 386 void SyncPrefs::RegisterPreferences() { |
| 409 DCHECK(non_thread_safe_.CalledOnValidThread()); | 387 DCHECK(non_thread_safe_.CalledOnValidThread()); |
| 410 CHECK(pref_service_); | 388 CHECK(pref_service_); |
| 411 if (pref_service_->FindPreference(prefs::kSyncLastSyncedTime)) { | 389 if (pref_service_->FindPreference(prefs::kSyncLastSyncedTime)) { |
| 412 return; | 390 return; |
| 413 } | 391 } |
| 414 | 392 |
| 415 pref_service_->RegisterBooleanPref(prefs::kSyncHasSetupCompleted, | 393 pref_service_->RegisterBooleanPref(prefs::kSyncHasSetupCompleted, |
| 416 false, | 394 false, |
| 417 PrefService::UNSYNCABLE_PREF); | 395 PrefService::UNSYNCABLE_PREF); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 452 false, | 430 false, |
| 453 PrefService::UNSYNCABLE_PREF); | 431 PrefService::UNSYNCABLE_PREF); |
| 454 pref_service_->RegisterStringPref(prefs::kSyncEncryptionBootstrapToken, | 432 pref_service_->RegisterStringPref(prefs::kSyncEncryptionBootstrapToken, |
| 455 "", | 433 "", |
| 456 PrefService::UNSYNCABLE_PREF); | 434 PrefService::UNSYNCABLE_PREF); |
| 457 | 435 |
| 458 // We will start prompting people about new data types after the launch of | 436 // We will start prompting people about new data types after the launch of |
| 459 // SESSIONS - all previously launched data types are treated as if they are | 437 // SESSIONS - all previously launched data types are treated as if they are |
| 460 // already acknowledged. | 438 // already acknowledged. |
| 461 syncable::ModelTypeSet model_set; | 439 syncable::ModelTypeSet model_set; |
| 440 model_set.Put(syncable::APPS); | |
| 441 model_set.Put(syncable::APP_SETTINGS); | |
|
akalin
2012/02/29 05:33:03
don't add new types -- see comment above definitio
not at google - send to devlin
2012/03/01 03:14:40
Oh, right. I was wondering what that comment meant
| |
| 442 model_set.Put(syncable::AUTOFILL); | |
| 443 model_set.Put(syncable::AUTOFILL_PROFILE); | |
| 462 model_set.Put(syncable::BOOKMARKS); | 444 model_set.Put(syncable::BOOKMARKS); |
| 445 model_set.Put(syncable::EXTENSIONS); | |
| 446 model_set.Put(syncable::EXTENSION_SETTINGS); | |
| 447 model_set.Put(syncable::NIGORI); | |
| 448 model_set.Put(syncable::PASSWORDS); | |
| 463 model_set.Put(syncable::PREFERENCES); | 449 model_set.Put(syncable::PREFERENCES); |
| 464 model_set.Put(syncable::PASSWORDS); | 450 model_set.Put(syncable::SEARCH_ENGINES); |
| 465 model_set.Put(syncable::AUTOFILL_PROFILE); | 451 model_set.Put(syncable::SESSIONS); |
| 466 model_set.Put(syncable::AUTOFILL); | |
| 467 model_set.Put(syncable::THEMES); | 452 model_set.Put(syncable::THEMES); |
| 468 model_set.Put(syncable::EXTENSIONS); | |
| 469 model_set.Put(syncable::NIGORI); | |
| 470 model_set.Put(syncable::SEARCH_ENGINES); | |
| 471 model_set.Put(syncable::APPS); | |
| 472 model_set.Put(syncable::TYPED_URLS); | 453 model_set.Put(syncable::TYPED_URLS); |
| 473 model_set.Put(syncable::SESSIONS); | |
| 474 pref_service_->RegisterListPref(prefs::kSyncAcknowledgedSyncTypes, | 454 pref_service_->RegisterListPref(prefs::kSyncAcknowledgedSyncTypes, |
| 475 syncable::ModelTypeSetToValue(model_set), | 455 syncable::ModelTypeSetToValue(model_set), |
| 476 PrefService::UNSYNCABLE_PREF); | 456 PrefService::UNSYNCABLE_PREF); |
| 477 | 457 |
| 478 pref_service_->RegisterDictionaryPref(prefs::kSyncMaxInvalidationVersions, | 458 pref_service_->RegisterDictionaryPref(prefs::kSyncMaxInvalidationVersions, |
| 479 PrefService::UNSYNCABLE_PREF); | 459 PrefService::UNSYNCABLE_PREF); |
| 480 } | 460 } |
| 481 | 461 |
| 482 void SyncPrefs::RegisterDataTypePreferredPref(syncable::ModelType type, | 462 void SyncPrefs::RegisterDataTypePreferredPref(syncable::ModelType type, |
| 483 bool is_preferred) { | 463 bool is_preferred) { |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 512 CHECK(pref_service_); | 492 CHECK(pref_service_); |
| 513 const char* pref_name = GetPrefNameForDataType(type); | 493 const char* pref_name = GetPrefNameForDataType(type); |
| 514 if (!pref_name) { | 494 if (!pref_name) { |
| 515 NOTREACHED(); | 495 NOTREACHED(); |
| 516 return; | 496 return; |
| 517 } | 497 } |
| 518 pref_service_->SetBoolean(pref_name, is_preferred); | 498 pref_service_->SetBoolean(pref_name, is_preferred); |
| 519 } | 499 } |
| 520 | 500 |
| 521 } // namespace browser_sync | 501 } // namespace browser_sync |
| OLD | NEW |