| Index: sync/syncable/model_type.cc
|
| diff --git a/sync/syncable/model_type.cc b/sync/syncable/model_type.cc
|
| deleted file mode 100644
|
| index bb5e0fa3cece28d32cdda34a486fd048b6971e28..0000000000000000000000000000000000000000
|
| --- a/sync/syncable/model_type.cc
|
| +++ /dev/null
|
| @@ -1,764 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "sync/internal_api/public/base/model_type.h"
|
| -
|
| -#include <stddef.h>
|
| -
|
| -#include "base/macros.h"
|
| -#include "base/strings/string_split.h"
|
| -#include "base/values.h"
|
| -#include "sync/protocol/app_notification_specifics.pb.h"
|
| -#include "sync/protocol/app_setting_specifics.pb.h"
|
| -#include "sync/protocol/app_specifics.pb.h"
|
| -#include "sync/protocol/autofill_specifics.pb.h"
|
| -#include "sync/protocol/bookmark_specifics.pb.h"
|
| -#include "sync/protocol/extension_setting_specifics.pb.h"
|
| -#include "sync/protocol/extension_specifics.pb.h"
|
| -#include "sync/protocol/nigori_specifics.pb.h"
|
| -#include "sync/protocol/password_specifics.pb.h"
|
| -#include "sync/protocol/preference_specifics.pb.h"
|
| -#include "sync/protocol/search_engine_specifics.pb.h"
|
| -#include "sync/protocol/session_specifics.pb.h"
|
| -#include "sync/protocol/sync.pb.h"
|
| -#include "sync/protocol/theme_specifics.pb.h"
|
| -#include "sync/protocol/typed_url_specifics.pb.h"
|
| -#include "sync/syncable/syncable_proto_util.h"
|
| -
|
| -namespace syncer {
|
| -
|
| -struct ModelTypeInfo {
|
| - const ModelType model_type;
|
| - // Model Type notification string.
|
| - // This needs to match the corresponding proto message name in sync.proto
|
| - const char* const notification_type;
|
| - // Root tag for Model Type
|
| - // This should be the same as the model type but all lowercase.
|
| - const char* const root_tag;
|
| - // String value for Model Type
|
| - // This should be the same as the model type but space separated and the
|
| - // first letter of every word capitalized.
|
| - const char* const model_type_string;
|
| - // SpecificsFieldNumber for Model Type
|
| - const int specifics_field_number;
|
| - // Histogram value should be unique for the Model Type, Existing histogram
|
| - // values should never be modified without updating "SyncModelTypes" enum in
|
| - // histograms.xml to maintain backward compatibility.
|
| - const int model_type_histogram_val;
|
| -};
|
| -
|
| -// Below struct entries are in the same order as their definition in the
|
| -// ModelType enum. Don't forget to update the ModelType enum when you make
|
| -// changes to this list.
|
| -// Struct field values should be unique across the entire map.
|
| -const ModelTypeInfo kModelTypeInfoMap[] = {
|
| - {UNSPECIFIED, "", "", "Unspecified", -1, 0},
|
| - {TOP_LEVEL_FOLDER, "", "", "Top Level Folder", -1, 1},
|
| - {BOOKMARKS, "BOOKMARK", "bookmarks", "Bookmarks",
|
| - sync_pb::EntitySpecifics::kBookmarkFieldNumber, 2},
|
| - {PREFERENCES, "PREFERENCE", "preferences", "Preferences",
|
| - sync_pb::EntitySpecifics::kPreferenceFieldNumber, 3},
|
| - {PASSWORDS, "PASSWORD", "passwords", "Passwords",
|
| - sync_pb::EntitySpecifics::kPasswordFieldNumber, 4},
|
| - {AUTOFILL_PROFILE, "AUTOFILL_PROFILE", "autofill_profiles",
|
| - "Autofill Profiles", sync_pb::EntitySpecifics::kAutofillProfileFieldNumber,
|
| - 5},
|
| - {AUTOFILL, "AUTOFILL", "autofill", "Autofill",
|
| - sync_pb::EntitySpecifics::kAutofillFieldNumber, 6},
|
| - {AUTOFILL_WALLET_DATA, "AUTOFILL_WALLET", "autofill_wallet",
|
| - "Autofill Wallet", sync_pb::EntitySpecifics::kAutofillWalletFieldNumber,
|
| - 34},
|
| - {AUTOFILL_WALLET_METADATA, "WALLET_METADATA",
|
| - "autofill_wallet_metadata", "Autofill Wallet Metadata",
|
| - sync_pb::EntitySpecifics::kWalletMetadataFieldNumber, 35},
|
| - {THEMES, "THEME", "themes", "Themes",
|
| - sync_pb::EntitySpecifics::kThemeFieldNumber, 7},
|
| - {TYPED_URLS, "TYPED_URL", "typed_urls", "Typed URLs",
|
| - sync_pb::EntitySpecifics::kTypedUrlFieldNumber, 8},
|
| - {EXTENSIONS, "EXTENSION", "extensions", "Extensions",
|
| - sync_pb::EntitySpecifics::kExtensionFieldNumber, 9},
|
| - {SEARCH_ENGINES, "SEARCH_ENGINE", "search_engines", "Search Engines",
|
| - sync_pb::EntitySpecifics::kSearchEngineFieldNumber, 10},
|
| - {SESSIONS, "SESSION", "sessions", "Sessions",
|
| - sync_pb::EntitySpecifics::kSessionFieldNumber, 11},
|
| - {APPS, "APP", "apps", "Apps", sync_pb::EntitySpecifics::kAppFieldNumber,
|
| - 12},
|
| - {APP_SETTINGS, "APP_SETTING", "app_settings", "App settings",
|
| - sync_pb::EntitySpecifics::kAppSettingFieldNumber, 13},
|
| - {EXTENSION_SETTINGS, "EXTENSION_SETTING", "extension_settings",
|
| - "Extension settings",
|
| - sync_pb::EntitySpecifics::kExtensionSettingFieldNumber, 14},
|
| - {APP_NOTIFICATIONS, "APP_NOTIFICATION", "app_notifications",
|
| - "App Notifications", sync_pb::EntitySpecifics::kAppNotificationFieldNumber,
|
| - 15},
|
| - {HISTORY_DELETE_DIRECTIVES, "HISTORY_DELETE_DIRECTIVE",
|
| - "history_delete_directives", "History Delete Directives",
|
| - sync_pb::EntitySpecifics::kHistoryDeleteDirectiveFieldNumber, 16},
|
| - {SYNCED_NOTIFICATIONS, "SYNCED_NOTIFICATION", "synced_notifications",
|
| - "Synced Notifications",
|
| - sync_pb::EntitySpecifics::kSyncedNotificationFieldNumber, 20},
|
| - {SYNCED_NOTIFICATION_APP_INFO, "SYNCED_NOTIFICATION_APP_INFO",
|
| - "synced_notification_app_info", "Synced Notification App Info",
|
| - sync_pb::EntitySpecifics::kSyncedNotificationAppInfoFieldNumber, 31},
|
| - {DICTIONARY, "DICTIONARY", "dictionary", "Dictionary",
|
| - sync_pb::EntitySpecifics::kDictionaryFieldNumber, 22},
|
| - {FAVICON_IMAGES, "FAVICON_IMAGE", "favicon_images", "Favicon Images",
|
| - sync_pb::EntitySpecifics::kFaviconImageFieldNumber, 23},
|
| - {FAVICON_TRACKING, "FAVICON_TRACKING", "favicon_tracking",
|
| - "Favicon Tracking", sync_pb::EntitySpecifics::kFaviconTrackingFieldNumber,
|
| - 24},
|
| - {DEVICE_INFO, "DEVICE_INFO", "device_info", "Device Info",
|
| - sync_pb::EntitySpecifics::kDeviceInfoFieldNumber, 18},
|
| - {PRIORITY_PREFERENCES, "PRIORITY_PREFERENCE", "priority_preferences",
|
| - "Priority Preferences",
|
| - sync_pb::EntitySpecifics::kPriorityPreferenceFieldNumber, 21},
|
| - {SUPERVISED_USER_SETTINGS, "MANAGED_USER_SETTING", "managed_user_settings",
|
| - "Managed User Settings",
|
| - sync_pb::EntitySpecifics::kManagedUserSettingFieldNumber, 26},
|
| - {SUPERVISED_USERS, "MANAGED_USER", "managed_users", "Managed Users",
|
| - sync_pb::EntitySpecifics::kManagedUserFieldNumber, 27},
|
| - {SUPERVISED_USER_SHARED_SETTINGS, "MANAGED_USER_SHARED_SETTING",
|
| - "managed_user_shared_settings", "Managed User Shared Settings",
|
| - sync_pb::EntitySpecifics::kManagedUserSharedSettingFieldNumber, 30},
|
| - {ARTICLES, "ARTICLE", "articles", "Articles",
|
| - sync_pb::EntitySpecifics::kArticleFieldNumber, 28},
|
| - {APP_LIST, "APP_LIST", "app_list", "App List",
|
| - sync_pb::EntitySpecifics::kAppListFieldNumber, 29},
|
| - {WIFI_CREDENTIALS, "WIFI_CREDENTIAL", "wifi_credentials",
|
| - "WiFi Credentials", sync_pb::EntitySpecifics::kWifiCredentialFieldNumber,
|
| - 32},
|
| - {SUPERVISED_USER_WHITELISTS, "MANAGED_USER_WHITELIST",
|
| - "managed_user_whitelists", "Managed User Whitelists",
|
| - sync_pb::EntitySpecifics::kManagedUserWhitelistFieldNumber, 33},
|
| - {ARC_PACKAGE, "ARC_PACKAGE", "arc_package", "Arc Package",
|
| - sync_pb::EntitySpecifics::kArcPackageFieldNumber, 36},
|
| - {PROXY_TABS, "", "", "Tabs", -1, 25},
|
| - {NIGORI, "NIGORI", "nigori", "Encryption keys",
|
| - sync_pb::EntitySpecifics::kNigoriFieldNumber, 17},
|
| - {EXPERIMENTS, "EXPERIMENTS", "experiments", "Experiments",
|
| - sync_pb::EntitySpecifics::kExperimentsFieldNumber, 19},
|
| -};
|
| -
|
| -static_assert(arraysize(kModelTypeInfoMap) == MODEL_TYPE_COUNT,
|
| - "kModelTypeInfoMap should have MODEL_TYPE_COUNT elements");
|
| -
|
| -// Notes:
|
| -// 1) This list must contain exactly the same elements as the set returned by
|
| -// UserSelectableTypes().
|
| -// 2) This list must be in the same order as the respective values in the
|
| -// ModelType enum.
|
| -const char* kUserSelectableDataTypeNames[] = {
|
| - "bookmarks",
|
| - "preferences",
|
| - "passwords",
|
| - "autofill",
|
| - "themes",
|
| - "typedUrls",
|
| - "extensions",
|
| - "apps",
|
| - "tabs",
|
| -};
|
| -
|
| -static_assert(
|
| - 37 == MODEL_TYPE_COUNT,
|
| - "update kUserSelectableDataTypeName to match UserSelectableTypes");
|
| -
|
| -void AddDefaultFieldValue(ModelType datatype,
|
| - sync_pb::EntitySpecifics* specifics) {
|
| - if (!ProtocolTypes().Has(datatype)) {
|
| - NOTREACHED() << "Only protocol types have field values.";
|
| - return;
|
| - }
|
| - switch (datatype) {
|
| - case BOOKMARKS:
|
| - specifics->mutable_bookmark();
|
| - break;
|
| - case PASSWORDS:
|
| - specifics->mutable_password();
|
| - break;
|
| - case PREFERENCES:
|
| - specifics->mutable_preference();
|
| - break;
|
| - case AUTOFILL:
|
| - specifics->mutable_autofill();
|
| - break;
|
| - case AUTOFILL_PROFILE:
|
| - specifics->mutable_autofill_profile();
|
| - break;
|
| - case AUTOFILL_WALLET_DATA:
|
| - specifics->mutable_autofill_wallet();
|
| - break;
|
| - case AUTOFILL_WALLET_METADATA:
|
| - specifics->mutable_wallet_metadata();
|
| - break;
|
| - case THEMES:
|
| - specifics->mutable_theme();
|
| - break;
|
| - case TYPED_URLS:
|
| - specifics->mutable_typed_url();
|
| - break;
|
| - case EXTENSIONS:
|
| - specifics->mutable_extension();
|
| - break;
|
| - case NIGORI:
|
| - specifics->mutable_nigori();
|
| - break;
|
| - case SEARCH_ENGINES:
|
| - specifics->mutable_search_engine();
|
| - break;
|
| - case SESSIONS:
|
| - specifics->mutable_session();
|
| - break;
|
| - case APPS:
|
| - specifics->mutable_app();
|
| - break;
|
| - case APP_LIST:
|
| - specifics->mutable_app_list();
|
| - break;
|
| - case APP_SETTINGS:
|
| - specifics->mutable_app_setting();
|
| - break;
|
| - case ARC_PACKAGE:
|
| - specifics->mutable_arc_package();
|
| - break;
|
| - case EXTENSION_SETTINGS:
|
| - specifics->mutable_extension_setting();
|
| - break;
|
| - case APP_NOTIFICATIONS:
|
| - specifics->mutable_app_notification();
|
| - break;
|
| - case HISTORY_DELETE_DIRECTIVES:
|
| - specifics->mutable_history_delete_directive();
|
| - break;
|
| - case SYNCED_NOTIFICATIONS:
|
| - specifics->mutable_synced_notification();
|
| - break;
|
| - case SYNCED_NOTIFICATION_APP_INFO:
|
| - specifics->mutable_synced_notification_app_info();
|
| - break;
|
| - case DEVICE_INFO:
|
| - specifics->mutable_device_info();
|
| - break;
|
| - case EXPERIMENTS:
|
| - specifics->mutable_experiments();
|
| - break;
|
| - case PRIORITY_PREFERENCES:
|
| - specifics->mutable_priority_preference();
|
| - break;
|
| - case DICTIONARY:
|
| - specifics->mutable_dictionary();
|
| - break;
|
| - case FAVICON_IMAGES:
|
| - specifics->mutable_favicon_image();
|
| - break;
|
| - case FAVICON_TRACKING:
|
| - specifics->mutable_favicon_tracking();
|
| - break;
|
| - case SUPERVISED_USER_SETTINGS:
|
| - specifics->mutable_managed_user_setting();
|
| - break;
|
| - case SUPERVISED_USERS:
|
| - specifics->mutable_managed_user();
|
| - break;
|
| - case SUPERVISED_USER_SHARED_SETTINGS:
|
| - specifics->mutable_managed_user_shared_setting();
|
| - break;
|
| - case SUPERVISED_USER_WHITELISTS:
|
| - specifics->mutable_managed_user_whitelist();
|
| - break;
|
| - case ARTICLES:
|
| - specifics->mutable_article();
|
| - break;
|
| - case WIFI_CREDENTIALS:
|
| - specifics->mutable_wifi_credential();
|
| - break;
|
| - default:
|
| - NOTREACHED() << "No known extension for model type.";
|
| - }
|
| -}
|
| -
|
| -ModelType GetModelTypeFromSpecificsFieldNumber(int field_number) {
|
| - ModelTypeSet protocol_types = ProtocolTypes();
|
| - for (ModelTypeSet::Iterator iter = protocol_types.First(); iter.Good();
|
| - iter.Inc()) {
|
| - if (GetSpecificsFieldNumberFromModelType(iter.Get()) == field_number)
|
| - return iter.Get();
|
| - }
|
| - return UNSPECIFIED;
|
| -}
|
| -
|
| -int GetSpecificsFieldNumberFromModelType(ModelType model_type) {
|
| - DCHECK(ProtocolTypes().Has(model_type))
|
| - << "Only protocol types have field values.";
|
| - if (ProtocolTypes().Has(model_type))
|
| - return kModelTypeInfoMap[model_type].specifics_field_number;
|
| - NOTREACHED() << "No known extension for model type.";
|
| - return 0;
|
| -}
|
| -
|
| -FullModelTypeSet ToFullModelTypeSet(ModelTypeSet in) {
|
| - FullModelTypeSet out;
|
| - for (ModelTypeSet::Iterator i = in.First(); i.Good(); i.Inc()) {
|
| - out.Put(i.Get());
|
| - }
|
| - return out;
|
| -}
|
| -
|
| -// Note: keep this consistent with GetModelType in entry.cc!
|
| -ModelType GetModelType(const sync_pb::SyncEntity& sync_entity) {
|
| - DCHECK(!IsRoot(sync_entity)); // Root shouldn't ever go over the wire.
|
| -
|
| - // Backwards compatibility with old (pre-specifics) protocol.
|
| - if (sync_entity.has_bookmarkdata())
|
| - return BOOKMARKS;
|
| -
|
| - ModelType specifics_type = GetModelTypeFromSpecifics(sync_entity.specifics());
|
| - if (specifics_type != UNSPECIFIED)
|
| - return specifics_type;
|
| -
|
| - // Loose check for server-created top-level folders that aren't
|
| - // bound to a particular model type.
|
| - if (!sync_entity.server_defined_unique_tag().empty() &&
|
| - IsFolder(sync_entity)) {
|
| - return TOP_LEVEL_FOLDER;
|
| - }
|
| -
|
| - // This is an item of a datatype we can't understand. Maybe it's
|
| - // from the future? Either we mis-encoded the object, or the
|
| - // server sent us entries it shouldn't have.
|
| - NOTREACHED() << "Unknown datatype in sync proto.";
|
| - return UNSPECIFIED;
|
| -}
|
| -
|
| -ModelType GetModelTypeFromSpecifics(const sync_pb::EntitySpecifics& specifics) {
|
| - if (specifics.has_bookmark())
|
| - return BOOKMARKS;
|
| -
|
| - if (specifics.has_password())
|
| - return PASSWORDS;
|
| -
|
| - if (specifics.has_preference())
|
| - return PREFERENCES;
|
| -
|
| - if (specifics.has_autofill())
|
| - return AUTOFILL;
|
| -
|
| - if (specifics.has_autofill_profile())
|
| - return AUTOFILL_PROFILE;
|
| -
|
| - if (specifics.has_autofill_wallet())
|
| - return AUTOFILL_WALLET_DATA;
|
| -
|
| - if (specifics.has_wallet_metadata())
|
| - return AUTOFILL_WALLET_METADATA;
|
| -
|
| - if (specifics.has_theme())
|
| - return THEMES;
|
| -
|
| - if (specifics.has_typed_url())
|
| - return TYPED_URLS;
|
| -
|
| - if (specifics.has_extension())
|
| - return EXTENSIONS;
|
| -
|
| - if (specifics.has_nigori())
|
| - return NIGORI;
|
| -
|
| - if (specifics.has_app())
|
| - return APPS;
|
| -
|
| - if (specifics.has_app_list())
|
| - return APP_LIST;
|
| -
|
| - if (specifics.has_arc_package())
|
| - return ARC_PACKAGE;
|
| -
|
| - if (specifics.has_search_engine())
|
| - return SEARCH_ENGINES;
|
| -
|
| - if (specifics.has_session())
|
| - return SESSIONS;
|
| -
|
| - if (specifics.has_app_setting())
|
| - return APP_SETTINGS;
|
| -
|
| - if (specifics.has_extension_setting())
|
| - return EXTENSION_SETTINGS;
|
| -
|
| - if (specifics.has_app_notification())
|
| - return APP_NOTIFICATIONS;
|
| -
|
| - if (specifics.has_history_delete_directive())
|
| - return HISTORY_DELETE_DIRECTIVES;
|
| -
|
| - if (specifics.has_synced_notification())
|
| - return SYNCED_NOTIFICATIONS;
|
| -
|
| - if (specifics.has_synced_notification_app_info())
|
| - return SYNCED_NOTIFICATION_APP_INFO;
|
| -
|
| - if (specifics.has_device_info())
|
| - return DEVICE_INFO;
|
| -
|
| - if (specifics.has_experiments())
|
| - return EXPERIMENTS;
|
| -
|
| - if (specifics.has_priority_preference())
|
| - return PRIORITY_PREFERENCES;
|
| -
|
| - if (specifics.has_dictionary())
|
| - return DICTIONARY;
|
| -
|
| - if (specifics.has_favicon_image())
|
| - return FAVICON_IMAGES;
|
| -
|
| - if (specifics.has_favicon_tracking())
|
| - return FAVICON_TRACKING;
|
| -
|
| - if (specifics.has_managed_user_setting())
|
| - return SUPERVISED_USER_SETTINGS;
|
| -
|
| - if (specifics.has_managed_user())
|
| - return SUPERVISED_USERS;
|
| -
|
| - if (specifics.has_managed_user_shared_setting())
|
| - return SUPERVISED_USER_SHARED_SETTINGS;
|
| -
|
| - if (specifics.has_managed_user_whitelist())
|
| - return SUPERVISED_USER_WHITELISTS;
|
| -
|
| - if (specifics.has_article())
|
| - return ARTICLES;
|
| -
|
| - if (specifics.has_wifi_credential())
|
| - return WIFI_CREDENTIALS;
|
| -
|
| - return UNSPECIFIED;
|
| -}
|
| -
|
| -ModelTypeSet ProtocolTypes() {
|
| - ModelTypeSet set = ModelTypeSet::All();
|
| - set.RemoveAll(ProxyTypes());
|
| - return set;
|
| -}
|
| -
|
| -ModelTypeSet UserTypes() {
|
| - ModelTypeSet set;
|
| - // TODO(sync): We should be able to build the actual enumset's internal
|
| - // bitset value here at compile time, rather than performing an iteration
|
| - // every time.
|
| - for (int i = FIRST_USER_MODEL_TYPE; i <= LAST_USER_MODEL_TYPE; ++i) {
|
| - set.Put(ModelTypeFromInt(i));
|
| - }
|
| - return set;
|
| -}
|
| -
|
| -ModelTypeSet UserSelectableTypes() {
|
| - ModelTypeSet set;
|
| - // Although the order doesn't technically matter here, it's clearer to keep
|
| - // these in the same order as their definition in the ModelType enum.
|
| - set.Put(BOOKMARKS);
|
| - set.Put(PREFERENCES);
|
| - set.Put(PASSWORDS);
|
| - set.Put(AUTOFILL);
|
| - set.Put(THEMES);
|
| - set.Put(TYPED_URLS);
|
| - set.Put(EXTENSIONS);
|
| - set.Put(APPS);
|
| - set.Put(PROXY_TABS);
|
| - return set;
|
| -}
|
| -
|
| -bool IsUserSelectableType(ModelType model_type) {
|
| - return UserSelectableTypes().Has(model_type);
|
| -}
|
| -
|
| -ModelTypeNameMap GetUserSelectableTypeNameMap() {
|
| - ModelTypeNameMap type_names;
|
| - ModelTypeSet type_set = UserSelectableTypes();
|
| - ModelTypeSet::Iterator it = type_set.First();
|
| - DCHECK_EQ(arraysize(kUserSelectableDataTypeNames), type_set.Size());
|
| - for (size_t i = 0; i < arraysize(kUserSelectableDataTypeNames) && it.Good();
|
| - ++i, it.Inc()) {
|
| - type_names[it.Get()] = kUserSelectableDataTypeNames[i];
|
| - }
|
| - return type_names;
|
| -}
|
| -
|
| -ModelTypeSet EncryptableUserTypes() {
|
| - ModelTypeSet encryptable_user_types = UserTypes();
|
| - // We never encrypt history delete directives.
|
| - encryptable_user_types.Remove(HISTORY_DELETE_DIRECTIVES);
|
| - // Synced notifications are not encrypted since the server must see changes.
|
| - encryptable_user_types.Remove(SYNCED_NOTIFICATIONS);
|
| - // Synced Notification App Info does not have private data, so it is not
|
| - // encrypted.
|
| - encryptable_user_types.Remove(SYNCED_NOTIFICATION_APP_INFO);
|
| - // Device info data is not encrypted because it might be synced before
|
| - // encryption is ready.
|
| - encryptable_user_types.Remove(DEVICE_INFO);
|
| - // Priority preferences are not encrypted because they might be synced before
|
| - // encryption is ready.
|
| - encryptable_user_types.Remove(PRIORITY_PREFERENCES);
|
| - // Supervised user settings are not encrypted since they are set server-side.
|
| - encryptable_user_types.Remove(SUPERVISED_USER_SETTINGS);
|
| - // Supervised users are not encrypted since they are managed server-side.
|
| - encryptable_user_types.Remove(SUPERVISED_USERS);
|
| - // Supervised user shared settings are not encrypted since they are managed
|
| - // server-side and shared between manager and supervised user.
|
| - encryptable_user_types.Remove(SUPERVISED_USER_SHARED_SETTINGS);
|
| - // Supervised user whitelists are not encrypted since they are managed
|
| - // server-side.
|
| - encryptable_user_types.Remove(SUPERVISED_USER_WHITELISTS);
|
| - // Proxy types have no sync representation and are therefore not encrypted.
|
| - // Note however that proxy types map to one or more protocol types, which
|
| - // may or may not be encrypted themselves.
|
| - encryptable_user_types.RemoveAll(ProxyTypes());
|
| - // Wallet data is not encrypted since it actually originates on the server.
|
| - encryptable_user_types.Remove(AUTOFILL_WALLET_DATA);
|
| - return encryptable_user_types;
|
| -}
|
| -
|
| -ModelTypeSet PriorityUserTypes() {
|
| - return ModelTypeSet(DEVICE_INFO, PRIORITY_PREFERENCES);
|
| -}
|
| -
|
| -ModelTypeSet ControlTypes() {
|
| - ModelTypeSet set;
|
| - // TODO(sync): We should be able to build the actual enumset's internal
|
| - // bitset value here at compile time, rather than performing an iteration
|
| - // every time.
|
| - for (int i = FIRST_CONTROL_MODEL_TYPE; i <= LAST_CONTROL_MODEL_TYPE; ++i) {
|
| - set.Put(ModelTypeFromInt(i));
|
| - }
|
| -
|
| - return set;
|
| -}
|
| -
|
| -ModelTypeSet ProxyTypes() {
|
| - ModelTypeSet set;
|
| - set.Put(PROXY_TABS);
|
| - return set;
|
| -}
|
| -
|
| -bool IsControlType(ModelType model_type) {
|
| - return ControlTypes().Has(model_type);
|
| -}
|
| -
|
| -ModelTypeSet CoreTypes() {
|
| - syncer::ModelTypeSet result;
|
| - result.PutAll(PriorityCoreTypes());
|
| -
|
| - // The following are low priority core types.
|
| - result.Put(SYNCED_NOTIFICATIONS);
|
| - result.Put(SYNCED_NOTIFICATION_APP_INFO);
|
| - result.Put(SUPERVISED_USER_SHARED_SETTINGS);
|
| - result.Put(SUPERVISED_USER_WHITELISTS);
|
| -
|
| - return result;
|
| -}
|
| -
|
| -ModelTypeSet PriorityCoreTypes() {
|
| - syncer::ModelTypeSet result;
|
| - result.PutAll(ControlTypes());
|
| -
|
| - // The following are non-control core types.
|
| - result.Put(SUPERVISED_USERS);
|
| - result.Put(SUPERVISED_USER_SETTINGS);
|
| -
|
| - return result;
|
| -}
|
| -
|
| -const char* ModelTypeToString(ModelType model_type) {
|
| - // This is used in serialization routines as well as for displaying debug
|
| - // information. Do not attempt to change these string values unless you know
|
| - // what you're doing.
|
| - if (model_type >= UNSPECIFIED && model_type < MODEL_TYPE_COUNT)
|
| - return kModelTypeInfoMap[model_type].model_type_string;
|
| - NOTREACHED() << "No known extension for model type.";
|
| - return "INVALID";
|
| -}
|
| -
|
| -// The normal rules about histograms apply here. Always append to the bottom of
|
| -// the list, and be careful to not reuse integer values that have already been
|
| -// assigned.
|
| -//
|
| -// Don't forget to update the "SyncModelTypes" enum in histograms.xml when you
|
| -// make changes to this list.
|
| -int ModelTypeToHistogramInt(ModelType model_type) {
|
| - if (model_type >= UNSPECIFIED && model_type < MODEL_TYPE_COUNT)
|
| - return kModelTypeInfoMap[model_type].model_type_histogram_val;
|
| - return 0;
|
| -}
|
| -
|
| -base::StringValue* ModelTypeToValue(ModelType model_type) {
|
| - if (model_type >= FIRST_REAL_MODEL_TYPE) {
|
| - return new base::StringValue(ModelTypeToString(model_type));
|
| - } else if (model_type == TOP_LEVEL_FOLDER) {
|
| - return new base::StringValue("Top-level folder");
|
| - } else if (model_type == UNSPECIFIED) {
|
| - return new base::StringValue("Unspecified");
|
| - }
|
| - NOTREACHED();
|
| - return new base::StringValue(std::string());
|
| -}
|
| -
|
| -ModelType ModelTypeFromValue(const base::Value& value) {
|
| - if (value.IsType(base::Value::TYPE_STRING)) {
|
| - std::string result;
|
| - CHECK(value.GetAsString(&result));
|
| - return ModelTypeFromString(result);
|
| - } else if (value.IsType(base::Value::TYPE_INTEGER)) {
|
| - int result;
|
| - CHECK(value.GetAsInteger(&result));
|
| - return ModelTypeFromInt(result);
|
| - } else {
|
| - NOTREACHED() << "Unsupported value type: " << value.GetType();
|
| - return UNSPECIFIED;
|
| - }
|
| -}
|
| -
|
| -ModelType ModelTypeFromString(const std::string& model_type_string) {
|
| - if (model_type_string != "Unspecified" &&
|
| - model_type_string != "Top Level Folder") {
|
| - for (size_t i = 0; i < arraysize(kModelTypeInfoMap); ++i) {
|
| - if (kModelTypeInfoMap[i].model_type_string == model_type_string)
|
| - return kModelTypeInfoMap[i].model_type;
|
| - }
|
| - }
|
| - NOTREACHED() << "No known model type corresponding to " << model_type_string
|
| - << ".";
|
| - return UNSPECIFIED;
|
| -}
|
| -
|
| -std::string ModelTypeSetToString(ModelTypeSet model_types) {
|
| - std::string result;
|
| - for (ModelTypeSet::Iterator it = model_types.First(); it.Good(); it.Inc()) {
|
| - if (!result.empty()) {
|
| - result += ", ";
|
| - }
|
| - result += ModelTypeToString(it.Get());
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -std::ostream& operator<<(std::ostream& out, ModelTypeSet model_type_set) {
|
| - return out << ModelTypeSetToString(model_type_set);
|
| -}
|
| -
|
| -ModelTypeSet ModelTypeSetFromString(const std::string& model_types_string) {
|
| - std::string working_copy = model_types_string;
|
| - ModelTypeSet model_types;
|
| - while (!working_copy.empty()) {
|
| - // Remove any leading spaces.
|
| - working_copy = working_copy.substr(working_copy.find_first_not_of(' '));
|
| - if (working_copy.empty())
|
| - break;
|
| - std::string type_str;
|
| - size_t end = working_copy.find(',');
|
| - if (end == std::string::npos) {
|
| - end = working_copy.length() - 1;
|
| - type_str = working_copy;
|
| - } else {
|
| - type_str = working_copy.substr(0, end);
|
| - }
|
| - syncer::ModelType type = ModelTypeFromString(type_str);
|
| - if (IsRealDataType(type))
|
| - model_types.Put(type);
|
| - working_copy = working_copy.substr(end + 1);
|
| - }
|
| - return model_types;
|
| -}
|
| -
|
| -std::unique_ptr<base::ListValue> ModelTypeSetToValue(ModelTypeSet model_types) {
|
| - std::unique_ptr<base::ListValue> value(new base::ListValue());
|
| - for (ModelTypeSet::Iterator it = model_types.First(); it.Good(); it.Inc()) {
|
| - value->AppendString(ModelTypeToString(it.Get()));
|
| - }
|
| - return value;
|
| -}
|
| -
|
| -ModelTypeSet ModelTypeSetFromValue(const base::ListValue& value) {
|
| - ModelTypeSet result;
|
| - for (base::ListValue::const_iterator i = value.begin();
|
| - i != value.end(); ++i) {
|
| - result.Put(ModelTypeFromValue(**i));
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -// TODO(zea): remove all hardcoded tags in model associators and have them use
|
| -// this instead.
|
| -// NOTE: Proxy types should return empty strings (so that we don't NOTREACHED
|
| -// in tests when we verify they have no root node).
|
| -std::string ModelTypeToRootTag(ModelType type) {
|
| - if (IsProxyType(type))
|
| - return std::string();
|
| - if (IsRealDataType(type))
|
| - return "google_chrome_" + std::string(kModelTypeInfoMap[type].root_tag);
|
| - NOTREACHED() << "No known extension for model type.";
|
| - return "INVALID";
|
| -}
|
| -
|
| -const char* GetModelTypeRootTag(ModelType model_type) {
|
| - return kModelTypeInfoMap[model_type].root_tag;
|
| -}
|
| -
|
| -bool RealModelTypeToNotificationType(ModelType model_type,
|
| - std::string* notification_type) {
|
| - if (ProtocolTypes().Has(model_type)) {
|
| - *notification_type = kModelTypeInfoMap[model_type].notification_type;
|
| - return true;
|
| - }
|
| - notification_type->clear();
|
| - return false;
|
| -}
|
| -
|
| -bool NotificationTypeToRealModelType(const std::string& notification_type,
|
| - ModelType* model_type) {
|
| - if (notification_type.empty()) {
|
| - *model_type = UNSPECIFIED;
|
| - return false;
|
| - }
|
| - for (size_t i = 0; i < arraysize(kModelTypeInfoMap); ++i) {
|
| - if (kModelTypeInfoMap[i].notification_type == notification_type) {
|
| - *model_type = kModelTypeInfoMap[i].model_type;
|
| - return true;
|
| - }
|
| - }
|
| - *model_type = UNSPECIFIED;
|
| - return false;
|
| -}
|
| -
|
| -bool IsRealDataType(ModelType model_type) {
|
| - return model_type >= FIRST_REAL_MODEL_TYPE && model_type < MODEL_TYPE_COUNT;
|
| -}
|
| -
|
| -bool IsProxyType(ModelType model_type) {
|
| - return model_type >= FIRST_PROXY_TYPE && model_type <= LAST_PROXY_TYPE;
|
| -}
|
| -
|
| -bool IsActOnceDataType(ModelType model_type) {
|
| - return model_type == HISTORY_DELETE_DIRECTIVES;
|
| -}
|
| -
|
| -bool IsTypeWithServerGeneratedRoot(ModelType model_type) {
|
| - return model_type == BOOKMARKS || model_type == NIGORI;
|
| -}
|
| -
|
| -bool IsTypeWithClientGeneratedRoot(ModelType model_type) {
|
| - return IsRealDataType(model_type) &&
|
| - !IsTypeWithServerGeneratedRoot(model_type);
|
| -}
|
| -
|
| -bool TypeSupportsHierarchy(ModelType model_type) {
|
| - // TODO(stanisc): crbug/438313: Should this also include TOP_LEVEL_FOLDER?
|
| - return model_type == BOOKMARKS;
|
| -}
|
| -
|
| -bool TypeSupportsOrdering(ModelType model_type) {
|
| - return model_type == BOOKMARKS;
|
| -}
|
| -
|
| -} // namespace syncer
|
|
|