Index: chrome/browser/sync/sync_prefs.cc |
diff --git a/chrome/browser/sync/sync_prefs.cc b/chrome/browser/sync/sync_prefs.cc |
index b66d7c04b6e663b8f84f2b2537047c969b3d1182..14a05ea6e1475a5b82eeb42669eaa2ba550c9154 100644 |
--- a/chrome/browser/sync/sync_prefs.cc |
+++ b/chrome/browser/sync/sync_prefs.cc |
@@ -20,6 +20,7 @@ SyncPrefObserver::~SyncPrefObserver() {} |
SyncPrefs::SyncPrefs(PrefService* pref_service) |
: pref_service_(pref_service) { |
+ RegisterPrefGroups(); |
if (pref_service_) { |
RegisterPreferences(); |
// Watch the preference that indicates sync is managed so we can take |
@@ -124,8 +125,8 @@ syncable::ModelTypeSet SyncPrefs::GetPreferredDataTypes( |
return syncable::ModelTypeSet(); |
} |
- // First remove any datatypes that are inconsistent with the current |
- // policies on the client. |
+ // First remove any datatypes that are inconsistent with the current policies |
+ // on the client (so that "keep everything synced" doesn't include them). |
if (pref_service_->HasPrefPath(prefs::kSavingBrowserHistoryDisabled) && |
pref_service_->GetBoolean(prefs::kSavingBrowserHistoryDisabled)) { |
registered_types.Remove(syncable::TYPED_URLS); |
@@ -135,50 +136,14 @@ syncable::ModelTypeSet SyncPrefs::GetPreferredDataTypes( |
return registered_types; |
} |
- // Remove autofill_profile since it's controlled by autofill, and |
- // search_engines since it's controlled by preferences (see code below). |
- syncable::ModelTypeSet user_selectable_types(registered_types); |
- DCHECK(!user_selectable_types.Has(syncable::NIGORI)); |
- user_selectable_types.Remove(syncable::AUTOFILL_PROFILE); |
- user_selectable_types.Remove(syncable::SEARCH_ENGINES); |
- |
- // Remove app_notifications since it's controlled by apps (see |
- // code below). |
- // TODO(akalin): Centralize notion of all user selectable data types. |
- user_selectable_types.Remove(syncable::APP_NOTIFICATIONS); |
- |
syncable::ModelTypeSet preferred_types; |
- |
- for (syncable::ModelTypeSet::Iterator it = user_selectable_types.First(); |
+ for (syncable::ModelTypeSet::Iterator it = registered_types.First(); |
it.Good(); it.Inc()) { |
if (GetDataTypePreferred(it.Get())) { |
preferred_types.Put(it.Get()); |
} |
} |
- |
- // Group the enabled/disabled state of autofill_profile with autofill, and |
- // search_engines with preferences (since only autofill and preferences are |
- // shown on the UI). |
- if (registered_types.Has(syncable::AUTOFILL) && |
- registered_types.Has(syncable::AUTOFILL_PROFILE) && |
- GetDataTypePreferred(syncable::AUTOFILL)) { |
- preferred_types.Put(syncable::AUTOFILL_PROFILE); |
- } |
- if (registered_types.Has(syncable::PREFERENCES) && |
- registered_types.Has(syncable::SEARCH_ENGINES) && |
- GetDataTypePreferred(syncable::PREFERENCES)) { |
- preferred_types.Put(syncable::SEARCH_ENGINES); |
- } |
- |
- // Set app_notifications to the same enabled/disabled state as |
- // apps (since only apps is shown on the UI). |
- if (registered_types.Has(syncable::APPS) && |
- registered_types.Has(syncable::APP_NOTIFICATIONS) && |
- GetDataTypePreferred(syncable::APPS)) { |
- preferred_types.Put(syncable::APP_NOTIFICATIONS); |
- } |
- |
- return preferred_types; |
+ return ResolvePrefGroups(registered_types, preferred_types); |
} |
void SyncPrefs::SetPreferredDataTypes( |
@@ -187,42 +152,10 @@ void SyncPrefs::SetPreferredDataTypes( |
DCHECK(non_thread_safe_.CalledOnValidThread()); |
CHECK(pref_service_); |
DCHECK(registered_types.HasAll(preferred_types)); |
- syncable::ModelTypeSet preferred_types_with_dependents(preferred_types); |
- // Set autofill_profile to the same enabled/disabled state as |
- // autofill (since only autofill is shown in the UI). |
- if (registered_types.Has(syncable::AUTOFILL) && |
- registered_types.Has(syncable::AUTOFILL_PROFILE)) { |
- if (preferred_types_with_dependents.Has(syncable::AUTOFILL)) { |
- preferred_types_with_dependents.Put(syncable::AUTOFILL_PROFILE); |
- } else { |
- preferred_types_with_dependents.Remove(syncable::AUTOFILL_PROFILE); |
- } |
- } |
- // Set app_notifications to the same enabled/disabled state as |
- // apps (since only apps is shown in the UI). |
- if (registered_types.Has(syncable::APPS) && |
- registered_types.Has(syncable::APP_NOTIFICATIONS)) { |
- if (preferred_types_with_dependents.Has(syncable::APPS)) { |
- preferred_types_with_dependents.Put(syncable::APP_NOTIFICATIONS); |
- } else { |
- preferred_types_with_dependents.Remove(syncable::APP_NOTIFICATIONS); |
- } |
- } |
- // Set search_engines to the same enabled/disabled state as |
- // preferences (since only preferences is shown in the UI). |
- if (registered_types.Has(syncable::PREFERENCES) && |
- registered_types.Has(syncable::SEARCH_ENGINES)) { |
- if (preferred_types_with_dependents.Has(syncable::PREFERENCES)) { |
- preferred_types_with_dependents.Put(syncable::SEARCH_ENGINES); |
- } else { |
- preferred_types_with_dependents.Remove(syncable::SEARCH_ENGINES); |
- } |
- } |
- |
- for (syncable::ModelTypeSet::Iterator it = registered_types.First(); |
- it.Good(); it.Inc()) { |
- SetDataTypePreferred( |
- it.Get(), preferred_types_with_dependents.Has(it.Get())); |
+ preferred_types = ResolvePrefGroups(registered_types, preferred_types); |
+ for (syncable::ModelTypeSet::Iterator i = registered_types.First(); |
+ i.Good(); i.Inc()) { |
+ SetDataTypePreferred(i.Get(), preferred_types.Has(i.Get())); |
} |
} |
@@ -405,6 +338,17 @@ const char* GetPrefNameForDataType(syncable::ModelType data_type) { |
} // namespace |
+void SyncPrefs::RegisterPrefGroups() { |
+ pref_groups_[syncable::APPS].Put(syncable::APP_NOTIFICATIONS); |
+ pref_groups_[syncable::APPS].Put(syncable::APP_SETTINGS); |
+ |
+ pref_groups_[syncable::AUTOFILL].Put(syncable::AUTOFILL_PROFILE); |
+ |
+ pref_groups_[syncable::EXTENSIONS].Put(syncable::EXTENSION_SETTINGS); |
+ |
+ pref_groups_[syncable::PREFERENCES].Put(syncable::SEARCH_ENGINES); |
+} |
+ |
void SyncPrefs::RegisterPreferences() { |
DCHECK(non_thread_safe_.CalledOnValidThread()); |
CHECK(pref_service_); |
@@ -518,4 +462,20 @@ void SyncPrefs::SetDataTypePreferred( |
pref_service_->SetBoolean(pref_name, is_preferred); |
} |
+syncable::ModelTypeSet SyncPrefs::ResolvePrefGroups( |
+ syncable::ModelTypeSet registered_types, |
+ syncable::ModelTypeSet types) const { |
+ DCHECK(registered_types.HasAll(types)); |
+ syncable::ModelTypeSet types_with_groups = types; |
+ for (PrefGroupsMap::const_iterator i = pref_groups_.begin(); |
+ i != pref_groups_.end(); ++i) { |
+ if (types.Has(i->first)) |
+ types_with_groups.PutAll(i->second); |
+ else |
+ types_with_groups.RemoveAll(i->second); |
+ } |
+ types_with_groups.RetainAll(registered_types); |
+ return types_with_groups; |
+} |
+ |
} // namespace browser_sync |