| 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 // Keep this file in sync with the .proto files in this directory. | 5 // Keep this file in sync with the .proto files in this directory. | 
| 6 | 6 | 
| 7 #include "sync/protocol/proto_value_conversions.h" | 7 #include "sync/protocol/proto_value_conversions.h" | 
| 8 | 8 | 
| 9 #include <stdint.h> | 9 #include <stdint.h> | 
| 10 | 10 | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 44 #include "sync/protocol/sync.pb.h" | 44 #include "sync/protocol/sync.pb.h" | 
| 45 #include "sync/protocol/theme_specifics.pb.h" | 45 #include "sync/protocol/theme_specifics.pb.h" | 
| 46 #include "sync/protocol/typed_url_specifics.pb.h" | 46 #include "sync/protocol/typed_url_specifics.pb.h" | 
| 47 #include "sync/protocol/unique_position.pb.h" | 47 #include "sync/protocol/unique_position.pb.h" | 
| 48 #include "sync/util/time.h" | 48 #include "sync/util/time.h" | 
| 49 | 49 | 
| 50 namespace syncer { | 50 namespace syncer { | 
| 51 | 51 | 
| 52 namespace { | 52 namespace { | 
| 53 | 53 | 
| 54 // Basic Type -> Value functions. | 54 enum ResultType { | 
| 55 | 55   MEMORY_USAGE,     // Visitors return only the memory usage | 
| 56 std::unique_ptr<base::StringValue> MakeInt64Value(int64_t x) { | 56   CONVERT_TO_VALUE  // Visitors return only the dictionary value. | 
| 57   return base::WrapUnique(new base::StringValue(base::Int64ToString(x))); | 57 }; | 
|  | 58 | 
|  | 59 struct VisitorResult { | 
|  | 60   VisitorResult(size_t usage) : memory_usage(usage) {} | 
|  | 61   VisitorResult(std::unique_ptr<base::Value> value) | 
|  | 62       : memory_usage(0), as_value(std::move(value)) {} | 
|  | 63 | 
|  | 64   base::DictionaryValue* as_dict_value() { | 
|  | 65     DCHECK(as_value); | 
|  | 66     base::DictionaryValue* value; | 
|  | 67     as_value->GetAsDictionary(&value); | 
|  | 68     return value; | 
|  | 69   } | 
|  | 70   std::unique_ptr<base::DictionaryValue> TakeDictValue() { | 
|  | 71     base::DictionaryValue* value; | 
|  | 72     bool res = as_value.release()->GetAsDictionary(&value); | 
|  | 73     DCHECK(res); | 
|  | 74     return base::WrapUnique(value); | 
|  | 75   } | 
|  | 76 | 
|  | 77   size_t memory_usage; | 
|  | 78   std::unique_ptr<base::Value> as_value; | 
|  | 79 }; | 
|  | 80 | 
|  | 81 VisitorResult MakeInt64Value(int64_t x, const ResultType result_type) { | 
|  | 82   if (result_type == MEMORY_USAGE) { | 
|  | 83     return VisitorResult(0); | 
|  | 84   } | 
|  | 85   return VisitorResult( | 
|  | 86       base::WrapUnique(new base::StringValue(base::Int64ToString(x)))); | 
| 58 } | 87 } | 
| 59 | 88 | 
| 60 // TODO(akalin): Perhaps make JSONWriter support BinaryValue and use | 89 // TODO(akalin): Perhaps make JSONWriter support BinaryValue and use | 
| 61 // that instead of a StringValue. | 90 // that instead of a StringValue. | 
| 62 std::string Base64EncodeString(const std::string& bytes) { | 91 VisitorResult Base64EncodeString(const std::string& bytes, | 
|  | 92                                  const ResultType result_type) { | 
|  | 93   if (result_type == MEMORY_USAGE) | 
|  | 94     return VisitorResult(bytes.capacity() + 1); | 
| 63   std::string bytes_base64; | 95   std::string bytes_base64; | 
| 64   base::Base64Encode(bytes, &bytes_base64); | 96   base::Base64Encode(bytes, &bytes_base64); | 
| 65   return bytes_base64; | 97   return VisitorResult(base::WrapUnique(new base::StringValue(bytes_base64))); | 
| 66 } | 98 } | 
| 67 | 99 | 
| 68 std::unique_ptr<base::StringValue> MakeStringValue(const std::string& str) { | 100 VisitorResult MakeStringValue(const std::string& str, | 
| 69   return base::WrapUnique(new base::StringValue(str)); | 101                               const ResultType result_type) { | 
|  | 102   if (result_type == MEMORY_USAGE) | 
|  | 103     return VisitorResult(str.capacity() + 1); | 
|  | 104   return VisitorResult(base::WrapUnique(new base::StringValue(str))); | 
| 70 } | 105 } | 
| 71 | 106 | 
| 72 // T is the field type, F is either RepeatedField or RepeatedPtrField, | 107 // T is the field type, F is either RepeatedField or RepeatedPtrField, | 
| 73 // and V is a subclass of Value. | 108 // and V is a subclass of Value. | 
| 74 template <class T, class F, class V> | 109 template <class T, class F> | 
| 75 std::unique_ptr<base::ListValue> MakeRepeatedValue(const F& fields, | 110 VisitorResult MakeRepeatedVisit(const F& fields, | 
| 76                                                    V (*converter_fn)(T)) { | 111                                 VisitorResult (*converter_fn)(T, | 
|  | 112                                                               const ResultType), | 
|  | 113                                 const ResultType result_type) { | 
|  | 114   if (result_type == MEMORY_USAGE) { | 
|  | 115     size_t total = 0; | 
|  | 116     for (typename F::const_iterator it = fields.begin(); it != fields.end(); | 
|  | 117          ++it) { | 
|  | 118       total += converter_fn(*it, result_type).memory_usage + sizeof(T); | 
|  | 119     } | 
|  | 120     return VisitorResult(total); | 
|  | 121   } | 
| 77   std::unique_ptr<base::ListValue> list(new base::ListValue()); | 122   std::unique_ptr<base::ListValue> list(new base::ListValue()); | 
| 78   for (typename F::const_iterator it = fields.begin(); it != fields.end(); | 123   for (typename F::const_iterator it = fields.begin(); it != fields.end(); | 
| 79        ++it) { | 124        ++it) { | 
| 80     list->Append(converter_fn(*it)); | 125     list->Append(converter_fn(*it, result_type).as_value); | 
| 81   } | 126   } | 
| 82   return list; | 127   return VisitorResult(std::move(list)); | 
| 83 } | 128 } | 
| 84 | 129 | 
| 85 }  // namespace | 130 }  // namespace | 
| 86 | 131 | 
| 87 // Helper macros to reduce the amount of boilerplate. | 132 // Helper macros to reduce the amount of boilerplate. | 
| 88 | 133 | 
| 89 #define SET_TYPE(field, set_fn, transform)           \ | 134 #define SET_WITH_EXPR(field, visit_expr, excess_size)             \ | 
| 90   if (proto.has_##field()) {                         \ | 135   if (result_type == MEMORY_USAGE) {                              \ | 
| 91     value->set_fn(#field, transform(proto.field())); \ | 136     result.memory_usage += visit_expr.memory_usage + excess_size; \ | 
| 92   } | 137   } else {                                                        \ | 
| 93 #define SET(field, fn) SET_TYPE(field, Set, fn) | 138     result.as_dict_value()->Set(#field, visit_expr.as_value);     \ | 
|  | 139   } | 
|  | 140 | 
|  | 141 #define SET_TYPE(field, set_fn, transform)                            \ | 
|  | 142   if (result_type == CONVERT_TO_VALUE && proto.has_##field()) {       \ | 
|  | 143     result.as_dict_value()->set_fn(#field, transform(proto.field())); \ | 
|  | 144   } | 
|  | 145 #define SET(field, fn)                                   \ | 
|  | 146   if (proto.has_##field()) {                             \ | 
|  | 147     SET_WITH_EXPR(field, fn(proto.field(), result_type), \ | 
|  | 148                   sizeof(proto.field()));                \ | 
|  | 149   } | 
| 94 #define SET_REP(field, fn) \ | 150 #define SET_REP(field, fn) \ | 
| 95   value->Set(#field, MakeRepeatedValue(proto.field(), fn)) | 151   SET_WITH_EXPR(field, MakeRepeatedVisit(proto.field(), fn, result_type), 0) | 
| 96 #define SET_ENUM(field, fn) SET_TYPE(field, SetString, fn) | 152 #define SET_ENUM(field, fn) SET_TYPE(field, SetString, fn) | 
| 97 | 153 | 
| 98 #define SET_BOOL(field) SET_TYPE(field, SetBoolean, ) | 154 #define SET_BOOL(field) SET_TYPE(field, SetBoolean, ) | 
| 99 #define SET_BYTES(field) SET_TYPE(field, SetString, Base64EncodeString) | 155 #define SET_BYTES(field)                                               \ | 
|  | 156   SET_WITH_EXPR(field, Base64EncodeString(proto.field(), result_type), \ | 
|  | 157                 sizeof(proto.field())) | 
| 100 #define SET_INT32(field) SET_TYPE(field, SetString, base::Int64ToString) | 158 #define SET_INT32(field) SET_TYPE(field, SetString, base::Int64ToString) | 
| 101 #define SET_INT32_REP(field) SET_REP(field, MakeInt64Value) | 159 #define SET_INT32_REP(field) SET_REP(field, MakeInt64Value) | 
| 102 #define SET_INT64(field) SET_TYPE(field, SetString, base::Int64ToString) | 160 #define SET_INT64(field) SET_TYPE(field, SetString, base::Int64ToString) | 
| 103 #define SET_INT64_REP(field) SET_REP(field, MakeInt64Value) | 161 #define SET_INT64_REP(field) SET_REP(field, MakeInt64Value) | 
| 104 #define SET_STR(field) SET_TYPE(field, SetString, ) | 162 #define SET_STR(field)                                                \ | 
|  | 163   if (proto.has_##field()) {                                          \ | 
|  | 164     SET_WITH_EXPR(field, MakeStringValue(proto.field(), result_type), \ | 
|  | 165                   sizeof(std::string));                               \ | 
|  | 166   } | 
| 105 #define SET_TIME_STR(field) SET_TYPE(field, SetString, TimestampToString) | 167 #define SET_TIME_STR(field) SET_TYPE(field, SetString, TimestampToString) | 
| 106 #define SET_STR_REP(field)                                                 \ | 168 #define SET_STR_REP(field)                                                 \ | 
| 107   value->Set(                                                              \ | 169   SET_WITH_EXPR(                                                           \ | 
| 108       #field,                                                              \ | 170       field,                                                               \ | 
| 109       MakeRepeatedValue<const std::string&,                                \ | 171       (MakeRepeatedVisit<const std::string&,                               \ | 
| 110                         google::protobuf::RepeatedPtrField<std::string>,   \ | 172                          google::protobuf::RepeatedPtrField<std::string>>( \ | 
| 111                         std::unique_ptr<base::StringValue>>(proto.field(), \ | 173           proto.field(), MakeStringValue, result_type)),                   \ | 
| 112                                                             MakeStringValue)) | 174       0); | 
| 113 #define SET_EXPERIMENT_ENABLED_FIELD(field)          \ | 175 #define SET_EXPERIMENT_ENABLED_FIELD(field)                             \ | 
| 114   do {                                               \ | 176   if (proto.has_##field()) {                                            \ | 
| 115     if (proto.has_##field() &&                       \ | 177     if (result_type == MEMORY_USAGE) {                                  \ | 
| 116         proto.field().has_enabled()) {               \ | 178       result.memory_usage += sizeof(proto.field());                     \ | 
| 117       value->Set(#field,                             \ | 179     } else if (proto.field().has_enabled()) {                           \ | 
| 118                  new base::FundamentalValue(         \ | 180       result.as_dict_value()->Set(                                      \ | 
| 119                      proto.field().enabled()));      \ | 181           #field, new base::FundamentalValue(proto.field().enabled())); \ | 
| 120     }                                                \ | 182     }                                                                   \ | 
| 121   } while (0) | 183   } | 
| 122 | 184 | 
| 123 #define SET_FIELD(field, fn)                         \ | 185 #define SET_FIELD(field, fn)                                 \ | 
| 124   do {                                               \ | 186   if (specifics.has_##field()) {                             \ | 
| 125     if (specifics.has_##field()) {                   \ | 187     SET_WITH_EXPR(field, fn(specifics.field(), result_type), \ | 
| 126       value->Set(#field, fn(specifics.field()));     \ | 188                   sizeof(specifics.field()));                \ | 
| 127     }                                                \ | 189   } | 
| 128   } while (0) |  | 
| 129 | 190 | 
| 130 // If you add another macro, don't forget to add an #undef at the end | 191 // If you add another macro, don't forget to add an #undef at the end | 
| 131 // of this file, too. | 192 // of this file, too. | 
| 132 | 193 | 
| 133 std::unique_ptr<base::DictionaryValue> EncryptedDataToValue( | 194 VisitorResult EncryptedDataVisit(const sync_pb::EncryptedData& encrypted_data, | 
| 134     const sync_pb::EncryptedData& proto) { | 195                                  const ResultType result_type); | 
| 135   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 196 | 
|  | 197 VisitorResult AppListSpecificsVisit(const sync_pb::AppListSpecifics& proto, | 
|  | 198                                     const ResultType result_type); | 
|  | 199 | 
|  | 200 VisitorResult AppSettingsVisit( | 
|  | 201     const sync_pb::AppNotificationSettings& app_notification_settings, | 
|  | 202     const ResultType result_type); | 
|  | 203 | 
|  | 204 VisitorResult LinkedAppIconInfoVisit( | 
|  | 205     const sync_pb::LinkedAppIconInfo& linked_app_icon_info, | 
|  | 206     const ResultType result_type); | 
|  | 207 | 
|  | 208 VisitorResult SessionHeaderVisit(const sync_pb::SessionHeader& session_header, | 
|  | 209                                  const ResultType result_type); | 
|  | 210 | 
|  | 211 VisitorResult SessionTabVisit(const sync_pb::SessionTab& session_tab, | 
|  | 212                               const ResultType result_type); | 
|  | 213 | 
|  | 214 VisitorResult SessionWindowVisit(const sync_pb::SessionWindow& session_window, | 
|  | 215                                  const ResultType result_type); | 
|  | 216 | 
|  | 217 VisitorResult TabNavigationVisit(const sync_pb::TabNavigation& tab_navigation, | 
|  | 218                                  const ResultType result_type); | 
|  | 219 | 
|  | 220 VisitorResult NavigationRedirectVisit( | 
|  | 221     const sync_pb::NavigationRedirect& navigation_redirect, | 
|  | 222     const ResultType result_type); | 
|  | 223 | 
|  | 224 VisitorResult PasswordSpecificsDataVisit( | 
|  | 225     const sync_pb::PasswordSpecificsData& password_specifics_data, | 
|  | 226     const ResultType result_type); | 
|  | 227 | 
|  | 228 VisitorResult GlobalIdDirectiveVisit( | 
|  | 229     const sync_pb::GlobalIdDirective& global_id_directive, | 
|  | 230     const ResultType result_type); | 
|  | 231 | 
|  | 232 VisitorResult TimeRangeDirectiveVisit( | 
|  | 233     const sync_pb::TimeRangeDirective& time_range_directive, | 
|  | 234     const ResultType result_type); | 
|  | 235 | 
|  | 236 VisitorResult SessionSpecificsVisit( | 
|  | 237     const sync_pb::SessionSpecifics& session_specifics, | 
|  | 238     const ResultType result_type); | 
|  | 239 | 
|  | 240 VisitorResult ArcPackageSpecificsVisit( | 
|  | 241     const sync_pb::ArcPackageSpecifics& proto, | 
|  | 242     const ResultType result_type); | 
|  | 243 | 
|  | 244 VisitorResult AppNotificationVisit( | 
|  | 245     const sync_pb::AppNotification& app_notification_specifics, | 
|  | 246     const ResultType result_type); | 
|  | 247 | 
|  | 248 VisitorResult AppSettingSpecificsVisit( | 
|  | 249     const sync_pb::AppSettingSpecifics& app_setting_specifics, | 
|  | 250     const ResultType result_type); | 
|  | 251 | 
|  | 252 VisitorResult AppSpecificsVisit(const sync_pb::AppSpecifics& app_specifics, | 
|  | 253                                 const ResultType result_type); | 
|  | 254 | 
|  | 255 VisitorResult ArticleSpecificsVisit( | 
|  | 256     const sync_pb::ArticleSpecifics& article_specifics, | 
|  | 257     const ResultType result_type); | 
|  | 258 | 
|  | 259 VisitorResult AutofillSpecificsVisit( | 
|  | 260     const sync_pb::AutofillSpecifics& autofill_specifics, | 
|  | 261     const ResultType result_type); | 
|  | 262 | 
|  | 263 VisitorResult AutofillProfileSpecificsVisit( | 
|  | 264     const sync_pb::AutofillProfileSpecifics& autofill_profile_specifics, | 
|  | 265     const ResultType result_type); | 
|  | 266 | 
|  | 267 VisitorResult WalletMetadataSpecificsVisit( | 
|  | 268     const sync_pb::WalletMetadataSpecifics& wallet_metadata_specifics, | 
|  | 269     const ResultType result_type); | 
|  | 270 | 
|  | 271 VisitorResult AutofillWalletSpecificsVisit( | 
|  | 272     const sync_pb::AutofillWalletSpecifics& autofill_wallet_specifics, | 
|  | 273     const ResultType result_type); | 
|  | 274 | 
|  | 275 VisitorResult BookmarkSpecificsVisit( | 
|  | 276     const sync_pb::BookmarkSpecifics& bookmark_specifics, | 
|  | 277     const ResultType result_type); | 
|  | 278 | 
|  | 279 VisitorResult DeviceInfoSpecificsVisit( | 
|  | 280     const sync_pb::DeviceInfoSpecifics& device_info_specifics, | 
|  | 281     const ResultType result_type); | 
|  | 282 | 
|  | 283 VisitorResult DictionarySpecificsVisit( | 
|  | 284     const sync_pb::DictionarySpecifics& dictionary_specifics, | 
|  | 285     const ResultType result_type); | 
|  | 286 | 
|  | 287 VisitorResult ExperimentsSpecificsVisit( | 
|  | 288     const sync_pb::ExperimentsSpecifics& proto, | 
|  | 289     const ResultType result_type); | 
|  | 290 | 
|  | 291 VisitorResult PriorityPreferenceSpecificsVisit( | 
|  | 292     const sync_pb::PriorityPreferenceSpecifics& proto, | 
|  | 293     const ResultType result_type); | 
|  | 294 | 
|  | 295 VisitorResult ExtensionSettingSpecificsVisit( | 
|  | 296     const sync_pb::ExtensionSettingSpecifics& extension_setting_specifics, | 
|  | 297     const ResultType result_type); | 
|  | 298 | 
|  | 299 VisitorResult ExtensionSpecificsVisit( | 
|  | 300     const sync_pb::ExtensionSpecifics& extension_specifics, | 
|  | 301     const ResultType result_type); | 
|  | 302 | 
|  | 303 VisitorResult FaviconImageSpecificsVisit( | 
|  | 304     const sync_pb::FaviconImageSpecifics& favicon_image_specifics, | 
|  | 305     const ResultType result_type); | 
|  | 306 | 
|  | 307 VisitorResult FaviconTrackingSpecificsVisit( | 
|  | 308     const sync_pb::FaviconTrackingSpecifics& favicon_tracking_specifics, | 
|  | 309     const ResultType result_type); | 
|  | 310 | 
|  | 311 VisitorResult HistoryDeleteDirectiveSpecificsVisit( | 
|  | 312     const sync_pb::HistoryDeleteDirectiveSpecifics& | 
|  | 313         history_delete_directive_specifics, | 
|  | 314     const ResultType result_type); | 
|  | 315 | 
|  | 316 VisitorResult ManagedUserSettingSpecificsVisit( | 
|  | 317     const sync_pb::ManagedUserSettingSpecifics& managed_user_setting_specifics, | 
|  | 318     const ResultType result_type); | 
|  | 319 | 
|  | 320 VisitorResult ManagedUserSpecificsVisit( | 
|  | 321     const sync_pb::ManagedUserSpecifics& managed_user_specifics, | 
|  | 322     const ResultType result_type); | 
|  | 323 | 
|  | 324 VisitorResult ManagedUserSharedSettingSpecificsVisit( | 
|  | 325     const sync_pb::ManagedUserSharedSettingSpecifics& | 
|  | 326         managed_user_shared_setting_specifics, | 
|  | 327     const ResultType result_type); | 
|  | 328 | 
|  | 329 VisitorResult ManagedUserWhitelistSpecificsVisit( | 
|  | 330     const sync_pb::ManagedUserWhitelistSpecifics& | 
|  | 331         managed_user_whitelist_specifics, | 
|  | 332     const ResultType result_type); | 
|  | 333 | 
|  | 334 VisitorResult NigoriSpecificsVisit( | 
|  | 335     const sync_pb::NigoriSpecifics& nigori_specifics, | 
|  | 336     const ResultType result_type); | 
|  | 337 | 
|  | 338 VisitorResult PasswordSpecificsVisit( | 
|  | 339     const sync_pb::PasswordSpecifics& password_specifics, | 
|  | 340     const ResultType result_type); | 
|  | 341 | 
|  | 342 VisitorResult PreferenceSpecificsVisit( | 
|  | 343     const sync_pb::PreferenceSpecifics& password_specifics, | 
|  | 344     const ResultType result_type); | 
|  | 345 | 
|  | 346 VisitorResult SyncedNotificationAppInfoSpecificsVisit( | 
|  | 347     const sync_pb::SyncedNotificationAppInfoSpecifics& | 
|  | 348         synced_notification_specifics, | 
|  | 349     const ResultType result_type); | 
|  | 350 | 
|  | 351 VisitorResult SyncedNotificationSpecificsVisit( | 
|  | 352     const sync_pb::SyncedNotificationSpecifics& synced_notification_specifics, | 
|  | 353     const ResultType result_type); | 
|  | 354 | 
|  | 355 VisitorResult SearchEngineSpecificsVisit( | 
|  | 356     const sync_pb::SearchEngineSpecifics& search_engine_specifics, | 
|  | 357     const ResultType result_type); | 
|  | 358 | 
|  | 359 VisitorResult ThemeSpecificsVisit( | 
|  | 360     const sync_pb::ThemeSpecifics& theme_specifics, | 
|  | 361     const ResultType result_type); | 
|  | 362 | 
|  | 363 VisitorResult TypedUrlSpecificsVisit( | 
|  | 364     const sync_pb::TypedUrlSpecifics& typed_url_specifics, | 
|  | 365     const ResultType result_type); | 
|  | 366 | 
|  | 367 VisitorResult WalletMaskedCreditCardVisit( | 
|  | 368     const sync_pb::WalletMaskedCreditCard& wallet_masked_card, | 
|  | 369     const ResultType result_type); | 
|  | 370 | 
|  | 371 VisitorResult WalletPostalAddressVisit( | 
|  | 372     const sync_pb::WalletPostalAddress& wallet_postal_address, | 
|  | 373     const ResultType result_type); | 
|  | 374 | 
|  | 375 VisitorResult WifiCredentialSpecificsVisit( | 
|  | 376     const sync_pb::WifiCredentialSpecifics& wifi_credential_specifics, | 
|  | 377     const ResultType result_type); | 
|  | 378 | 
|  | 379 VisitorResult EntitySpecificsVisit(const sync_pb::EntitySpecifics& specifics, | 
|  | 380                                    const ResultType result_type); | 
|  | 381 | 
|  | 382 VisitorResult SyncEntityVisit(const sync_pb::SyncEntity& entity, | 
|  | 383                               bool include_specifics, | 
|  | 384                               const ResultType result_type); | 
|  | 385 | 
|  | 386 VisitorResult ClientToServerMessageVisit( | 
|  | 387     const sync_pb::ClientToServerMessage& proto, | 
|  | 388     bool include_specifics, | 
|  | 389     const ResultType result_type); | 
|  | 390 | 
|  | 391 VisitorResult ClientToServerResponseVisit( | 
|  | 392     const sync_pb::ClientToServerResponse& proto, | 
|  | 393     bool include_specifics, | 
|  | 394     const ResultType result_type); | 
|  | 395 | 
|  | 396 VisitorResult DatatypeAssociationStatsVisit( | 
|  | 397     const sync_pb::DatatypeAssociationStats& proto, | 
|  | 398     const ResultType result_type); | 
|  | 399 | 
|  | 400 VisitorResult DebugEventInfoVisit(const sync_pb::DebugEventInfo& proto, | 
|  | 401                                   const ResultType result_type); | 
|  | 402 | 
|  | 403 VisitorResult DebugInfoVisit(const sync_pb::DebugInfo& proto, | 
|  | 404                              const ResultType result_type); | 
|  | 405 | 
|  | 406 VisitorResult SyncCycleCompletedEventInfoVisit( | 
|  | 407     const sync_pb::SyncCycleCompletedEventInfo& proto, | 
|  | 408     const ResultType result_type); | 
|  | 409 | 
|  | 410 VisitorResult ClientConfigParamsVisit(const sync_pb::ClientConfigParams& proto, | 
|  | 411                                       const ResultType result_type); | 
|  | 412 | 
|  | 413 VisitorResult AttachmentIdProtoVisit(const sync_pb::AttachmentIdProto& proto, | 
|  | 414                                      const ResultType result_type); | 
|  | 415 | 
|  | 416 VisitorResult EncryptedDataVisit(const sync_pb::EncryptedData& proto, | 
|  | 417                                  const ResultType result_type) { | 
|  | 418   VisitorResult result(0); | 
|  | 419   if (result_type == CONVERT_TO_VALUE) | 
|  | 420     result.as_value.reset(new base::DictionaryValue()); | 
| 136   SET_STR(key_name); | 421   SET_STR(key_name); | 
| 137   // TODO(akalin): Shouldn't blob be of type bytes instead of string? | 422   // TODO(akalin): Shouldn't blob be of type bytes instead of string? | 
| 138   SET_BYTES(blob); | 423   SET_BYTES(blob); | 
| 139   return value; | 424   return result; | 
| 140 } | 425 } | 
| 141 | 426 | 
| 142 std::unique_ptr<base::DictionaryValue> AppSettingsToValue( | 427 VisitorResult AppSettingsVisit(const sync_pb::AppNotificationSettings& proto, | 
| 143     const sync_pb::AppNotificationSettings& proto) { | 428                                const ResultType result_type) { | 
| 144   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 429   VisitorResult result(0); | 
|  | 430   if (result_type == CONVERT_TO_VALUE) | 
|  | 431     result.as_value.reset(new base::DictionaryValue()); | 
| 145   SET_BOOL(initial_setup_done); | 432   SET_BOOL(initial_setup_done); | 
| 146   SET_BOOL(disabled); | 433   SET_BOOL(disabled); | 
| 147   SET_STR(oauth_client_id); | 434   SET_STR(oauth_client_id); | 
| 148   return value; | 435   return result; | 
| 149 } | 436 } | 
| 150 | 437 | 
| 151 std::unique_ptr<base::DictionaryValue> SessionHeaderToValue( | 438 VisitorResult SessionHeaderVisit(const sync_pb::SessionHeader& proto, | 
| 152     const sync_pb::SessionHeader& proto) { | 439                                  const ResultType result_type) { | 
| 153   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 440   VisitorResult result(0); | 
| 154   SET_REP(window, SessionWindowToValue); | 441   if (result_type == CONVERT_TO_VALUE) | 
|  | 442     result.as_value.reset(new base::DictionaryValue()); | 
|  | 443   SET_REP(window, SessionWindowVisit); | 
| 155   SET_STR(client_name); | 444   SET_STR(client_name); | 
| 156   SET_ENUM(device_type, GetDeviceTypeString); | 445   SET_ENUM(device_type, GetDeviceTypeString); | 
| 157   return value; | 446   return result; | 
| 158 } | 447 } | 
| 159 | 448 | 
| 160 std::unique_ptr<base::DictionaryValue> SessionTabToValue( | 449 VisitorResult SessionTabVisit(const sync_pb::SessionTab& proto, | 
| 161     const sync_pb::SessionTab& proto) { | 450                               const ResultType result_type) { | 
| 162   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 451   VisitorResult result(0); | 
|  | 452   if (result_type == CONVERT_TO_VALUE) | 
|  | 453     result.as_value.reset(new base::DictionaryValue()); | 
| 163   SET_INT32(tab_id); | 454   SET_INT32(tab_id); | 
| 164   SET_INT32(window_id); | 455   SET_INT32(window_id); | 
| 165   SET_INT32(tab_visual_index); | 456   SET_INT32(tab_visual_index); | 
| 166   SET_INT32(current_navigation_index); | 457   SET_INT32(current_navigation_index); | 
| 167   SET_BOOL(pinned); | 458   SET_BOOL(pinned); | 
| 168   SET_STR(extension_app_id); | 459   SET_STR(extension_app_id); | 
| 169   SET_REP(navigation, TabNavigationToValue); | 460   SET_REP(navigation, TabNavigationVisit); | 
| 170   SET_BYTES(favicon); | 461   SET_BYTES(favicon); | 
| 171   SET_ENUM(favicon_type, GetFaviconTypeString); | 462   SET_ENUM(favicon_type, GetFaviconTypeString); | 
| 172   SET_STR(favicon_source); | 463   SET_STR(favicon_source); | 
| 173   SET_REP(variation_id, MakeInt64Value); | 464   SET_REP(variation_id, MakeInt64Value); | 
| 174   return value; | 465   return result; | 
| 175 } | 466 } | 
| 176 | 467 | 
| 177 std::unique_ptr<base::DictionaryValue> SessionWindowToValue( | 468 VisitorResult SessionWindowVisit(const sync_pb::SessionWindow& proto, | 
| 178     const sync_pb::SessionWindow& proto) { | 469                                  const ResultType result_type) { | 
| 179   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 470   VisitorResult result(0); | 
|  | 471   if (result_type == CONVERT_TO_VALUE) | 
|  | 472     result.as_value.reset(new base::DictionaryValue()); | 
| 180   SET_INT32(window_id); | 473   SET_INT32(window_id); | 
| 181   SET_INT32(selected_tab_index); | 474   SET_INT32(selected_tab_index); | 
| 182   SET_INT32_REP(tab); | 475   SET_INT32_REP(tab); | 
| 183   SET_ENUM(browser_type, GetBrowserTypeString); | 476   SET_ENUM(browser_type, GetBrowserTypeString); | 
| 184   return value; | 477   return result; | 
| 185 } | 478 } | 
| 186 | 479 | 
| 187 std::unique_ptr<base::DictionaryValue> TabNavigationToValue( | 480 VisitorResult TabNavigationVisit(const sync_pb::TabNavigation& proto, | 
| 188     const sync_pb::TabNavigation& proto) { | 481                                  const ResultType result_type) { | 
| 189   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 482   VisitorResult result(0); | 
|  | 483   if (result_type == CONVERT_TO_VALUE) | 
|  | 484     result.as_value.reset(new base::DictionaryValue()); | 
| 190   SET_STR(virtual_url); | 485   SET_STR(virtual_url); | 
| 191   SET_STR(referrer); | 486   SET_STR(referrer); | 
| 192   SET_STR(title); | 487   SET_STR(title); | 
| 193   SET_ENUM(page_transition, GetPageTransitionString); | 488   SET_ENUM(page_transition, GetPageTransitionString); | 
| 194   SET_ENUM(redirect_type, GetPageTransitionRedirectTypeString); | 489   SET_ENUM(redirect_type, GetPageTransitionRedirectTypeString); | 
| 195   SET_INT32(unique_id); | 490   SET_INT32(unique_id); | 
| 196   SET_INT64(timestamp_msec); | 491   SET_INT64(timestamp_msec); | 
| 197   SET_BOOL(navigation_forward_back); | 492   SET_BOOL(navigation_forward_back); | 
| 198   SET_BOOL(navigation_from_address_bar); | 493   SET_BOOL(navigation_from_address_bar); | 
| 199   SET_BOOL(navigation_home_page); | 494   SET_BOOL(navigation_home_page); | 
| 200   SET_BOOL(navigation_chain_start); | 495   SET_BOOL(navigation_chain_start); | 
| 201   SET_BOOL(navigation_chain_end); | 496   SET_BOOL(navigation_chain_end); | 
| 202   SET_INT64(global_id); | 497   SET_INT64(global_id); | 
| 203   SET_STR(search_terms); | 498   SET_STR(search_terms); | 
| 204   SET_STR(favicon_url); | 499   SET_STR(favicon_url); | 
| 205   SET_ENUM(blocked_state, GetBlockedStateString); | 500   SET_ENUM(blocked_state, GetBlockedStateString); | 
| 206   SET_STR_REP(content_pack_categories); | 501   SET_STR_REP(content_pack_categories); | 
| 207   SET_INT32(http_status_code); | 502   SET_INT32(http_status_code); | 
| 208   SET_INT32(obsolete_referrer_policy); | 503   SET_INT32(obsolete_referrer_policy); | 
| 209   SET_BOOL(is_restored); | 504   SET_BOOL(is_restored); | 
| 210   SET_REP(navigation_redirect, NavigationRedirectToValue); | 505   SET_REP(navigation_redirect, NavigationRedirectVisit); | 
| 211   SET_STR(last_navigation_redirect_url); | 506   SET_STR(last_navigation_redirect_url); | 
| 212   SET_INT32(correct_referrer_policy); | 507   SET_INT32(correct_referrer_policy); | 
| 213   return value; | 508   return result; | 
| 214 } | 509 } | 
| 215 | 510 | 
| 216 std::unique_ptr<base::DictionaryValue> NavigationRedirectToValue( | 511 VisitorResult NavigationRedirectVisit(const sync_pb::NavigationRedirect& proto, | 
| 217     const sync_pb::NavigationRedirect& proto) { | 512                                       const ResultType result_type) { | 
| 218   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 513   VisitorResult result(0); | 
|  | 514   if (result_type == CONVERT_TO_VALUE) | 
|  | 515     result.as_value.reset(new base::DictionaryValue()); | 
| 219   SET_STR(url); | 516   SET_STR(url); | 
| 220   return value; | 517   return result; | 
| 221 } | 518 } | 
| 222 | 519 | 
| 223 std::unique_ptr<base::DictionaryValue> PasswordSpecificsDataToValue( | 520 VisitorResult PasswordSpecificsDataVisit( | 
| 224     const sync_pb::PasswordSpecificsData& proto) { | 521     const sync_pb::PasswordSpecificsData& proto, | 
| 225   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 522     const ResultType result_type) { | 
|  | 523   VisitorResult result(0); | 
|  | 524   if (result_type == CONVERT_TO_VALUE) | 
|  | 525     result.as_value.reset(new base::DictionaryValue()); | 
| 226   SET_INT32(scheme); | 526   SET_INT32(scheme); | 
| 227   SET_STR(signon_realm); | 527   SET_STR(signon_realm); | 
| 228   SET_STR(origin); | 528   SET_STR(origin); | 
| 229   SET_STR(action); | 529   SET_STR(action); | 
| 230   SET_STR(username_element); | 530   SET_STR(username_element); | 
| 231   SET_STR(username_value); | 531   SET_STR(username_value); | 
| 232   SET_STR(password_element); | 532   SET_STR(password_element); | 
| 233   value->SetString("password_value", "<redacted>"); | 533   if (result_type == CONVERT_TO_VALUE) | 
|  | 534     result.as_dict_value()->SetString("password_value", "<redacted>"); | 
| 234   SET_BOOL(ssl_valid); | 535   SET_BOOL(ssl_valid); | 
| 235   SET_BOOL(preferred); | 536   SET_BOOL(preferred); | 
| 236   SET_INT64(date_created); | 537   SET_INT64(date_created); | 
| 237   SET_BOOL(blacklisted); | 538   SET_BOOL(blacklisted); | 
| 238   SET_INT32(type); | 539   SET_INT32(type); | 
| 239   SET_INT32(times_used); | 540   SET_INT32(times_used); | 
| 240   SET_STR(display_name); | 541   SET_STR(display_name); | 
| 241   SET_STR(avatar_url); | 542   SET_STR(avatar_url); | 
| 242   SET_STR(federation_url); | 543   SET_STR(federation_url); | 
| 243   return value; | 544   return result; | 
| 244 } | 545 } | 
| 245 | 546 | 
| 246 std::unique_ptr<base::DictionaryValue> GlobalIdDirectiveToValue( | 547 VisitorResult GlobalIdDirectiveVisit(const sync_pb::GlobalIdDirective& proto, | 
| 247     const sync_pb::GlobalIdDirective& proto) { | 548                                      const ResultType result_type) { | 
| 248   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 549   VisitorResult result(0); | 
|  | 550   if (result_type == CONVERT_TO_VALUE) | 
|  | 551     result.as_value.reset(new base::DictionaryValue()); | 
| 249   SET_INT64_REP(global_id); | 552   SET_INT64_REP(global_id); | 
| 250   SET_INT64(start_time_usec); | 553   SET_INT64(start_time_usec); | 
| 251   SET_INT64(end_time_usec); | 554   SET_INT64(end_time_usec); | 
| 252   return value; | 555   return result; | 
| 253 } | 556 } | 
| 254 | 557 | 
| 255 std::unique_ptr<base::DictionaryValue> TimeRangeDirectiveToValue( | 558 VisitorResult TimeRangeDirectiveVisit(const sync_pb::TimeRangeDirective& proto, | 
| 256     const sync_pb::TimeRangeDirective& proto) { | 559                                       const ResultType result_type) { | 
| 257   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 560   VisitorResult result(0); | 
|  | 561   if (result_type == CONVERT_TO_VALUE) | 
|  | 562     result.as_value.reset(new base::DictionaryValue()); | 
| 258   SET_INT64(start_time_usec); | 563   SET_INT64(start_time_usec); | 
| 259   SET_INT64(end_time_usec); | 564   SET_INT64(end_time_usec); | 
| 260   return value; | 565   return result; | 
| 261 } | 566 } | 
| 262 | 567 | 
| 263 std::unique_ptr<base::DictionaryValue> AppListSpecificsToValue( | 568 VisitorResult AppListSpecificsVisit(const sync_pb::AppListSpecifics& proto, | 
| 264     const sync_pb::AppListSpecifics& proto) { | 569                                     const ResultType result_type) { | 
| 265   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 570   VisitorResult result(0); | 
|  | 571   if (result_type == CONVERT_TO_VALUE) | 
|  | 572     result.as_value.reset(new base::DictionaryValue()); | 
| 266   SET_STR(item_id); | 573   SET_STR(item_id); | 
| 267   SET_ENUM(item_type, GetAppListItemTypeString); | 574   SET_ENUM(item_type, GetAppListItemTypeString); | 
| 268   SET_STR(item_name); | 575   SET_STR(item_name); | 
| 269   SET_STR(parent_id); | 576   SET_STR(parent_id); | 
| 270   SET_STR(item_ordinal); | 577   SET_STR(item_ordinal); | 
| 271   SET_STR(item_pin_ordinal); | 578   SET_STR(item_pin_ordinal); | 
| 272 | 579 | 
| 273   return value; | 580   return result; | 
| 274 } | 581 } | 
| 275 | 582 | 
| 276 std::unique_ptr<base::DictionaryValue> ArcPackageSpecificsToValue( | 583 VisitorResult ArcPackageSpecificsVisit( | 
| 277     const sync_pb::ArcPackageSpecifics& proto) { | 584     const sync_pb::ArcPackageSpecifics& proto, | 
| 278   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 585     const ResultType result_type) { | 
|  | 586   VisitorResult result(0); | 
|  | 587   if (result_type == CONVERT_TO_VALUE) | 
|  | 588     result.as_value.reset(new base::DictionaryValue()); | 
| 279   SET_STR(package_name); | 589   SET_STR(package_name); | 
| 280   SET_INT32(package_version); | 590   SET_INT32(package_version); | 
| 281   SET_INT64(last_backup_android_id); | 591   SET_INT64(last_backup_android_id); | 
| 282   SET_INT64(last_backup_time); | 592   SET_INT64(last_backup_time); | 
| 283 | 593 | 
| 284   return value; | 594   return result; | 
| 285 } | 595 } | 
| 286 | 596 | 
| 287 std::unique_ptr<base::DictionaryValue> AppNotificationToValue( | 597 VisitorResult AppNotificationVisit(const sync_pb::AppNotification& proto, | 
| 288     const sync_pb::AppNotification& proto) { | 598                                    const ResultType result_type) { | 
| 289   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 599   VisitorResult result(0); | 
|  | 600   if (result_type == CONVERT_TO_VALUE) | 
|  | 601     result.as_value.reset(new base::DictionaryValue()); | 
| 290   SET_STR(guid); | 602   SET_STR(guid); | 
| 291   SET_STR(app_id); | 603   SET_STR(app_id); | 
| 292   SET_INT64(creation_timestamp_ms); | 604   SET_INT64(creation_timestamp_ms); | 
| 293   SET_STR(title); | 605   SET_STR(title); | 
| 294   SET_STR(body_text); | 606   SET_STR(body_text); | 
| 295   SET_STR(link_url); | 607   SET_STR(link_url); | 
| 296   SET_STR(link_text); | 608   SET_STR(link_text); | 
| 297   return value; | 609   return result; | 
| 298 } | 610 } | 
| 299 | 611 | 
| 300 std::unique_ptr<base::DictionaryValue> AppSettingSpecificsToValue( | 612 VisitorResult AppSettingSpecificsVisit( | 
| 301     const sync_pb::AppSettingSpecifics& proto) { | 613     const sync_pb::AppSettingSpecifics& proto, | 
| 302   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 614     const ResultType result_type) { | 
| 303   SET(extension_setting, ExtensionSettingSpecificsToValue); | 615   VisitorResult result(0); | 
| 304   return value; | 616   if (result_type == CONVERT_TO_VALUE) | 
|  | 617     result.as_value.reset(new base::DictionaryValue()); | 
|  | 618   SET(extension_setting, ExtensionSettingSpecificsVisit); | 
|  | 619   return result; | 
| 305 } | 620 } | 
| 306 | 621 | 
| 307 std::unique_ptr<base::DictionaryValue> LinkedAppIconInfoToValue( | 622 VisitorResult LinkedAppIconInfoVisit(const sync_pb::LinkedAppIconInfo& proto, | 
| 308     const sync_pb::LinkedAppIconInfo& proto) { | 623                                      const ResultType result_type) { | 
| 309   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 624   VisitorResult result(0); | 
|  | 625   if (result_type == CONVERT_TO_VALUE) | 
|  | 626     result.as_value.reset(new base::DictionaryValue()); | 
| 310   SET_STR(url); | 627   SET_STR(url); | 
| 311   SET_INT32(size); | 628   SET_INT32(size); | 
| 312   return value; | 629   return result; | 
| 313 } | 630 } | 
| 314 | 631 | 
| 315 std::unique_ptr<base::DictionaryValue> AppSpecificsToValue( | 632 VisitorResult AppSpecificsVisit(const sync_pb::AppSpecifics& proto, | 
| 316     const sync_pb::AppSpecifics& proto) { | 633                                 const ResultType result_type) { | 
| 317   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 634   VisitorResult result(0); | 
| 318   SET(extension, ExtensionSpecificsToValue); | 635   if (result_type == CONVERT_TO_VALUE) | 
| 319   SET(notification_settings, AppSettingsToValue); | 636     result.as_value.reset(new base::DictionaryValue()); | 
|  | 637   SET(extension, ExtensionSpecificsVisit); | 
|  | 638   SET(notification_settings, AppSettingsVisit); | 
| 320   SET_STR(app_launch_ordinal); | 639   SET_STR(app_launch_ordinal); | 
| 321   SET_STR(page_ordinal); | 640   SET_STR(page_ordinal); | 
| 322   SET_ENUM(launch_type, GetLaunchTypeString); | 641   SET_ENUM(launch_type, GetLaunchTypeString); | 
| 323   SET_STR(bookmark_app_url); | 642   SET_STR(bookmark_app_url); | 
| 324   SET_STR(bookmark_app_description); | 643   SET_STR(bookmark_app_description); | 
| 325   SET_STR(bookmark_app_icon_color); | 644   SET_STR(bookmark_app_icon_color); | 
| 326   SET_REP(linked_app_icons, LinkedAppIconInfoToValue); | 645   SET_REP(linked_app_icons, LinkedAppIconInfoVisit); | 
| 327 | 646 | 
| 328   return value; | 647   return result; | 
| 329 } | 648 } | 
| 330 | 649 | 
| 331 std::unique_ptr<base::DictionaryValue> AutofillSpecificsToValue( | 650 VisitorResult AutofillSpecificsVisit(const sync_pb::AutofillSpecifics& proto, | 
| 332     const sync_pb::AutofillSpecifics& proto) { | 651                                      const ResultType result_type) { | 
| 333   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 652   VisitorResult result(0); | 
|  | 653   if (result_type == CONVERT_TO_VALUE) | 
|  | 654     result.as_value.reset(new base::DictionaryValue()); | 
| 334   SET_STR(name); | 655   SET_STR(name); | 
| 335   SET_STR(value); | 656   SET_STR(value); | 
| 336   SET_INT64_REP(usage_timestamp); | 657   SET_INT64_REP(usage_timestamp); | 
| 337   SET(profile, AutofillProfileSpecificsToValue); | 658   SET(profile, AutofillProfileSpecificsVisit); | 
| 338   return value; | 659   return result; | 
| 339 } | 660 } | 
| 340 | 661 | 
| 341 std::unique_ptr<base::DictionaryValue> AutofillProfileSpecificsToValue( | 662 VisitorResult AutofillProfileSpecificsVisit( | 
| 342     const sync_pb::AutofillProfileSpecifics& proto) { | 663     const sync_pb::AutofillProfileSpecifics& proto, | 
| 343   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 664     const ResultType result_type) { | 
|  | 665   VisitorResult result(0); | 
|  | 666   if (result_type == CONVERT_TO_VALUE) | 
|  | 667     result.as_value.reset(new base::DictionaryValue()); | 
| 344   SET_STR(guid); | 668   SET_STR(guid); | 
| 345   SET_STR(origin); | 669   SET_STR(origin); | 
| 346   SET_INT64(use_count); | 670   SET_INT64(use_count); | 
| 347   SET_INT64(use_date); | 671   SET_INT64(use_date); | 
| 348 | 672 | 
| 349   SET_STR_REP(name_first); | 673   SET_STR_REP(name_first); | 
| 350   SET_STR_REP(name_middle); | 674   SET_STR_REP(name_middle); | 
| 351   SET_STR_REP(name_last); | 675   SET_STR_REP(name_last); | 
| 352   SET_STR_REP(name_full); | 676   SET_STR_REP(name_full); | 
| 353   SET_STR_REP(email_address); | 677   SET_STR_REP(email_address); | 
| 354   SET_STR(company_name); | 678   SET_STR(company_name); | 
| 355 | 679 | 
| 356   SET_STR(address_home_line1); | 680   SET_STR(address_home_line1); | 
| 357   SET_STR(address_home_line2); | 681   SET_STR(address_home_line2); | 
| 358   SET_STR(address_home_city); | 682   SET_STR(address_home_city); | 
| 359   SET_STR(address_home_state); | 683   SET_STR(address_home_state); | 
| 360   SET_STR(address_home_zip); | 684   SET_STR(address_home_zip); | 
| 361   SET_STR(address_home_country); | 685   SET_STR(address_home_country); | 
| 362 | 686 | 
| 363   SET_STR(address_home_street_address); | 687   SET_STR(address_home_street_address); | 
| 364   SET_STR(address_home_sorting_code); | 688   SET_STR(address_home_sorting_code); | 
| 365   SET_STR(address_home_dependent_locality); | 689   SET_STR(address_home_dependent_locality); | 
| 366   SET_STR(address_home_language_code); | 690   SET_STR(address_home_language_code); | 
| 367 | 691 | 
| 368   SET_STR_REP(phone_home_whole_number); | 692   SET_STR_REP(phone_home_whole_number); | 
| 369   return value; | 693   return result; | 
| 370 } | 694 } | 
| 371 | 695 | 
| 372 std::unique_ptr<base::DictionaryValue> WalletMetadataSpecificsToValue( | 696 VisitorResult WalletMetadataSpecificsVisit( | 
| 373     const sync_pb::WalletMetadataSpecifics& proto) { | 697     const sync_pb::WalletMetadataSpecifics& proto, | 
| 374   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 698     const ResultType result_type) { | 
|  | 699   VisitorResult result(0); | 
|  | 700   if (result_type == CONVERT_TO_VALUE) | 
|  | 701     result.as_value.reset(new base::DictionaryValue()); | 
| 375   SET_ENUM(type, GetWalletMetadataTypeString); | 702   SET_ENUM(type, GetWalletMetadataTypeString); | 
| 376   SET_STR(id); | 703   SET_STR(id); | 
| 377   SET_INT64(use_count); | 704   SET_INT64(use_count); | 
| 378   SET_INT64(use_date); | 705   SET_INT64(use_date); | 
| 379   return value; | 706   return result; | 
| 380 } | 707 } | 
| 381 | 708 | 
| 382 std::unique_ptr<base::DictionaryValue> AutofillWalletSpecificsToValue( | 709 VisitorResult AutofillWalletSpecificsVisit( | 
| 383     const sync_pb::AutofillWalletSpecifics& proto) { | 710     const sync_pb::AutofillWalletSpecifics& proto, | 
| 384   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 711     const ResultType result_type) { | 
|  | 712   VisitorResult result(0); | 
|  | 713   if (result_type == CONVERT_TO_VALUE) | 
|  | 714     result.as_value.reset(new base::DictionaryValue()); | 
| 385 | 715 | 
| 386   SET_ENUM(type, GetWalletInfoTypeString); | 716   SET_ENUM(type, GetWalletInfoTypeString); | 
| 387   if (proto.type() == sync_pb::AutofillWalletSpecifics::MASKED_CREDIT_CARD) { | 717   if (proto.type() == sync_pb::AutofillWalletSpecifics::MASKED_CREDIT_CARD) { | 
| 388     value->Set("masked_card", | 718     SET_WITH_EXPR(masked_card, | 
| 389                WalletMaskedCreditCardToValue(proto.masked_card())); | 719                   WalletMaskedCreditCardVisit(proto.masked_card(), result_type), | 
|  | 720                   sizeof(sync_pb::WalletMaskedCreditCard)); | 
| 390   } else if (proto.type() == sync_pb::AutofillWalletSpecifics::POSTAL_ADDRESS) { | 721   } else if (proto.type() == sync_pb::AutofillWalletSpecifics::POSTAL_ADDRESS) { | 
| 391     value->Set("address", | 722     SET_WITH_EXPR(address, | 
| 392                WalletPostalAddressToValue(proto.address())); | 723                   WalletPostalAddressVisit(proto.address(), result_type), | 
|  | 724                   sizeof(sync_pb::WalletPostalAddress)); | 
| 393   } | 725   } | 
| 394   return value; | 726   return result; | 
| 395 } | 727 } | 
| 396 | 728 | 
| 397 std::unique_ptr<base::DictionaryValue> MetaInfoToValue( | 729 VisitorResult MetaInfoVisit(const sync_pb::MetaInfo& proto, | 
| 398     const sync_pb::MetaInfo& proto) { | 730                             const ResultType result_type) { | 
| 399   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 731   VisitorResult result(0); | 
|  | 732   if (result_type == CONVERT_TO_VALUE) | 
|  | 733     result.as_value.reset(new base::DictionaryValue()); | 
| 400   SET_STR(key); | 734   SET_STR(key); | 
| 401   SET_STR(value); | 735   SET_STR(value); | 
| 402   return value; | 736   return result; | 
| 403 } | 737 } | 
| 404 | 738 | 
| 405 std::unique_ptr<base::DictionaryValue> BookmarkSpecificsToValue( | 739 VisitorResult BookmarkSpecificsVisit(const sync_pb::BookmarkSpecifics& proto, | 
| 406     const sync_pb::BookmarkSpecifics& proto) { | 740                                      const ResultType result_type) { | 
| 407   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 741   VisitorResult result(0); | 
|  | 742   if (result_type == CONVERT_TO_VALUE) | 
|  | 743     result.as_value.reset(new base::DictionaryValue()); | 
| 408   SET_STR(url); | 744   SET_STR(url); | 
| 409   SET_BYTES(favicon); | 745   SET_BYTES(favicon); | 
| 410   SET_STR(title); | 746   SET_STR(title); | 
| 411   SET_INT64(creation_time_us); | 747   SET_INT64(creation_time_us); | 
| 412   SET_STR(icon_url); | 748   SET_STR(icon_url); | 
| 413   SET_REP(meta_info, &MetaInfoToValue); | 749   SET_REP(meta_info, &MetaInfoVisit); | 
| 414   return value; | 750   return result; | 
| 415 } | 751 } | 
| 416 | 752 | 
| 417 std::unique_ptr<base::DictionaryValue> DeviceInfoSpecificsToValue( | 753 VisitorResult DeviceInfoSpecificsVisit( | 
| 418     const sync_pb::DeviceInfoSpecifics& proto) { | 754     const sync_pb::DeviceInfoSpecifics& proto, | 
| 419   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 755     const ResultType result_type) { | 
|  | 756   VisitorResult result(0); | 
|  | 757   if (result_type == CONVERT_TO_VALUE) | 
|  | 758     result.as_value.reset(new base::DictionaryValue()); | 
| 420   SET_STR(cache_guid); | 759   SET_STR(cache_guid); | 
| 421   SET_STR(client_name); | 760   SET_STR(client_name); | 
| 422   SET_ENUM(device_type, GetDeviceTypeString); | 761   SET_ENUM(device_type, GetDeviceTypeString); | 
| 423   SET_STR(sync_user_agent); | 762   SET_STR(sync_user_agent); | 
| 424   SET_STR(chrome_version); | 763   SET_STR(chrome_version); | 
| 425   SET_STR(signin_scoped_device_id); | 764   SET_STR(signin_scoped_device_id); | 
| 426   return value; | 765   return result; | 
| 427 } | 766 } | 
| 428 | 767 | 
| 429 std::unique_ptr<base::DictionaryValue> DictionarySpecificsToValue( | 768 VisitorResult DictionarySpecificsVisit( | 
| 430     const sync_pb::DictionarySpecifics& proto) { | 769     const sync_pb::DictionarySpecifics& proto, | 
| 431   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 770     const ResultType result_type) { | 
|  | 771   VisitorResult result(0); | 
|  | 772   if (result_type == CONVERT_TO_VALUE) | 
|  | 773     result.as_value.reset(new base::DictionaryValue()); | 
| 432   SET_STR(word); | 774   SET_STR(word); | 
| 433   return value; | 775   return result; | 
| 434 } | 776 } | 
| 435 | 777 | 
| 436 namespace { | 778 namespace { | 
| 437 | 779 | 
| 438 std::unique_ptr<base::DictionaryValue> FaviconSyncFlagsToValue( | 780 VisitorResult FaviconSyncFlagsVisit(const sync_pb::FaviconSyncFlags& proto, | 
| 439     const sync_pb::FaviconSyncFlags& proto) { | 781                                     const ResultType result_type) { | 
| 440   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 782   VisitorResult result(0); | 
|  | 783   if (result_type == CONVERT_TO_VALUE) | 
|  | 784     result.as_value.reset(new base::DictionaryValue()); | 
| 441   SET_BOOL(enabled); | 785   SET_BOOL(enabled); | 
| 442   SET_INT32(favicon_sync_limit); | 786   SET_INT32(favicon_sync_limit); | 
| 443   return value; | 787   return result; | 
| 444 } | 788 } | 
| 445 | 789 | 
| 446 }  // namespace | 790 }  // namespace | 
| 447 | 791 | 
| 448 std::unique_ptr<base::DictionaryValue> ExperimentsSpecificsToValue( | 792 VisitorResult ExperimentsSpecificsVisit( | 
| 449     const sync_pb::ExperimentsSpecifics& proto) { | 793     const sync_pb::ExperimentsSpecifics& proto, | 
| 450   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 794     const ResultType result_type) { | 
|  | 795   VisitorResult result(0); | 
|  | 796   if (result_type == CONVERT_TO_VALUE) | 
|  | 797     result.as_value.reset(new base::DictionaryValue()); | 
| 451   SET_EXPERIMENT_ENABLED_FIELD(keystore_encryption); | 798   SET_EXPERIMENT_ENABLED_FIELD(keystore_encryption); | 
| 452   SET_EXPERIMENT_ENABLED_FIELD(history_delete_directives); | 799   SET_EXPERIMENT_ENABLED_FIELD(history_delete_directives); | 
| 453   SET_EXPERIMENT_ENABLED_FIELD(autofill_culling); | 800   SET_EXPERIMENT_ENABLED_FIELD(autofill_culling); | 
| 454   SET_EXPERIMENT_ENABLED_FIELD(pre_commit_update_avoidance); | 801   SET_EXPERIMENT_ENABLED_FIELD(pre_commit_update_avoidance); | 
| 455   SET(favicon_sync, FaviconSyncFlagsToValue); | 802   SET(favicon_sync, FaviconSyncFlagsVisit); | 
| 456   SET_EXPERIMENT_ENABLED_FIELD(gcm_channel); | 803   SET_EXPERIMENT_ENABLED_FIELD(gcm_channel); | 
| 457   SET_EXPERIMENT_ENABLED_FIELD(gcm_invalidations); | 804   SET_EXPERIMENT_ENABLED_FIELD(gcm_invalidations); | 
| 458   return value; | 805   return result; | 
| 459 } | 806 } | 
| 460 | 807 | 
| 461 std::unique_ptr<base::DictionaryValue> ExtensionSettingSpecificsToValue( | 808 VisitorResult ExtensionSettingSpecificsVisit( | 
| 462     const sync_pb::ExtensionSettingSpecifics& proto) { | 809     const sync_pb::ExtensionSettingSpecifics& proto, | 
| 463   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 810     const ResultType result_type) { | 
|  | 811   VisitorResult result(0); | 
|  | 812   if (result_type == CONVERT_TO_VALUE) | 
|  | 813     result.as_value.reset(new base::DictionaryValue()); | 
| 464   SET_STR(extension_id); | 814   SET_STR(extension_id); | 
| 465   SET_STR(key); | 815   SET_STR(key); | 
| 466   SET_STR(value); | 816   SET_STR(value); | 
| 467   return value; | 817   return result; | 
| 468 } | 818 } | 
| 469 | 819 | 
| 470 std::unique_ptr<base::DictionaryValue> ExtensionSpecificsToValue( | 820 VisitorResult ExtensionSpecificsVisit(const sync_pb::ExtensionSpecifics& proto, | 
| 471     const sync_pb::ExtensionSpecifics& proto) { | 821                                       const ResultType result_type) { | 
| 472   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 822   VisitorResult result(0); | 
|  | 823   if (result_type == CONVERT_TO_VALUE) | 
|  | 824     result.as_value.reset(new base::DictionaryValue()); | 
| 473   SET_STR(id); | 825   SET_STR(id); | 
| 474   SET_STR(version); | 826   SET_STR(version); | 
| 475   SET_STR(update_url); | 827   SET_STR(update_url); | 
| 476   SET_BOOL(enabled); | 828   SET_BOOL(enabled); | 
| 477   SET_BOOL(incognito_enabled); | 829   SET_BOOL(incognito_enabled); | 
| 478   SET_STR(name); | 830   SET_STR(name); | 
| 479   SET_BOOL(remote_install); | 831   SET_BOOL(remote_install); | 
| 480   SET_BOOL(installed_by_custodian); | 832   SET_BOOL(installed_by_custodian); | 
| 481   SET_BOOL(all_urls_enabled); | 833   SET_BOOL(all_urls_enabled); | 
| 482   SET_INT32(disable_reasons); | 834   SET_INT32(disable_reasons); | 
| 483   return value; | 835   return result; | 
| 484 } | 836 } | 
| 485 | 837 | 
| 486 namespace { | 838 namespace { | 
| 487 std::unique_ptr<base::DictionaryValue> FaviconDataToValue( | 839 VisitorResult FaviconDataVisit(const sync_pb::FaviconData& proto, | 
| 488     const sync_pb::FaviconData& proto) { | 840                                const ResultType result_type) { | 
| 489   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 841   VisitorResult result(0); | 
|  | 842   if (result_type == CONVERT_TO_VALUE) | 
|  | 843     result.as_value.reset(new base::DictionaryValue()); | 
| 490   SET_BYTES(favicon); | 844   SET_BYTES(favicon); | 
| 491   SET_INT32(width); | 845   SET_INT32(width); | 
| 492   SET_INT32(height); | 846   SET_INT32(height); | 
| 493   return value; | 847   return result; | 
| 494 } | 848 } | 
| 495 }  // namespace | 849 }  // namespace | 
| 496 | 850 | 
| 497 std::unique_ptr<base::DictionaryValue> FaviconImageSpecificsToValue( | 851 VisitorResult FaviconImageSpecificsVisit( | 
| 498     const sync_pb::FaviconImageSpecifics& proto) { | 852     const sync_pb::FaviconImageSpecifics& proto, | 
| 499   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 853     const ResultType result_type) { | 
|  | 854   VisitorResult result(0); | 
|  | 855   if (result_type == CONVERT_TO_VALUE) | 
|  | 856     result.as_value.reset(new base::DictionaryValue()); | 
| 500   SET_STR(favicon_url); | 857   SET_STR(favicon_url); | 
| 501   SET(favicon_web, FaviconDataToValue); | 858   SET(favicon_web, FaviconDataVisit); | 
| 502   SET(favicon_web_32, FaviconDataToValue); | 859   SET(favicon_web_32, FaviconDataVisit); | 
| 503   SET(favicon_touch_64, FaviconDataToValue); | 860   SET(favicon_touch_64, FaviconDataVisit); | 
| 504   SET(favicon_touch_precomposed_64, FaviconDataToValue); | 861   SET(favicon_touch_precomposed_64, FaviconDataVisit); | 
| 505   return value; | 862   return result; | 
| 506 } | 863 } | 
| 507 | 864 | 
| 508 std::unique_ptr<base::DictionaryValue> FaviconTrackingSpecificsToValue( | 865 VisitorResult FaviconTrackingSpecificsVisit( | 
| 509     const sync_pb::FaviconTrackingSpecifics& proto) { | 866     const sync_pb::FaviconTrackingSpecifics& proto, | 
| 510   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 867     const ResultType result_type) { | 
|  | 868   VisitorResult result(0); | 
|  | 869   if (result_type == CONVERT_TO_VALUE) | 
|  | 870     result.as_value.reset(new base::DictionaryValue()); | 
| 511   SET_STR(favicon_url); | 871   SET_STR(favicon_url); | 
| 512   SET_INT64(last_visit_time_ms) | 872   SET_INT64(last_visit_time_ms) | 
| 513   SET_BOOL(is_bookmarked); | 873   SET_BOOL(is_bookmarked); | 
| 514   return value; | 874   return result; | 
| 515 } | 875 } | 
| 516 | 876 | 
| 517 std::unique_ptr<base::DictionaryValue> HistoryDeleteDirectiveSpecificsToValue( | 877 VisitorResult HistoryDeleteDirectiveSpecificsVisit( | 
| 518     const sync_pb::HistoryDeleteDirectiveSpecifics& proto) { | 878     const sync_pb::HistoryDeleteDirectiveSpecifics& proto, | 
| 519   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 879     const ResultType result_type) { | 
| 520   SET(global_id_directive, GlobalIdDirectiveToValue); | 880   VisitorResult result(0); | 
| 521   SET(time_range_directive, TimeRangeDirectiveToValue); | 881   if (result_type == CONVERT_TO_VALUE) | 
| 522   return value; | 882     result.as_value.reset(new base::DictionaryValue()); | 
|  | 883   SET(global_id_directive, GlobalIdDirectiveVisit); | 
|  | 884   SET(time_range_directive, TimeRangeDirectiveVisit); | 
|  | 885   return result; | 
| 523 } | 886 } | 
| 524 | 887 | 
| 525 std::unique_ptr<base::DictionaryValue> ManagedUserSettingSpecificsToValue( | 888 VisitorResult ManagedUserSettingSpecificsVisit( | 
| 526     const sync_pb::ManagedUserSettingSpecifics& proto) { | 889     const sync_pb::ManagedUserSettingSpecifics& proto, | 
| 527   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 890     const ResultType result_type) { | 
|  | 891   VisitorResult result(0); | 
|  | 892   if (result_type == CONVERT_TO_VALUE) | 
|  | 893     result.as_value.reset(new base::DictionaryValue()); | 
| 528   SET_STR(name); | 894   SET_STR(name); | 
| 529   SET_STR(value); | 895   SET_STR(value); | 
| 530   return value; | 896   return result; | 
| 531 } | 897 } | 
| 532 | 898 | 
| 533 std::unique_ptr<base::DictionaryValue> ManagedUserSpecificsToValue( | 899 VisitorResult ManagedUserSpecificsVisit( | 
| 534     const sync_pb::ManagedUserSpecifics& proto) { | 900     const sync_pb::ManagedUserSpecifics& proto, | 
| 535   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 901     const ResultType result_type) { | 
|  | 902   VisitorResult result(0); | 
|  | 903   if (result_type == CONVERT_TO_VALUE) | 
|  | 904     result.as_value.reset(new base::DictionaryValue()); | 
| 536   SET_STR(id); | 905   SET_STR(id); | 
| 537   SET_STR(name); | 906   SET_STR(name); | 
| 538   SET_BOOL(acknowledged); | 907   SET_BOOL(acknowledged); | 
| 539   SET_STR(master_key); | 908   SET_STR(master_key); | 
| 540   SET_STR(chrome_avatar); | 909   SET_STR(chrome_avatar); | 
| 541   SET_STR(chromeos_avatar); | 910   SET_STR(chromeos_avatar); | 
| 542   return value; | 911   return result; | 
| 543 } | 912 } | 
| 544 | 913 | 
| 545 std::unique_ptr<base::DictionaryValue> ManagedUserSharedSettingSpecificsToValue( | 914 VisitorResult ManagedUserSharedSettingSpecificsVisit( | 
| 546     const sync_pb::ManagedUserSharedSettingSpecifics& proto) { | 915     const sync_pb::ManagedUserSharedSettingSpecifics& proto, | 
| 547   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 916     const ResultType result_type) { | 
|  | 917   VisitorResult result(0); | 
|  | 918   if (result_type == CONVERT_TO_VALUE) | 
|  | 919     result.as_value.reset(new base::DictionaryValue()); | 
| 548   SET_STR(mu_id); | 920   SET_STR(mu_id); | 
| 549   SET_STR(key); | 921   SET_STR(key); | 
| 550   SET_STR(value); | 922   SET_STR(value); | 
| 551   SET_BOOL(acknowledged); | 923   SET_BOOL(acknowledged); | 
| 552   return value; | 924   return result; | 
| 553 } | 925 } | 
| 554 | 926 | 
| 555 std::unique_ptr<base::DictionaryValue> ManagedUserWhitelistSpecificsToValue( | 927 VisitorResult ManagedUserWhitelistSpecificsVisit( | 
| 556     const sync_pb::ManagedUserWhitelistSpecifics& proto) { | 928     const sync_pb::ManagedUserWhitelistSpecifics& proto, | 
| 557   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 929     const ResultType result_type) { | 
|  | 930   VisitorResult result(0); | 
|  | 931   if (result_type == CONVERT_TO_VALUE) | 
|  | 932     result.as_value.reset(new base::DictionaryValue()); | 
| 558   SET_STR(id); | 933   SET_STR(id); | 
| 559   SET_STR(name); | 934   SET_STR(name); | 
| 560   return value; | 935   return result; | 
| 561 } | 936 } | 
| 562 | 937 | 
| 563 std::unique_ptr<base::DictionaryValue> NigoriSpecificsToValue( | 938 VisitorResult NigoriSpecificsVisit(const sync_pb::NigoriSpecifics& proto, | 
| 564     const sync_pb::NigoriSpecifics& proto) { | 939                                    const ResultType result_type) { | 
| 565   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 940   VisitorResult result(0); | 
| 566   SET(encryption_keybag, EncryptedDataToValue); | 941   if (result_type == CONVERT_TO_VALUE) | 
|  | 942     result.as_value.reset(new base::DictionaryValue()); | 
|  | 943   SET(encryption_keybag, EncryptedDataVisit); | 
| 567   SET_BOOL(keybag_is_frozen); | 944   SET_BOOL(keybag_is_frozen); | 
| 568   SET_BOOL(encrypt_bookmarks); | 945   SET_BOOL(encrypt_bookmarks); | 
| 569   SET_BOOL(encrypt_preferences); | 946   SET_BOOL(encrypt_preferences); | 
| 570   SET_BOOL(encrypt_autofill_profile); | 947   SET_BOOL(encrypt_autofill_profile); | 
| 571   SET_BOOL(encrypt_autofill); | 948   SET_BOOL(encrypt_autofill); | 
| 572   SET_BOOL(encrypt_themes); | 949   SET_BOOL(encrypt_themes); | 
| 573   SET_BOOL(encrypt_typed_urls); | 950   SET_BOOL(encrypt_typed_urls); | 
| 574   SET_BOOL(encrypt_extension_settings); | 951   SET_BOOL(encrypt_extension_settings); | 
| 575   SET_BOOL(encrypt_extensions); | 952   SET_BOOL(encrypt_extensions); | 
| 576   SET_BOOL(encrypt_sessions); | 953   SET_BOOL(encrypt_sessions); | 
|  | 954   SET_BOOL(encrypt_app_notifications); | 
| 577   SET_BOOL(encrypt_app_settings); | 955   SET_BOOL(encrypt_app_settings); | 
| 578   SET_BOOL(encrypt_apps); | 956   SET_BOOL(encrypt_apps); | 
| 579   SET_BOOL(encrypt_search_engines); | 957   SET_BOOL(encrypt_search_engines); | 
| 580   SET_BOOL(encrypt_dictionary); | 958   SET_BOOL(encrypt_dictionary); | 
|  | 959   SET_BOOL(encrypt_favicon_images); | 
|  | 960   SET_BOOL(encrypt_favicon_tracking); | 
| 581   SET_BOOL(encrypt_articles); | 961   SET_BOOL(encrypt_articles); | 
| 582   SET_BOOL(encrypt_app_list); | 962   SET_BOOL(encrypt_app_list); | 
|  | 963   SET_BOOL(encrypt_autofill_wallet_metadata); | 
| 583   SET_BOOL(encrypt_arc_package); | 964   SET_BOOL(encrypt_arc_package); | 
| 584   SET_BOOL(encrypt_everything); | 965   SET_BOOL(encrypt_everything); | 
| 585   SET_BOOL(server_only_was_missing_keystore_migration_time); | 966   SET_BOOL(server_only_was_missing_keystore_migration_time); | 
| 586   SET_BOOL(sync_tab_favicons); | 967   SET_BOOL(sync_tab_favicons); | 
| 587   SET_ENUM(passphrase_type, PassphraseTypeString); | 968   SET_ENUM(passphrase_type, PassphraseTypeString); | 
| 588   SET(keystore_decryptor_token, EncryptedDataToValue); | 969   SET(keystore_decryptor_token, EncryptedDataVisit); | 
| 589   SET_INT64(keystore_migration_time); | 970   SET_INT64(keystore_migration_time); | 
| 590   SET_INT64(custom_passphrase_time); | 971   SET_INT64(custom_passphrase_time); | 
| 591   return value; | 972   return result; | 
| 592 } | 973 } | 
| 593 | 974 | 
| 594 std::unique_ptr<base::DictionaryValue> ArticlePageToValue( | 975 VisitorResult ArticlePageVisit(const sync_pb::ArticlePage& proto, | 
| 595     const sync_pb::ArticlePage& proto) { | 976                                const ResultType result_type) { | 
| 596   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 977   VisitorResult result(0); | 
|  | 978   if (result_type == CONVERT_TO_VALUE) | 
|  | 979     result.as_value.reset(new base::DictionaryValue()); | 
| 597   SET_STR(url); | 980   SET_STR(url); | 
| 598   return value; | 981   return result; | 
| 599 } | 982 } | 
| 600 | 983 | 
| 601 std::unique_ptr<base::DictionaryValue> ArticleSpecificsToValue( | 984 VisitorResult ArticleSpecificsVisit(const sync_pb::ArticleSpecifics& proto, | 
| 602     const sync_pb::ArticleSpecifics& proto) { | 985                                     const ResultType result_type) { | 
| 603   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 986   VisitorResult result(0); | 
|  | 987   if (result_type == CONVERT_TO_VALUE) | 
|  | 988     result.as_value.reset(new base::DictionaryValue()); | 
| 604   SET_STR(entry_id); | 989   SET_STR(entry_id); | 
| 605   SET_STR(title); | 990   SET_STR(title); | 
| 606   SET_REP(pages, ArticlePageToValue); | 991   SET_REP(pages, ArticlePageVisit); | 
| 607   return value; | 992   return result; | 
| 608 } | 993 } | 
| 609 | 994 | 
| 610 std::unique_ptr<base::DictionaryValue> PasswordSpecificsToValue( | 995 VisitorResult PasswordSpecificsVisit(const sync_pb::PasswordSpecifics& proto, | 
| 611     const sync_pb::PasswordSpecifics& proto) { | 996                                      const ResultType result_type) { | 
| 612   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 997   VisitorResult result(0); | 
| 613   SET(encrypted, EncryptedDataToValue); | 998   if (result_type == CONVERT_TO_VALUE) | 
| 614   return value; | 999     result.as_value.reset(new base::DictionaryValue()); | 
|  | 1000   SET(encrypted, EncryptedDataVisit); | 
|  | 1001   return result; | 
| 615 } | 1002 } | 
| 616 | 1003 | 
| 617 std::unique_ptr<base::DictionaryValue> PreferenceSpecificsToValue( | 1004 VisitorResult PreferenceSpecificsVisit( | 
| 618     const sync_pb::PreferenceSpecifics& proto) { | 1005     const sync_pb::PreferenceSpecifics& proto, | 
| 619   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1006     const ResultType result_type) { | 
|  | 1007   VisitorResult result(0); | 
|  | 1008   if (result_type == CONVERT_TO_VALUE) | 
|  | 1009     result.as_value.reset(new base::DictionaryValue()); | 
| 620   SET_STR(name); | 1010   SET_STR(name); | 
| 621   SET_STR(value); | 1011   SET_STR(value); | 
| 622   return value; | 1012   return result; | 
| 623 } | 1013 } | 
| 624 | 1014 | 
| 625 std::unique_ptr<base::DictionaryValue> PriorityPreferenceSpecificsToValue( | 1015 VisitorResult PriorityPreferenceSpecificsVisit( | 
| 626     const sync_pb::PriorityPreferenceSpecifics& specifics) { | 1016     const sync_pb::PriorityPreferenceSpecifics& specifics, | 
| 627   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1017     const ResultType result_type) { | 
| 628   SET_FIELD(preference, PreferenceSpecificsToValue); | 1018   VisitorResult result(0); | 
| 629   return value; | 1019   if (result_type == CONVERT_TO_VALUE) | 
|  | 1020     result.as_value.reset(new base::DictionaryValue()); | 
|  | 1021   SET_FIELD(preference, PreferenceSpecificsVisit); | 
|  | 1022   return result; | 
| 630 } | 1023 } | 
| 631 | 1024 | 
| 632 std::unique_ptr<base::DictionaryValue> | 1025 VisitorResult SyncedNotificationAppInfoSpecificsVisit( | 
| 633 SyncedNotificationAppInfoSpecificsToValue( | 1026     const sync_pb::SyncedNotificationAppInfoSpecifics& proto, | 
| 634     const sync_pb::SyncedNotificationAppInfoSpecifics& proto) { | 1027     const ResultType result_type) { | 
| 635   return base::WrapUnique(new base::DictionaryValue()); | 1028   if (result_type == MEMORY_USAGE) | 
|  | 1029     return VisitorResult(sizeof(sync_pb::SyncedNotificationAppInfoSpecifics)); | 
|  | 1030   return VisitorResult(base::WrapUnique(new base::DictionaryValue())); | 
| 636 } | 1031 } | 
| 637 | 1032 | 
| 638 std::unique_ptr<base::DictionaryValue> SyncedNotificationSpecificsToValue( | 1033 VisitorResult SyncedNotificationSpecificsVisit( | 
| 639     const sync_pb::SyncedNotificationSpecifics& proto) { | 1034     const sync_pb::SyncedNotificationSpecifics& proto, | 
| 640   return base::WrapUnique(new base::DictionaryValue()); | 1035     const ResultType result_type) { | 
|  | 1036   if (result_type == MEMORY_USAGE) | 
|  | 1037     return VisitorResult(sizeof(sync_pb::SyncedNotificationSpecifics)); | 
|  | 1038   return VisitorResult(base::WrapUnique(new base::DictionaryValue())); | 
| 641 } | 1039 } | 
| 642 | 1040 | 
| 643 std::unique_ptr<base::DictionaryValue> SearchEngineSpecificsToValue( | 1041 VisitorResult SearchEngineSpecificsVisit( | 
| 644     const sync_pb::SearchEngineSpecifics& proto) { | 1042     const sync_pb::SearchEngineSpecifics& proto, | 
| 645   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1043     const ResultType result_type) { | 
|  | 1044   VisitorResult result(0); | 
|  | 1045   if (result_type == CONVERT_TO_VALUE) | 
|  | 1046     result.as_value.reset(new base::DictionaryValue()); | 
| 646   SET_STR(short_name); | 1047   SET_STR(short_name); | 
| 647   SET_STR(keyword); | 1048   SET_STR(keyword); | 
| 648   SET_STR(favicon_url); | 1049   SET_STR(favicon_url); | 
| 649   SET_STR(url); | 1050   SET_STR(url); | 
| 650   SET_BOOL(safe_for_autoreplace); | 1051   SET_BOOL(safe_for_autoreplace); | 
| 651   SET_STR(originating_url); | 1052   SET_STR(originating_url); | 
| 652   SET_INT64(date_created); | 1053   SET_INT64(date_created); | 
| 653   SET_STR(input_encodings); | 1054   SET_STR(input_encodings); | 
| 654   SET_BOOL(show_in_default_list); | 1055   SET_BOOL(show_in_default_list); | 
| 655   SET_STR(suggestions_url); | 1056   SET_STR(suggestions_url); | 
| 656   SET_INT32(prepopulate_id); | 1057   SET_INT32(prepopulate_id); | 
| 657   SET_BOOL(autogenerate_keyword); | 1058   SET_BOOL(autogenerate_keyword); | 
| 658   SET_STR(instant_url); | 1059   SET_STR(instant_url); | 
| 659   SET_INT64(last_modified); | 1060   SET_INT64(last_modified); | 
| 660   SET_STR(sync_guid); | 1061   SET_STR(sync_guid); | 
| 661   SET_STR_REP(alternate_urls); | 1062   SET_STR_REP(alternate_urls); | 
| 662   SET_STR(search_terms_replacement_key); | 1063   SET_STR(search_terms_replacement_key); | 
| 663   SET_STR(image_url); | 1064   SET_STR(image_url); | 
| 664   SET_STR(search_url_post_params); | 1065   SET_STR(search_url_post_params); | 
| 665   SET_STR(suggestions_url_post_params); | 1066   SET_STR(suggestions_url_post_params); | 
| 666   SET_STR(instant_url_post_params); | 1067   SET_STR(instant_url_post_params); | 
| 667   SET_STR(image_url_post_params); | 1068   SET_STR(image_url_post_params); | 
| 668   SET_STR(new_tab_url); | 1069   SET_STR(new_tab_url); | 
| 669   return value; | 1070   return result; | 
| 670 } | 1071 } | 
| 671 | 1072 | 
| 672 std::unique_ptr<base::DictionaryValue> SessionSpecificsToValue( | 1073 VisitorResult SessionSpecificsVisit(const sync_pb::SessionSpecifics& proto, | 
| 673     const sync_pb::SessionSpecifics& proto) { | 1074                                     const ResultType result_type) { | 
| 674   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1075   VisitorResult result(0); | 
|  | 1076   if (result_type == CONVERT_TO_VALUE) | 
|  | 1077     result.as_value.reset(new base::DictionaryValue()); | 
| 675   SET_STR(session_tag); | 1078   SET_STR(session_tag); | 
| 676   SET(header, SessionHeaderToValue); | 1079   SET(header, SessionHeaderVisit); | 
| 677   SET(tab, SessionTabToValue); | 1080   SET(tab, SessionTabVisit); | 
| 678   SET_INT32(tab_node_id); | 1081   SET_INT32(tab_node_id); | 
| 679   return value; | 1082   return result; | 
| 680 } | 1083 } | 
| 681 | 1084 | 
| 682 std::unique_ptr<base::DictionaryValue> ThemeSpecificsToValue( | 1085 VisitorResult ThemeSpecificsVisit(const sync_pb::ThemeSpecifics& proto, | 
| 683     const sync_pb::ThemeSpecifics& proto) { | 1086                                   const ResultType result_type) { | 
| 684   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1087   VisitorResult result(0); | 
|  | 1088   if (result_type == CONVERT_TO_VALUE) | 
|  | 1089     result.as_value.reset(new base::DictionaryValue()); | 
| 685   SET_BOOL(use_custom_theme); | 1090   SET_BOOL(use_custom_theme); | 
| 686   SET_BOOL(use_system_theme_by_default); | 1091   SET_BOOL(use_system_theme_by_default); | 
| 687   SET_STR(custom_theme_name); | 1092   SET_STR(custom_theme_name); | 
| 688   SET_STR(custom_theme_id); | 1093   SET_STR(custom_theme_id); | 
| 689   SET_STR(custom_theme_update_url); | 1094   SET_STR(custom_theme_update_url); | 
| 690   return value; | 1095   return result; | 
| 691 } | 1096 } | 
| 692 | 1097 | 
| 693 std::unique_ptr<base::DictionaryValue> TypedUrlSpecificsToValue( | 1098 VisitorResult TypedUrlSpecificsVisit(const sync_pb::TypedUrlSpecifics& proto, | 
| 694     const sync_pb::TypedUrlSpecifics& proto) { | 1099                                      const ResultType result_type) { | 
| 695   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1100   VisitorResult result(0); | 
|  | 1101   if (result_type == CONVERT_TO_VALUE) | 
|  | 1102     result.as_value.reset(new base::DictionaryValue()); | 
| 696   SET_STR(url); | 1103   SET_STR(url); | 
| 697   SET_STR(title); | 1104   SET_STR(title); | 
| 698   SET_BOOL(hidden); | 1105   SET_BOOL(hidden); | 
| 699   SET_INT64_REP(visits); | 1106   SET_INT64_REP(visits); | 
| 700   SET_INT32_REP(visit_transitions); | 1107   SET_INT32_REP(visit_transitions); | 
| 701   return value; | 1108   return result; | 
| 702 } | 1109 } | 
| 703 | 1110 | 
| 704 std::unique_ptr<base::DictionaryValue> WalletMaskedCreditCardToValue( | 1111 VisitorResult WalletMaskedCreditCardVisit( | 
| 705     const sync_pb::WalletMaskedCreditCard& proto) { | 1112     const sync_pb::WalletMaskedCreditCard& proto, | 
| 706   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1113     const ResultType result_type) { | 
|  | 1114   VisitorResult result(0); | 
|  | 1115   if (result_type == CONVERT_TO_VALUE) | 
|  | 1116     result.as_value.reset(new base::DictionaryValue()); | 
| 707   SET_STR(id); | 1117   SET_STR(id); | 
| 708   SET_ENUM(status, GetWalletCardStatusString); | 1118   SET_ENUM(status, GetWalletCardStatusString); | 
| 709   SET_STR(name_on_card); | 1119   SET_STR(name_on_card); | 
| 710   SET_ENUM(type, GetWalletCardTypeString); | 1120   SET_ENUM(type, GetWalletCardTypeString); | 
| 711   SET_STR(last_four); | 1121   SET_STR(last_four); | 
| 712   SET_INT32(exp_month); | 1122   SET_INT32(exp_month); | 
| 713   SET_INT32(exp_year); | 1123   SET_INT32(exp_year); | 
| 714   SET_STR(billing_address_id); | 1124   SET_STR(billing_address_id); | 
| 715   return value; | 1125   return result; | 
| 716 } | 1126 } | 
| 717 | 1127 | 
| 718 std::unique_ptr<base::DictionaryValue> WalletPostalAddressToValue( | 1128 VisitorResult WalletPostalAddressVisit( | 
| 719     const sync_pb::WalletPostalAddress& proto) { | 1129     const sync_pb::WalletPostalAddress& proto, | 
| 720   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1130     const ResultType result_type) { | 
|  | 1131   VisitorResult result(0); | 
|  | 1132   if (result_type == CONVERT_TO_VALUE) | 
|  | 1133     result.as_value.reset(new base::DictionaryValue()); | 
| 721   SET_STR(id); | 1134   SET_STR(id); | 
| 722   SET_STR(recipient_name); | 1135   SET_STR(recipient_name); | 
| 723   SET_STR(company_name); | 1136   SET_STR(company_name); | 
| 724   SET_STR_REP(street_address); | 1137   SET_STR_REP(street_address); | 
| 725   SET_STR(address_1); | 1138   SET_STR(address_1); | 
| 726   SET_STR(address_2); | 1139   SET_STR(address_2); | 
| 727   SET_STR(address_3); | 1140   SET_STR(address_3); | 
| 728   SET_STR(address_4); | 1141   SET_STR(address_4); | 
| 729   SET_STR(postal_code); | 1142   SET_STR(postal_code); | 
| 730   SET_STR(sorting_code); | 1143   SET_STR(sorting_code); | 
| 731   SET_STR(country_code); | 1144   SET_STR(country_code); | 
| 732   SET_STR(phone_number); | 1145   SET_STR(phone_number); | 
| 733   SET_STR(language_code); | 1146   SET_STR(language_code); | 
| 734   return value; | 1147   return result; | 
| 735 } | 1148 } | 
| 736 | 1149 | 
| 737 std::unique_ptr<base::DictionaryValue> WifiCredentialSpecificsToValue( | 1150 VisitorResult WifiCredentialSpecificsVisit( | 
| 738     const sync_pb::WifiCredentialSpecifics& proto) { | 1151     const sync_pb::WifiCredentialSpecifics& proto, | 
| 739   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1152     const ResultType result_type) { | 
|  | 1153   VisitorResult result(0); | 
|  | 1154   if (result_type == CONVERT_TO_VALUE) | 
|  | 1155     result.as_value.reset(new base::DictionaryValue()); | 
| 740   SET_BYTES(ssid); | 1156   SET_BYTES(ssid); | 
| 741   SET_ENUM(security_class, GetWifiCredentialSecurityClassString); | 1157   SET_ENUM(security_class, GetWifiCredentialSecurityClassString); | 
| 742   SET_BYTES(passphrase); | 1158   SET_BYTES(passphrase); | 
| 743   return value; | 1159   return result; | 
| 744 } | 1160 } | 
| 745 | 1161 | 
| 746 std::unique_ptr<base::DictionaryValue> EntitySpecificsToValue( | 1162 VisitorResult EntitySpecificsVisit(const sync_pb::EntitySpecifics& specifics, | 
| 747     const sync_pb::EntitySpecifics& specifics) { | 1163                                    const ResultType result_type) { | 
| 748   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1164   VisitorResult result(0); | 
| 749   SET_FIELD(app, AppSpecificsToValue); | 1165   if (result_type == CONVERT_TO_VALUE) | 
| 750   SET_FIELD(app_list, AppListSpecificsToValue); | 1166     result.as_value.reset(new base::DictionaryValue()); | 
| 751   SET_FIELD(app_notification, AppNotificationToValue); | 1167   SET_FIELD(app, AppSpecificsVisit); | 
| 752   SET_FIELD(app_setting, AppSettingSpecificsToValue); | 1168   SET_FIELD(app_list, AppListSpecificsVisit); | 
| 753   SET_FIELD(arc_package, ArcPackageSpecificsToValue); | 1169   SET_FIELD(app_notification, AppNotificationVisit); | 
| 754   SET_FIELD(article, ArticleSpecificsToValue); | 1170   SET_FIELD(app_setting, AppSettingSpecificsVisit); | 
| 755   SET_FIELD(autofill, AutofillSpecificsToValue); | 1171   SET_FIELD(arc_package, ArcPackageSpecificsVisit); | 
| 756   SET_FIELD(autofill_profile, AutofillProfileSpecificsToValue); | 1172   SET_FIELD(article, ArticleSpecificsVisit); | 
| 757   SET_FIELD(autofill_wallet, AutofillWalletSpecificsToValue); | 1173   SET_FIELD(autofill, AutofillSpecificsVisit); | 
| 758   SET_FIELD(wallet_metadata, WalletMetadataSpecificsToValue); | 1174   SET_FIELD(autofill_profile, AutofillProfileSpecificsVisit); | 
| 759   SET_FIELD(bookmark, BookmarkSpecificsToValue); | 1175   SET_FIELD(autofill_wallet, AutofillWalletSpecificsVisit); | 
| 760   SET_FIELD(device_info, DeviceInfoSpecificsToValue); | 1176   SET_FIELD(wallet_metadata, WalletMetadataSpecificsVisit); | 
| 761   SET_FIELD(dictionary, DictionarySpecificsToValue); | 1177   SET_FIELD(bookmark, BookmarkSpecificsVisit); | 
| 762   SET_FIELD(experiments, ExperimentsSpecificsToValue); | 1178   SET_FIELD(device_info, DeviceInfoSpecificsVisit); | 
| 763   SET_FIELD(extension, ExtensionSpecificsToValue); | 1179   SET_FIELD(dictionary, DictionarySpecificsVisit); | 
| 764   SET_FIELD(extension_setting, ExtensionSettingSpecificsToValue); | 1180   SET_FIELD(experiments, ExperimentsSpecificsVisit); | 
| 765   SET_FIELD(favicon_image, FaviconImageSpecificsToValue); | 1181   SET_FIELD(extension, ExtensionSpecificsVisit); | 
| 766   SET_FIELD(favicon_tracking, FaviconTrackingSpecificsToValue); | 1182   SET_FIELD(extension_setting, ExtensionSettingSpecificsVisit); | 
| 767   SET_FIELD(history_delete_directive, HistoryDeleteDirectiveSpecificsToValue); | 1183   SET_FIELD(favicon_image, FaviconImageSpecificsVisit); | 
| 768   SET_FIELD(managed_user_setting, ManagedUserSettingSpecificsToValue); | 1184   SET_FIELD(favicon_tracking, FaviconTrackingSpecificsVisit); | 
|  | 1185   SET_FIELD(history_delete_directive, HistoryDeleteDirectiveSpecificsVisit); | 
|  | 1186   SET_FIELD(managed_user_setting, ManagedUserSettingSpecificsVisit); | 
| 769   SET_FIELD(managed_user_shared_setting, | 1187   SET_FIELD(managed_user_shared_setting, | 
| 770             ManagedUserSharedSettingSpecificsToValue); | 1188             ManagedUserSharedSettingSpecificsVisit); | 
| 771   SET_FIELD(managed_user, ManagedUserSpecificsToValue); | 1189   SET_FIELD(managed_user, ManagedUserSpecificsVisit); | 
| 772   SET_FIELD(managed_user_whitelist, ManagedUserWhitelistSpecificsToValue); | 1190   SET_FIELD(managed_user_whitelist, ManagedUserWhitelistSpecificsVisit); | 
| 773   SET_FIELD(nigori, NigoriSpecificsToValue); | 1191   SET_FIELD(nigori, NigoriSpecificsVisit); | 
| 774   SET_FIELD(password, PasswordSpecificsToValue); | 1192   SET_FIELD(password, PasswordSpecificsVisit); | 
| 775   SET_FIELD(preference, PreferenceSpecificsToValue); | 1193   SET_FIELD(preference, PreferenceSpecificsVisit); | 
| 776   SET_FIELD(priority_preference, PriorityPreferenceSpecificsToValue); | 1194   SET_FIELD(priority_preference, PriorityPreferenceSpecificsVisit); | 
| 777   SET_FIELD(search_engine, SearchEngineSpecificsToValue); | 1195   SET_FIELD(search_engine, SearchEngineSpecificsVisit); | 
| 778   SET_FIELD(session, SessionSpecificsToValue); | 1196   SET_FIELD(session, SessionSpecificsVisit); | 
| 779   SET_FIELD(synced_notification, SyncedNotificationSpecificsToValue); | 1197   SET_FIELD(synced_notification, SyncedNotificationSpecificsVisit); | 
| 780   SET_FIELD(synced_notification_app_info, | 1198   SET_FIELD(synced_notification_app_info, | 
| 781             SyncedNotificationAppInfoSpecificsToValue); | 1199             SyncedNotificationAppInfoSpecificsVisit); | 
| 782   SET_FIELD(theme, ThemeSpecificsToValue); | 1200   SET_FIELD(theme, ThemeSpecificsVisit); | 
| 783   SET_FIELD(typed_url, TypedUrlSpecificsToValue); | 1201   SET_FIELD(typed_url, TypedUrlSpecificsVisit); | 
| 784   SET_FIELD(wifi_credential, WifiCredentialSpecificsToValue); | 1202   SET_FIELD(wifi_credential, WifiCredentialSpecificsVisit); | 
| 785   return value; | 1203   return result; | 
| 786 } | 1204 } | 
| 787 | 1205 | 
| 788 namespace { | 1206 namespace { | 
| 789 | 1207 | 
| 790 base::StringValue* UniquePositionToStringValue( | 1208 VisitorResult UniquePositionToStringValue(const sync_pb::UniquePosition& proto, | 
| 791     const sync_pb::UniquePosition& proto) { | 1209                                           const ResultType result_type) { | 
|  | 1210   if (result_type == MEMORY_USAGE) { | 
|  | 1211     VisitorResult result(0); | 
|  | 1212     SET_STR(compressed_value); | 
|  | 1213     SET_STR(custom_compressed_v1); | 
|  | 1214     return result; | 
|  | 1215   } | 
| 792   UniquePosition pos = UniquePosition::FromProto(proto); | 1216   UniquePosition pos = UniquePosition::FromProto(proto); | 
| 793   return new base::StringValue(pos.ToDebugString()); | 1217   return VisitorResult( | 
|  | 1218       base::WrapUnique(new base::StringValue(pos.ToDebugString()))); | 
| 794 } | 1219 } | 
| 795 | 1220 | 
| 796 }  // namespace | 1221 }  // namespace | 
| 797 | 1222 | 
| 798 std::unique_ptr<base::DictionaryValue> SyncEntityToValue( | 1223 VisitorResult SyncEntityVisit(const sync_pb::SyncEntity& proto, | 
| 799     const sync_pb::SyncEntity& proto, | 1224                               bool include_specifics, | 
| 800     bool include_specifics) { | 1225                               const ResultType result_type) { | 
| 801   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1226   VisitorResult result(0); | 
|  | 1227   if (result_type == CONVERT_TO_VALUE) | 
|  | 1228     result.as_value.reset(new base::DictionaryValue()); | 
| 802   SET_STR(id_string); | 1229   SET_STR(id_string); | 
| 803   SET_STR(parent_id_string); | 1230   SET_STR(parent_id_string); | 
| 804   SET_STR(old_parent_id); | 1231   SET_STR(old_parent_id); | 
| 805   SET_INT64(version); | 1232   SET_INT64(version); | 
| 806   SET_INT64(mtime); | 1233   SET_INT64(mtime); | 
| 807   SET_INT64(ctime); | 1234   SET_INT64(ctime); | 
| 808   SET_STR(name); | 1235   SET_STR(name); | 
| 809   SET_STR(non_unique_name); | 1236   SET_STR(non_unique_name); | 
| 810   SET_INT64(sync_timestamp); | 1237   SET_INT64(sync_timestamp); | 
| 811   SET_STR(server_defined_unique_tag); | 1238   SET_STR(server_defined_unique_tag); | 
| 812   SET_INT64(position_in_parent); | 1239   SET_INT64(position_in_parent); | 
| 813   SET(unique_position, UniquePositionToStringValue); | 1240   SET(unique_position, UniquePositionToStringValue); | 
| 814   SET_STR(insert_after_item_id); | 1241   SET_STR(insert_after_item_id); | 
| 815   SET_BOOL(deleted); | 1242   SET_BOOL(deleted); | 
| 816   SET_STR(originator_cache_guid); | 1243   SET_STR(originator_cache_guid); | 
| 817   SET_STR(originator_client_item_id); | 1244   SET_STR(originator_client_item_id); | 
| 818   if (include_specifics) | 1245   if (include_specifics) | 
| 819     SET(specifics, EntitySpecificsToValue); | 1246     SET(specifics, EntitySpecificsVisit); | 
| 820   SET_BOOL(folder); | 1247   SET_BOOL(folder); | 
| 821   SET_STR(client_defined_unique_tag); | 1248   SET_STR(client_defined_unique_tag); | 
| 822   SET_REP(attachment_id, AttachmentIdProtoToValue); | 1249   SET_REP(attachment_id, AttachmentIdProtoVisit); | 
| 823   return value; | 1250   return result; | 
| 824 } | 1251 } | 
| 825 | 1252 | 
| 826 namespace { | 1253 namespace { | 
| 827 | 1254 | 
| 828 base::ListValue* SyncEntitiesToValue( | 1255 VisitorResult SyncEntitiesVisit( | 
| 829     const ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>& entities, | 1256     const ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>& entities, | 
| 830     bool include_specifics) { | 1257     bool include_specifics, | 
| 831   base::ListValue* list = new base::ListValue(); | 1258     const ResultType result_type) { | 
| 832   ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>::const_iterator it; | 1259   ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>::const_iterator it; | 
|  | 1260   if (result_type == MEMORY_USAGE) { | 
|  | 1261     size_t total = 0; | 
|  | 1262     for (it = entities.begin(); it != entities.end(); ++it) { | 
|  | 1263       total += | 
|  | 1264           SyncEntityVisit(*it, include_specifics, result_type).memory_usage + | 
|  | 1265           sizeof(sync_pb::SyncEntity); | 
|  | 1266     } | 
|  | 1267     return VisitorResult(total); | 
|  | 1268   } | 
|  | 1269   std::unique_ptr<base::ListValue> list(new base::ListValue()); | 
| 833   for (it = entities.begin(); it != entities.end(); ++it) { | 1270   for (it = entities.begin(); it != entities.end(); ++it) { | 
| 834     list->Append(SyncEntityToValue(*it, include_specifics)); | 1271     list->Append(SyncEntityVisit(*it, include_specifics, result_type).as_value); | 
| 835   } | 1272   } | 
| 836 | 1273   return VisitorResult(std::move(list)); | 
| 837   return list; |  | 
| 838 } | 1274 } | 
| 839 | 1275 | 
| 840 std::unique_ptr<base::DictionaryValue> ChromiumExtensionActivityToValue( | 1276 VisitorResult ChromiumExtensionActivityVisit( | 
| 841     const sync_pb::ChromiumExtensionsActivity& proto) { | 1277     const sync_pb::ChromiumExtensionsActivity& proto, | 
| 842   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1278     const ResultType result_type) { | 
|  | 1279   VisitorResult result(0); | 
|  | 1280   if (result_type == CONVERT_TO_VALUE) | 
|  | 1281     result.as_value.reset(new base::DictionaryValue()); | 
| 843   SET_STR(extension_id); | 1282   SET_STR(extension_id); | 
| 844   SET_INT32(bookmark_writes_since_last_commit); | 1283   SET_INT32(bookmark_writes_since_last_commit); | 
| 845   return value; | 1284   return result; | 
| 846 } | 1285 } | 
| 847 | 1286 | 
| 848 std::unique_ptr<base::DictionaryValue> CommitMessageToValue( | 1287 VisitorResult CommitMessageVisit(const sync_pb::CommitMessage& proto, | 
| 849     const sync_pb::CommitMessage& proto, | 1288                                  bool include_specifics, | 
| 850     bool include_specifics) { | 1289                                  const ResultType result_type) { | 
| 851   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1290   VisitorResult result(0); | 
| 852   value->Set("entries", | 1291   if (result_type == CONVERT_TO_VALUE) | 
| 853              SyncEntitiesToValue(proto.entries(), include_specifics)); | 1292     result.as_value.reset(new base::DictionaryValue()); | 
|  | 1293   SET_WITH_EXPR( | 
|  | 1294       entries, | 
|  | 1295       SyncEntitiesVisit(proto.entries(), include_specifics, result_type), 0); | 
| 854   SET_STR(cache_guid); | 1296   SET_STR(cache_guid); | 
| 855   SET_REP(extensions_activity, ChromiumExtensionActivityToValue); | 1297   SET_REP(extensions_activity, ChromiumExtensionActivityVisit); | 
| 856   SET(config_params, ClientConfigParamsToValue); | 1298   SET(config_params, ClientConfigParamsVisit); | 
| 857   return value; | 1299   return result; | 
| 858 } | 1300 } | 
| 859 | 1301 | 
| 860 std::unique_ptr<base::DictionaryValue> GetUpdateTriggersToValue( | 1302 VisitorResult GetUpdateTriggersVisit(const sync_pb::GetUpdateTriggers& proto, | 
| 861     const sync_pb::GetUpdateTriggers& proto) { | 1303                                      const ResultType result_type) { | 
| 862   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1304   VisitorResult result(0); | 
|  | 1305   if (result_type == CONVERT_TO_VALUE) | 
|  | 1306     result.as_value.reset(new base::DictionaryValue()); | 
| 863   SET_STR_REP(notification_hint); | 1307   SET_STR_REP(notification_hint); | 
| 864   SET_BOOL(client_dropped_hints); | 1308   SET_BOOL(client_dropped_hints); | 
| 865   SET_BOOL(invalidations_out_of_sync); | 1309   SET_BOOL(invalidations_out_of_sync); | 
| 866   SET_INT64(local_modification_nudges); | 1310   SET_INT64(local_modification_nudges); | 
| 867   SET_INT64(datatype_refresh_nudges); | 1311   SET_INT64(datatype_refresh_nudges); | 
| 868   return value; | 1312   return result; | 
| 869 } | 1313 } | 
| 870 | 1314 | 
| 871 std::unique_ptr<base::DictionaryValue> DataTypeProgressMarkerToValue( | 1315 VisitorResult DataTypeProgressMarkerVisit( | 
| 872     const sync_pb::DataTypeProgressMarker& proto) { | 1316     const sync_pb::DataTypeProgressMarker& proto, | 
| 873   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1317     const ResultType result_type) { | 
|  | 1318   VisitorResult result(0); | 
|  | 1319   if (result_type == CONVERT_TO_VALUE) | 
|  | 1320     result.as_value.reset(new base::DictionaryValue()); | 
| 874   SET_INT32(data_type_id); | 1321   SET_INT32(data_type_id); | 
| 875   SET_BYTES(token); | 1322   SET_BYTES(token); | 
| 876   SET_INT64(timestamp_token_for_migration); | 1323   SET_INT64(timestamp_token_for_migration); | 
| 877   SET_STR(notification_hint); | 1324   SET_STR(notification_hint); | 
| 878   SET(get_update_triggers, GetUpdateTriggersToValue); | 1325   SET(get_update_triggers, GetUpdateTriggersVisit); | 
| 879   return value; | 1326   return result; | 
| 880 } | 1327 } | 
| 881 | 1328 | 
| 882 std::unique_ptr<base::DictionaryValue> DataTypeContextToValue( | 1329 VisitorResult DataTypeContextVisit(const sync_pb::DataTypeContext& proto, | 
| 883     const sync_pb::DataTypeContext& proto) { | 1330                                    const ResultType result_type) { | 
| 884   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1331   VisitorResult result(0); | 
|  | 1332   if (result_type == CONVERT_TO_VALUE) | 
|  | 1333     result.as_value.reset(new base::DictionaryValue()); | 
| 885   SET_INT32(data_type_id); | 1334   SET_INT32(data_type_id); | 
| 886   SET_STR(context); | 1335   SET_STR(context); | 
| 887   SET_INT64(version); | 1336   SET_INT64(version); | 
| 888   return value; | 1337   return result; | 
| 889 } | 1338 } | 
| 890 | 1339 | 
| 891 std::unique_ptr<base::DictionaryValue> GetUpdatesCallerInfoToValue( | 1340 VisitorResult GetUpdatesCallerInfoVisit( | 
| 892     const sync_pb::GetUpdatesCallerInfo& proto) { | 1341     const sync_pb::GetUpdatesCallerInfo& proto, | 
| 893   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1342     const ResultType result_type) { | 
|  | 1343   VisitorResult result(0); | 
|  | 1344   if (result_type == CONVERT_TO_VALUE) | 
|  | 1345     result.as_value.reset(new base::DictionaryValue()); | 
| 894   SET_ENUM(source, GetUpdatesSourceString); | 1346   SET_ENUM(source, GetUpdatesSourceString); | 
| 895   SET_BOOL(notifications_enabled); | 1347   SET_BOOL(notifications_enabled); | 
| 896   return value; | 1348   return result; | 
| 897 } | 1349 } | 
| 898 | 1350 | 
| 899 std::unique_ptr<base::DictionaryValue> GetUpdatesMessageToValue( | 1351 VisitorResult GetUpdatesMessageVisit(const sync_pb::GetUpdatesMessage& proto, | 
| 900     const sync_pb::GetUpdatesMessage& proto) { | 1352                                      const ResultType result_type) { | 
| 901   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1353   VisitorResult result(0); | 
| 902   SET(caller_info, GetUpdatesCallerInfoToValue); | 1354   if (result_type == CONVERT_TO_VALUE) | 
|  | 1355     result.as_value.reset(new base::DictionaryValue()); | 
|  | 1356   SET(caller_info, GetUpdatesCallerInfoVisit); | 
| 903   SET_BOOL(fetch_folders); | 1357   SET_BOOL(fetch_folders); | 
| 904   SET_INT32(batch_size); | 1358   SET_INT32(batch_size); | 
| 905   SET_REP(from_progress_marker, DataTypeProgressMarkerToValue); | 1359   SET_REP(from_progress_marker, DataTypeProgressMarkerVisit); | 
| 906   SET_BOOL(streaming); | 1360   SET_BOOL(streaming); | 
| 907   SET_BOOL(need_encryption_key); | 1361   SET_BOOL(need_encryption_key); | 
| 908   SET_BOOL(create_mobile_bookmarks_folder); | 1362   SET_BOOL(create_mobile_bookmarks_folder); | 
| 909   SET_ENUM(get_updates_origin, GetUpdatesOriginString); | 1363   SET_ENUM(get_updates_origin, GetUpdatesOriginString); | 
| 910   SET_REP(client_contexts, DataTypeContextToValue); | 1364   SET_REP(client_contexts, DataTypeContextVisit); | 
| 911   return value; | 1365   return result; | 
| 912 } | 1366 } | 
| 913 | 1367 | 
| 914 std::unique_ptr<base::DictionaryValue> ClientStatusToValue( | 1368 VisitorResult ClientStatusVisit(const sync_pb::ClientStatus& proto, | 
| 915     const sync_pb::ClientStatus& proto) { | 1369                                 const ResultType result_type) { | 
| 916   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1370   VisitorResult result(0); | 
|  | 1371   if (result_type == CONVERT_TO_VALUE) | 
|  | 1372     result.as_value.reset(new base::DictionaryValue()); | 
| 917   SET_BOOL(hierarchy_conflict_detected); | 1373   SET_BOOL(hierarchy_conflict_detected); | 
| 918   return value; | 1374   return result; | 
| 919 } | 1375 } | 
| 920 | 1376 | 
| 921 std::unique_ptr<base::DictionaryValue> EntryResponseToValue( | 1377 VisitorResult EntryResponseVisit( | 
| 922     const sync_pb::CommitResponse::EntryResponse& proto) { | 1378     const sync_pb::CommitResponse::EntryResponse& proto, | 
| 923   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1379     const ResultType result_type) { | 
|  | 1380   VisitorResult result(0); | 
|  | 1381   if (result_type == CONVERT_TO_VALUE) | 
|  | 1382     result.as_value.reset(new base::DictionaryValue()); | 
| 924   SET_ENUM(response_type, GetResponseTypeString); | 1383   SET_ENUM(response_type, GetResponseTypeString); | 
| 925   SET_STR(id_string); | 1384   SET_STR(id_string); | 
| 926   SET_STR(parent_id_string); | 1385   SET_STR(parent_id_string); | 
| 927   SET_INT64(position_in_parent); | 1386   SET_INT64(position_in_parent); | 
| 928   SET_INT64(version); | 1387   SET_INT64(version); | 
| 929   SET_STR(name); | 1388   SET_STR(name); | 
| 930   SET_STR(error_message); | 1389   SET_STR(error_message); | 
| 931   SET_INT64(mtime); | 1390   SET_INT64(mtime); | 
| 932   return value; | 1391   return result; | 
| 933 } | 1392 } | 
| 934 | 1393 | 
| 935 std::unique_ptr<base::DictionaryValue> CommitResponseToValue( | 1394 VisitorResult CommitResponseVisit(const sync_pb::CommitResponse& proto, | 
| 936     const sync_pb::CommitResponse& proto) { | 1395                                   const ResultType result_type) { | 
| 937   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1396   VisitorResult result(0); | 
| 938   SET_REP(entryresponse, EntryResponseToValue); | 1397   if (result_type == CONVERT_TO_VALUE) | 
| 939   return value; | 1398     result.as_value.reset(new base::DictionaryValue()); | 
|  | 1399   SET_REP(entryresponse, EntryResponseVisit); | 
|  | 1400   return result; | 
| 940 } | 1401 } | 
| 941 | 1402 | 
| 942 std::unique_ptr<base::DictionaryValue> GetUpdatesResponseToValue( | 1403 VisitorResult GetUpdatesResponseVisit(const sync_pb::GetUpdatesResponse& proto, | 
| 943     const sync_pb::GetUpdatesResponse& proto, | 1404                                       bool include_specifics, | 
| 944     bool include_specifics) { | 1405                                       const ResultType result_type) { | 
| 945   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1406   VisitorResult result(0); | 
| 946   value->Set("entries", | 1407   if (result_type == CONVERT_TO_VALUE) | 
| 947              SyncEntitiesToValue(proto.entries(), include_specifics)); | 1408     result.as_value.reset(new base::DictionaryValue()); | 
|  | 1409   SET_WITH_EXPR( | 
|  | 1410       entries, | 
|  | 1411       SyncEntitiesVisit(proto.entries(), include_specifics, result_type), 0); | 
| 948   SET_INT64(changes_remaining); | 1412   SET_INT64(changes_remaining); | 
| 949   SET_REP(new_progress_marker, DataTypeProgressMarkerToValue); | 1413   SET_REP(new_progress_marker, DataTypeProgressMarkerVisit); | 
| 950   SET_REP(context_mutations, DataTypeContextToValue); | 1414   SET_REP(context_mutations, DataTypeContextVisit); | 
| 951   return value; | 1415   return result; | 
| 952 } | 1416 } | 
| 953 | 1417 | 
| 954 std::unique_ptr<base::DictionaryValue> ClientCommandToValue( | 1418 VisitorResult ClientCommandVisit(const sync_pb::ClientCommand& proto, | 
| 955     const sync_pb::ClientCommand& proto) { | 1419                                  const ResultType result_type) { | 
| 956   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1420   VisitorResult result(0); | 
|  | 1421   if (result_type == CONVERT_TO_VALUE) | 
|  | 1422     result.as_value.reset(new base::DictionaryValue()); | 
| 957   SET_INT32(set_sync_poll_interval); | 1423   SET_INT32(set_sync_poll_interval); | 
| 958   SET_INT32(set_sync_long_poll_interval); | 1424   SET_INT32(set_sync_long_poll_interval); | 
| 959   SET_INT32(max_commit_batch_size); | 1425   SET_INT32(max_commit_batch_size); | 
| 960   SET_INT32(sessions_commit_delay_seconds); | 1426   SET_INT32(sessions_commit_delay_seconds); | 
| 961   SET_INT32(throttle_delay_seconds); | 1427   SET_INT32(throttle_delay_seconds); | 
| 962   SET_INT32(client_invalidation_hint_buffer_size); | 1428   SET_INT32(client_invalidation_hint_buffer_size); | 
| 963   return value; | 1429   return result; | 
| 964 } | 1430 } | 
| 965 | 1431 | 
| 966 std::unique_ptr<base::DictionaryValue> ErrorToValue( | 1432 VisitorResult ErrorVisit(const sync_pb::ClientToServerResponse::Error& proto, | 
| 967     const sync_pb::ClientToServerResponse::Error& proto) { | 1433                          const ResultType result_type) { | 
| 968   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1434   VisitorResult result(0); | 
|  | 1435   if (result_type == CONVERT_TO_VALUE) | 
|  | 1436     result.as_value.reset(new base::DictionaryValue()); | 
| 969   SET_ENUM(error_type, GetErrorTypeString); | 1437   SET_ENUM(error_type, GetErrorTypeString); | 
| 970   SET_STR(error_description); | 1438   SET_STR(error_description); | 
| 971   SET_STR(url); | 1439   SET_STR(url); | 
| 972   SET_ENUM(action, GetActionString); | 1440   SET_ENUM(action, GetActionString); | 
| 973   return value; | 1441   return result; | 
| 974 } | 1442 } | 
| 975 | 1443 | 
| 976 }  // namespace | 1444 }  // namespace | 
| 977 | 1445 | 
| 978 std::unique_ptr<base::DictionaryValue> ClientToServerResponseToValue( | 1446 VisitorResult ClientToServerResponseVisit( | 
| 979     const sync_pb::ClientToServerResponse& proto, | 1447     const sync_pb::ClientToServerResponse& proto, | 
| 980     bool include_specifics) { | 1448     bool include_specifics, | 
| 981   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1449     const ResultType result_type) { | 
| 982   SET(commit, CommitResponseToValue); | 1450   VisitorResult result(0); | 
|  | 1451   if (result_type == CONVERT_TO_VALUE) | 
|  | 1452     result.as_value.reset(new base::DictionaryValue()); | 
|  | 1453   SET(commit, CommitResponseVisit); | 
| 983   if (proto.has_get_updates()) { | 1454   if (proto.has_get_updates()) { | 
| 984     value->Set("get_updates", GetUpdatesResponseToValue(proto.get_updates(), | 1455     SET_WITH_EXPR(get_updates, | 
| 985                                                         include_specifics)); | 1456                   GetUpdatesResponseVisit(proto.get_updates(), | 
|  | 1457                                           include_specifics, result_type), | 
|  | 1458                   sizeof(proto.get_updates())); | 
| 986   } | 1459   } | 
| 987 | 1460 | 
| 988   SET(error, ErrorToValue); | 1461   SET(error, ErrorVisit); | 
| 989   SET_ENUM(error_code, GetErrorTypeString); | 1462   SET_ENUM(error_code, GetErrorTypeString); | 
| 990   SET_STR(error_message); | 1463   SET_STR(error_message); | 
| 991   SET_STR(store_birthday); | 1464   SET_STR(store_birthday); | 
| 992   SET(client_command, ClientCommandToValue); | 1465   SET(client_command, ClientCommandVisit); | 
| 993   SET_INT32_REP(migrated_data_type_id); | 1466   SET_INT32_REP(migrated_data_type_id); | 
| 994   return value; | 1467   return result; | 
| 995 } | 1468 } | 
| 996 | 1469 | 
| 997 std::unique_ptr<base::DictionaryValue> ClientToServerMessageToValue( | 1470 VisitorResult ClientToServerMessageVisit( | 
| 998     const sync_pb::ClientToServerMessage& proto, | 1471     const sync_pb::ClientToServerMessage& proto, | 
| 999     bool include_specifics) { | 1472     bool include_specifics, | 
| 1000   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1473     const ResultType result_type) { | 
|  | 1474   VisitorResult result(0); | 
|  | 1475   if (result_type == CONVERT_TO_VALUE) | 
|  | 1476     result.as_value.reset(new base::DictionaryValue()); | 
| 1001   SET_STR(share); | 1477   SET_STR(share); | 
| 1002   SET_INT32(protocol_version); | 1478   SET_INT32(protocol_version); | 
| 1003   if (proto.has_commit()) { | 1479   if (proto.has_commit()) { | 
| 1004     value->Set("commit", | 1480     SET_WITH_EXPR(commit, CommitMessageVisit(proto.commit(), include_specifics, | 
| 1005                CommitMessageToValue(proto.commit(), include_specifics)); | 1481                                              result_type), | 
|  | 1482                   sizeof(proto.commit())); | 
| 1006   } | 1483   } | 
| 1007 | 1484 | 
| 1008   SET(get_updates, GetUpdatesMessageToValue); | 1485   SET(get_updates, GetUpdatesMessageVisit); | 
| 1009   SET_STR(store_birthday); | 1486   SET_STR(store_birthday); | 
| 1010   SET_BOOL(sync_problem_detected); | 1487   SET_BOOL(sync_problem_detected); | 
| 1011   SET(debug_info, DebugInfoToValue); | 1488   SET(debug_info, DebugInfoVisit); | 
| 1012   SET(client_status, ClientStatusToValue); | 1489   SET(client_status, ClientStatusVisit); | 
| 1013   return value; | 1490   return result; | 
| 1014 } | 1491 } | 
| 1015 | 1492 | 
| 1016 std::unique_ptr<base::DictionaryValue> DatatypeAssociationStatsToValue( | 1493 VisitorResult DatatypeAssociationStatsVisit( | 
| 1017     const sync_pb::DatatypeAssociationStats& proto) { | 1494     const sync_pb::DatatypeAssociationStats& proto, | 
| 1018   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1495     const ResultType result_type) { | 
|  | 1496   VisitorResult result(0); | 
|  | 1497   if (result_type == CONVERT_TO_VALUE) | 
|  | 1498     result.as_value.reset(new base::DictionaryValue()); | 
| 1019   SET_INT32(data_type_id); | 1499   SET_INT32(data_type_id); | 
| 1020   SET_INT32(num_local_items_before_association); | 1500   SET_INT32(num_local_items_before_association); | 
| 1021   SET_INT32(num_sync_items_before_association); | 1501   SET_INT32(num_sync_items_before_association); | 
| 1022   SET_INT32(num_local_items_after_association); | 1502   SET_INT32(num_local_items_after_association); | 
| 1023   SET_INT32(num_sync_items_after_association); | 1503   SET_INT32(num_sync_items_after_association); | 
| 1024   SET_INT32(num_local_items_added); | 1504   SET_INT32(num_local_items_added); | 
| 1025   SET_INT32(num_local_items_deleted); | 1505   SET_INT32(num_local_items_deleted); | 
| 1026   SET_INT32(num_local_items_modified); | 1506   SET_INT32(num_local_items_modified); | 
| 1027   SET_INT32(num_sync_items_added); | 1507   SET_INT32(num_sync_items_added); | 
| 1028   SET_INT32(num_sync_items_deleted); | 1508   SET_INT32(num_sync_items_deleted); | 
| 1029   SET_INT32(num_sync_items_modified); | 1509   SET_INT32(num_sync_items_modified); | 
| 1030   SET_INT64(local_version_pre_association); | 1510   SET_INT64(local_version_pre_association); | 
| 1031   SET_INT64(sync_version_pre_association) | 1511   SET_INT64(sync_version_pre_association) | 
| 1032   SET_BOOL(had_error); | 1512   SET_BOOL(had_error); | 
| 1033   SET_INT64(download_wait_time_us); | 1513   SET_INT64(download_wait_time_us); | 
| 1034   SET_INT64(download_time_us); | 1514   SET_INT64(download_time_us); | 
| 1035   SET_INT64(association_wait_time_for_high_priority_us); | 1515   SET_INT64(association_wait_time_for_high_priority_us); | 
| 1036   SET_INT64(association_wait_time_for_same_priority_us); | 1516   SET_INT64(association_wait_time_for_same_priority_us); | 
| 1037   return value; | 1517   return result; | 
| 1038 } | 1518 } | 
| 1039 | 1519 | 
| 1040 std::unique_ptr<base::DictionaryValue> DebugEventInfoToValue( | 1520 VisitorResult DebugEventInfoVisit(const sync_pb::DebugEventInfo& proto, | 
| 1041     const sync_pb::DebugEventInfo& proto) { | 1521                                   const ResultType result_type) { | 
| 1042   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1522   VisitorResult result(0); | 
|  | 1523   if (result_type == CONVERT_TO_VALUE) | 
|  | 1524     result.as_value.reset(new base::DictionaryValue()); | 
| 1043   SET_ENUM(singleton_event, SingletonDebugEventTypeString); | 1525   SET_ENUM(singleton_event, SingletonDebugEventTypeString); | 
| 1044   SET(sync_cycle_completed_event_info, SyncCycleCompletedEventInfoToValue); | 1526   SET(sync_cycle_completed_event_info, SyncCycleCompletedEventInfoVisit); | 
| 1045   SET_INT32(nudging_datatype); | 1527   SET_INT32(nudging_datatype); | 
| 1046   SET_INT32_REP(datatypes_notified_from_server); | 1528   SET_INT32_REP(datatypes_notified_from_server); | 
| 1047   SET(datatype_association_stats, DatatypeAssociationStatsToValue); | 1529   SET(datatype_association_stats, DatatypeAssociationStatsVisit); | 
| 1048   return value; | 1530   return result; | 
| 1049 } | 1531 } | 
| 1050 | 1532 | 
| 1051 std::unique_ptr<base::DictionaryValue> DebugInfoToValue( | 1533 VisitorResult DebugInfoVisit(const sync_pb::DebugInfo& proto, | 
| 1052     const sync_pb::DebugInfo& proto) { | 1534                              const ResultType result_type) { | 
| 1053   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1535   VisitorResult result(0); | 
| 1054   SET_REP(events, DebugEventInfoToValue); | 1536   if (result_type == CONVERT_TO_VALUE) | 
|  | 1537     result.as_value.reset(new base::DictionaryValue()); | 
|  | 1538   SET_REP(events, DebugEventInfoVisit); | 
| 1055   SET_BOOL(cryptographer_ready); | 1539   SET_BOOL(cryptographer_ready); | 
| 1056   SET_BOOL(cryptographer_has_pending_keys); | 1540   SET_BOOL(cryptographer_has_pending_keys); | 
| 1057   SET_BOOL(events_dropped); | 1541   SET_BOOL(events_dropped); | 
| 1058   return value; | 1542   return result; | 
| 1059 } | 1543 } | 
| 1060 | 1544 | 
| 1061 std::unique_ptr<base::DictionaryValue> SyncCycleCompletedEventInfoToValue( | 1545 VisitorResult SyncCycleCompletedEventInfoVisit( | 
| 1062     const sync_pb::SyncCycleCompletedEventInfo& proto) { | 1546     const sync_pb::SyncCycleCompletedEventInfo& proto, | 
| 1063   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1547     const ResultType result_type) { | 
|  | 1548   VisitorResult result(0); | 
|  | 1549   if (result_type == CONVERT_TO_VALUE) | 
|  | 1550     result.as_value.reset(new base::DictionaryValue()); | 
| 1064   SET_INT32(num_encryption_conflicts); | 1551   SET_INT32(num_encryption_conflicts); | 
| 1065   SET_INT32(num_hierarchy_conflicts); | 1552   SET_INT32(num_hierarchy_conflicts); | 
| 1066   SET_INT32(num_server_conflicts); | 1553   SET_INT32(num_server_conflicts); | 
| 1067   SET_INT32(num_updates_downloaded); | 1554   SET_INT32(num_updates_downloaded); | 
| 1068   SET_INT32(num_reflected_updates_downloaded); | 1555   SET_INT32(num_reflected_updates_downloaded); | 
| 1069   SET(caller_info, GetUpdatesCallerInfoToValue); | 1556   SET(caller_info, GetUpdatesCallerInfoVisit); | 
| 1070   return value; | 1557   return result; | 
| 1071 } | 1558 } | 
| 1072 | 1559 | 
| 1073 std::unique_ptr<base::DictionaryValue> ClientConfigParamsToValue( | 1560 VisitorResult ClientConfigParamsVisit(const sync_pb::ClientConfigParams& proto, | 
| 1074     const sync_pb::ClientConfigParams& proto) { | 1561                                       const ResultType result_type) { | 
| 1075   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1562   VisitorResult result(0); | 
|  | 1563   if (result_type == CONVERT_TO_VALUE) | 
|  | 1564     result.as_value.reset(new base::DictionaryValue()); | 
| 1076   SET_INT32_REP(enabled_type_ids); | 1565   SET_INT32_REP(enabled_type_ids); | 
| 1077   SET_BOOL(tabs_datatype_enabled); | 1566   SET_BOOL(tabs_datatype_enabled); | 
| 1078   SET_BOOL(cookie_jar_mismatch); | 1567   SET_BOOL(cookie_jar_mismatch); | 
| 1079   return value; | 1568   return result; | 
|  | 1569 } | 
|  | 1570 | 
|  | 1571 VisitorResult AttachmentIdProtoVisit(const sync_pb::AttachmentIdProto& proto, | 
|  | 1572                                      const ResultType result_type) { | 
|  | 1573   VisitorResult result(0); | 
|  | 1574   if (result_type == CONVERT_TO_VALUE) | 
|  | 1575     result.as_value.reset(new base::DictionaryValue()); | 
|  | 1576   SET_STR(unique_id); | 
|  | 1577   return result; | 
|  | 1578 } | 
|  | 1579 | 
|  | 1580 std::unique_ptr<base::DictionaryValue> EncryptedDataToValue( | 
|  | 1581     const sync_pb::EncryptedData& encrypted_data) { | 
|  | 1582   return EncryptedDataVisit(encrypted_data, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1583 } | 
|  | 1584 | 
|  | 1585 std::unique_ptr<base::DictionaryValue> AppListSpecificsToValue( | 
|  | 1586     const sync_pb::AppListSpecifics& proto) { | 
|  | 1587   return AppListSpecificsVisit(proto, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1588 } | 
|  | 1589 | 
|  | 1590 std::unique_ptr<base::DictionaryValue> AppSettingsToValue( | 
|  | 1591     const sync_pb::AppNotificationSettings& app_notification_settings) { | 
|  | 1592   return AppSettingsVisit(app_notification_settings, CONVERT_TO_VALUE) | 
|  | 1593       .TakeDictValue(); | 
|  | 1594 } | 
|  | 1595 | 
|  | 1596 std::unique_ptr<base::DictionaryValue> LinkedAppIconInfoToValue( | 
|  | 1597     const sync_pb::LinkedAppIconInfo& linked_app_icon_info) { | 
|  | 1598   return LinkedAppIconInfoVisit(linked_app_icon_info, CONVERT_TO_VALUE) | 
|  | 1599       .TakeDictValue(); | 
|  | 1600 } | 
|  | 1601 | 
|  | 1602 std::unique_ptr<base::DictionaryValue> SessionHeaderToValue( | 
|  | 1603     const sync_pb::SessionHeader& session_header) { | 
|  | 1604   return SessionHeaderVisit(session_header, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1605 } | 
|  | 1606 | 
|  | 1607 std::unique_ptr<base::DictionaryValue> SessionTabToValue( | 
|  | 1608     const sync_pb::SessionTab& session_tab) { | 
|  | 1609   return SessionTabVisit(session_tab, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1610 } | 
|  | 1611 | 
|  | 1612 std::unique_ptr<base::DictionaryValue> SessionWindowToValue( | 
|  | 1613     const sync_pb::SessionWindow& session_window) { | 
|  | 1614   return SessionWindowVisit(session_window, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1615 } | 
|  | 1616 | 
|  | 1617 std::unique_ptr<base::DictionaryValue> TabNavigationToValue( | 
|  | 1618     const sync_pb::TabNavigation& tab_navigation) { | 
|  | 1619   return TabNavigationVisit(tab_navigation, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1620 } | 
|  | 1621 | 
|  | 1622 std::unique_ptr<base::DictionaryValue> NavigationRedirectToValue( | 
|  | 1623     const sync_pb::NavigationRedirect& navigation_redirect) { | 
|  | 1624   return NavigationRedirectVisit(navigation_redirect, CONVERT_TO_VALUE) | 
|  | 1625       .TakeDictValue(); | 
|  | 1626 } | 
|  | 1627 | 
|  | 1628 std::unique_ptr<base::DictionaryValue> PasswordSpecificsDataToValue( | 
|  | 1629     const sync_pb::PasswordSpecificsData& password_specifics_data) { | 
|  | 1630   return PasswordSpecificsDataVisit(password_specifics_data, CONVERT_TO_VALUE) | 
|  | 1631       .TakeDictValue(); | 
|  | 1632 } | 
|  | 1633 | 
|  | 1634 std::unique_ptr<base::DictionaryValue> GlobalIdDirectiveToValue( | 
|  | 1635     const sync_pb::GlobalIdDirective& global_id_directive) { | 
|  | 1636   return GlobalIdDirectiveVisit(global_id_directive, CONVERT_TO_VALUE) | 
|  | 1637       .TakeDictValue(); | 
|  | 1638 } | 
|  | 1639 | 
|  | 1640 std::unique_ptr<base::DictionaryValue> TimeRangeDirectiveToValue( | 
|  | 1641     const sync_pb::TimeRangeDirective& time_range_directive) { | 
|  | 1642   return TimeRangeDirectiveVisit(time_range_directive, CONVERT_TO_VALUE) | 
|  | 1643       .TakeDictValue(); | 
|  | 1644 } | 
|  | 1645 | 
|  | 1646 std::unique_ptr<base::DictionaryValue> SessionSpecificsToValue( | 
|  | 1647     const sync_pb::SessionSpecifics& session_specifics) { | 
|  | 1648   return SessionSpecificsVisit(session_specifics, CONVERT_TO_VALUE) | 
|  | 1649       .TakeDictValue(); | 
|  | 1650 } | 
|  | 1651 | 
|  | 1652 std::unique_ptr<base::DictionaryValue> ArcPackageSpecificsToValue( | 
|  | 1653     const sync_pb::ArcPackageSpecifics& proto) { | 
|  | 1654   return ArcPackageSpecificsVisit(proto, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1655 } | 
|  | 1656 | 
|  | 1657 std::unique_ptr<base::DictionaryValue> AppNotificationToValue( | 
|  | 1658     const sync_pb::AppNotification& app_notification_specifics) { | 
|  | 1659   return AppNotificationVisit(app_notification_specifics, CONVERT_TO_VALUE) | 
|  | 1660       .TakeDictValue(); | 
|  | 1661 } | 
|  | 1662 | 
|  | 1663 std::unique_ptr<base::DictionaryValue> AppSettingSpecificsToValue( | 
|  | 1664     const sync_pb::AppSettingSpecifics& app_setting_specifics) { | 
|  | 1665   return AppSettingSpecificsVisit(app_setting_specifics, CONVERT_TO_VALUE) | 
|  | 1666       .TakeDictValue(); | 
|  | 1667 } | 
|  | 1668 | 
|  | 1669 std::unique_ptr<base::DictionaryValue> AppSpecificsToValue( | 
|  | 1670     const sync_pb::AppSpecifics& app_specifics) { | 
|  | 1671   return AppSpecificsVisit(app_specifics, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1672 } | 
|  | 1673 | 
|  | 1674 std::unique_ptr<base::DictionaryValue> ArticleSpecificsToValue( | 
|  | 1675     const sync_pb::ArticleSpecifics& article_specifics) { | 
|  | 1676   return ArticleSpecificsVisit(article_specifics, CONVERT_TO_VALUE) | 
|  | 1677       .TakeDictValue(); | 
|  | 1678 } | 
|  | 1679 | 
|  | 1680 std::unique_ptr<base::DictionaryValue> AutofillSpecificsToValue( | 
|  | 1681     const sync_pb::AutofillSpecifics& autofill_specifics) { | 
|  | 1682   return AutofillSpecificsVisit(autofill_specifics, CONVERT_TO_VALUE) | 
|  | 1683       .TakeDictValue(); | 
|  | 1684 } | 
|  | 1685 | 
|  | 1686 std::unique_ptr<base::DictionaryValue> AutofillProfileSpecificsToValue( | 
|  | 1687     const sync_pb::AutofillProfileSpecifics& autofill_profile_specifics) { | 
|  | 1688   return AutofillProfileSpecificsVisit(autofill_profile_specifics, | 
|  | 1689                                        CONVERT_TO_VALUE) | 
|  | 1690       .TakeDictValue(); | 
|  | 1691 } | 
|  | 1692 | 
|  | 1693 std::unique_ptr<base::DictionaryValue> WalletMetadataSpecificsToValue( | 
|  | 1694     const sync_pb::WalletMetadataSpecifics& wallet_metadata_specifics) { | 
|  | 1695   return WalletMetadataSpecificsVisit(wallet_metadata_specifics, | 
|  | 1696                                       CONVERT_TO_VALUE) | 
|  | 1697       .TakeDictValue(); | 
|  | 1698 } | 
|  | 1699 | 
|  | 1700 std::unique_ptr<base::DictionaryValue> AutofillWalletSpecificsToValue( | 
|  | 1701     const sync_pb::AutofillWalletSpecifics& autofill_wallet_specifics) { | 
|  | 1702   return AutofillWalletSpecificsVisit(autofill_wallet_specifics, | 
|  | 1703                                       CONVERT_TO_VALUE) | 
|  | 1704       .TakeDictValue(); | 
|  | 1705 } | 
|  | 1706 | 
|  | 1707 std::unique_ptr<base::DictionaryValue> BookmarkSpecificsToValue( | 
|  | 1708     const sync_pb::BookmarkSpecifics& bookmark_specifics) { | 
|  | 1709   return BookmarkSpecificsVisit(bookmark_specifics, CONVERT_TO_VALUE) | 
|  | 1710       .TakeDictValue(); | 
|  | 1711 } | 
|  | 1712 | 
|  | 1713 std::unique_ptr<base::DictionaryValue> DeviceInfoSpecificsToValue( | 
|  | 1714     const sync_pb::DeviceInfoSpecifics& device_info_specifics) { | 
|  | 1715   return DeviceInfoSpecificsVisit(device_info_specifics, CONVERT_TO_VALUE) | 
|  | 1716       .TakeDictValue(); | 
|  | 1717 } | 
|  | 1718 | 
|  | 1719 std::unique_ptr<base::DictionaryValue> DictionarySpecificsToValue( | 
|  | 1720     const sync_pb::DictionarySpecifics& dictionary_specifics) { | 
|  | 1721   return DictionarySpecificsVisit(dictionary_specifics, CONVERT_TO_VALUE) | 
|  | 1722       .TakeDictValue(); | 
|  | 1723 } | 
|  | 1724 | 
|  | 1725 std::unique_ptr<base::DictionaryValue> ExperimentsSpecificsToValue( | 
|  | 1726     const sync_pb::ExperimentsSpecifics& proto) { | 
|  | 1727   return ExperimentsSpecificsVisit(proto, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1728 } | 
|  | 1729 | 
|  | 1730 std::unique_ptr<base::DictionaryValue> PriorityPreferenceSpecificsToValue( | 
|  | 1731     const sync_pb::PriorityPreferenceSpecifics& proto) { | 
|  | 1732   return PriorityPreferenceSpecificsVisit(proto, CONVERT_TO_VALUE) | 
|  | 1733       .TakeDictValue(); | 
|  | 1734 } | 
|  | 1735 | 
|  | 1736 std::unique_ptr<base::DictionaryValue> ExtensionSettingSpecificsToValue( | 
|  | 1737     const sync_pb::ExtensionSettingSpecifics& extension_setting_specifics) { | 
|  | 1738   return ExtensionSettingSpecificsVisit(extension_setting_specifics, | 
|  | 1739                                         CONVERT_TO_VALUE) | 
|  | 1740       .TakeDictValue(); | 
|  | 1741 } | 
|  | 1742 | 
|  | 1743 std::unique_ptr<base::DictionaryValue> ExtensionSpecificsToValue( | 
|  | 1744     const sync_pb::ExtensionSpecifics& extension_specifics) { | 
|  | 1745   return ExtensionSpecificsVisit(extension_specifics, CONVERT_TO_VALUE) | 
|  | 1746       .TakeDictValue(); | 
|  | 1747 } | 
|  | 1748 | 
|  | 1749 std::unique_ptr<base::DictionaryValue> FaviconImageSpecificsToValue( | 
|  | 1750     const sync_pb::FaviconImageSpecifics& favicon_image_specifics) { | 
|  | 1751   return FaviconImageSpecificsVisit(favicon_image_specifics, CONVERT_TO_VALUE) | 
|  | 1752       .TakeDictValue(); | 
|  | 1753 } | 
|  | 1754 | 
|  | 1755 std::unique_ptr<base::DictionaryValue> FaviconTrackingSpecificsToValue( | 
|  | 1756     const sync_pb::FaviconTrackingSpecifics& favicon_tracking_specifics) { | 
|  | 1757   return FaviconTrackingSpecificsVisit(favicon_tracking_specifics, | 
|  | 1758                                        CONVERT_TO_VALUE) | 
|  | 1759       .TakeDictValue(); | 
|  | 1760 } | 
|  | 1761 | 
|  | 1762 std::unique_ptr<base::DictionaryValue> HistoryDeleteDirectiveSpecificsToValue( | 
|  | 1763     const sync_pb::HistoryDeleteDirectiveSpecifics& | 
|  | 1764         history_delete_directive_specifics) { | 
|  | 1765   return HistoryDeleteDirectiveSpecificsVisit( | 
|  | 1766              history_delete_directive_specifics, CONVERT_TO_VALUE) | 
|  | 1767       .TakeDictValue(); | 
|  | 1768 } | 
|  | 1769 | 
|  | 1770 std::unique_ptr<base::DictionaryValue> ManagedUserSettingSpecificsToValue( | 
|  | 1771     const sync_pb::ManagedUserSettingSpecifics& | 
|  | 1772         managed_user_setting_specifics) { | 
|  | 1773   return ManagedUserSettingSpecificsVisit(managed_user_setting_specifics, | 
|  | 1774                                           CONVERT_TO_VALUE) | 
|  | 1775       .TakeDictValue(); | 
|  | 1776 } | 
|  | 1777 | 
|  | 1778 std::unique_ptr<base::DictionaryValue> ManagedUserSpecificsToValue( | 
|  | 1779     const sync_pb::ManagedUserSpecifics& managed_user_specifics) { | 
|  | 1780   return ManagedUserSpecificsVisit(managed_user_specifics, CONVERT_TO_VALUE) | 
|  | 1781       .TakeDictValue(); | 
|  | 1782 } | 
|  | 1783 | 
|  | 1784 std::unique_ptr<base::DictionaryValue> ManagedUserSharedSettingSpecificsToValue( | 
|  | 1785     const sync_pb::ManagedUserSharedSettingSpecifics& | 
|  | 1786         managed_user_shared_setting_specifics) { | 
|  | 1787   return ManagedUserSharedSettingSpecificsVisit( | 
|  | 1788              managed_user_shared_setting_specifics, CONVERT_TO_VALUE) | 
|  | 1789       .TakeDictValue(); | 
|  | 1790 } | 
|  | 1791 | 
|  | 1792 std::unique_ptr<base::DictionaryValue> ManagedUserWhitelistSpecificsToValue( | 
|  | 1793     const sync_pb::ManagedUserWhitelistSpecifics& | 
|  | 1794         managed_user_whitelist_specifics) { | 
|  | 1795   return ManagedUserWhitelistSpecificsVisit(managed_user_whitelist_specifics, | 
|  | 1796                                             CONVERT_TO_VALUE) | 
|  | 1797       .TakeDictValue(); | 
|  | 1798 } | 
|  | 1799 | 
|  | 1800 std::unique_ptr<base::DictionaryValue> NigoriSpecificsToValue( | 
|  | 1801     const sync_pb::NigoriSpecifics& nigori_specifics) { | 
|  | 1802   return NigoriSpecificsVisit(nigori_specifics, CONVERT_TO_VALUE) | 
|  | 1803       .TakeDictValue(); | 
|  | 1804 } | 
|  | 1805 | 
|  | 1806 std::unique_ptr<base::DictionaryValue> PasswordSpecificsToValue( | 
|  | 1807     const sync_pb::PasswordSpecifics& password_specifics) { | 
|  | 1808   return PasswordSpecificsVisit(password_specifics, CONVERT_TO_VALUE) | 
|  | 1809       .TakeDictValue(); | 
|  | 1810 } | 
|  | 1811 | 
|  | 1812 std::unique_ptr<base::DictionaryValue> PreferenceSpecificsToValue( | 
|  | 1813     const sync_pb::PreferenceSpecifics& password_specifics) { | 
|  | 1814   return PreferenceSpecificsVisit(password_specifics, CONVERT_TO_VALUE) | 
|  | 1815       .TakeDictValue(); | 
|  | 1816 } | 
|  | 1817 | 
|  | 1818 std::unique_ptr<base::DictionaryValue> | 
|  | 1819 SyncedNotificationAppInfoSpecificsToValue( | 
|  | 1820     const sync_pb::SyncedNotificationAppInfoSpecifics& | 
|  | 1821         synced_notification_specifics) { | 
|  | 1822   return SyncedNotificationAppInfoSpecificsVisit(synced_notification_specifics, | 
|  | 1823                                                  CONVERT_TO_VALUE) | 
|  | 1824       .TakeDictValue(); | 
|  | 1825 } | 
|  | 1826 | 
|  | 1827 std::unique_ptr<base::DictionaryValue> SyncedNotificationSpecificsToValue( | 
|  | 1828     const sync_pb::SyncedNotificationSpecifics& synced_notification_specifics) { | 
|  | 1829   return SyncedNotificationSpecificsVisit(synced_notification_specifics, | 
|  | 1830                                           CONVERT_TO_VALUE) | 
|  | 1831       .TakeDictValue(); | 
|  | 1832 } | 
|  | 1833 | 
|  | 1834 std::unique_ptr<base::DictionaryValue> SearchEngineSpecificsToValue( | 
|  | 1835     const sync_pb::SearchEngineSpecifics& search_engine_specifics) { | 
|  | 1836   return SearchEngineSpecificsVisit(search_engine_specifics, CONVERT_TO_VALUE) | 
|  | 1837       .TakeDictValue(); | 
|  | 1838 } | 
|  | 1839 | 
|  | 1840 std::unique_ptr<base::DictionaryValue> ThemeSpecificsToValue( | 
|  | 1841     const sync_pb::ThemeSpecifics& theme_specifics) { | 
|  | 1842   return ThemeSpecificsVisit(theme_specifics, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1843 } | 
|  | 1844 | 
|  | 1845 std::unique_ptr<base::DictionaryValue> TypedUrlSpecificsToValue( | 
|  | 1846     const sync_pb::TypedUrlSpecifics& typed_url_specifics) { | 
|  | 1847   return TypedUrlSpecificsVisit(typed_url_specifics, CONVERT_TO_VALUE) | 
|  | 1848       .TakeDictValue(); | 
|  | 1849 } | 
|  | 1850 | 
|  | 1851 std::unique_ptr<base::DictionaryValue> WalletMaskedCreditCardToValue( | 
|  | 1852     const sync_pb::WalletMaskedCreditCard& wallet_masked_card) { | 
|  | 1853   return WalletMaskedCreditCardVisit(wallet_masked_card, CONVERT_TO_VALUE) | 
|  | 1854       .TakeDictValue(); | 
|  | 1855 } | 
|  | 1856 | 
|  | 1857 std::unique_ptr<base::DictionaryValue> WalletPostalAddressToValue( | 
|  | 1858     const sync_pb::WalletPostalAddress& wallet_postal_address) { | 
|  | 1859   return WalletPostalAddressVisit(wallet_postal_address, CONVERT_TO_VALUE) | 
|  | 1860       .TakeDictValue(); | 
|  | 1861 } | 
|  | 1862 | 
|  | 1863 std::unique_ptr<base::DictionaryValue> WifiCredentialSpecificsToValue( | 
|  | 1864     const sync_pb::WifiCredentialSpecifics& wifi_credential_specifics) { | 
|  | 1865   return WifiCredentialSpecificsVisit(wifi_credential_specifics, | 
|  | 1866                                       CONVERT_TO_VALUE) | 
|  | 1867       .TakeDictValue(); | 
|  | 1868 } | 
|  | 1869 | 
|  | 1870 std::unique_ptr<base::DictionaryValue> EntitySpecificsToValue( | 
|  | 1871     const sync_pb::EntitySpecifics& specifics) { | 
|  | 1872   return EntitySpecificsVisit(specifics, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1873 } | 
|  | 1874 | 
|  | 1875 std::unique_ptr<base::DictionaryValue> SyncEntityToValue( | 
|  | 1876     const sync_pb::SyncEntity& entity, | 
|  | 1877     bool include_specifics) { | 
|  | 1878   return SyncEntityVisit(entity, include_specifics, CONVERT_TO_VALUE) | 
|  | 1879       .TakeDictValue(); | 
|  | 1880 } | 
|  | 1881 | 
|  | 1882 std::unique_ptr<base::DictionaryValue> ClientToServerMessageToValue( | 
|  | 1883     const sync_pb::ClientToServerMessage& proto, | 
|  | 1884     bool include_specifics) { | 
|  | 1885   return ClientToServerMessageVisit(proto, include_specifics, CONVERT_TO_VALUE) | 
|  | 1886       .TakeDictValue(); | 
|  | 1887 } | 
|  | 1888 | 
|  | 1889 std::unique_ptr<base::DictionaryValue> ClientToServerResponseToValue( | 
|  | 1890     const sync_pb::ClientToServerResponse& proto, | 
|  | 1891     bool include_specifics) { | 
|  | 1892   return ClientToServerResponseVisit(proto, include_specifics, CONVERT_TO_VALUE) | 
|  | 1893       .TakeDictValue(); | 
|  | 1894 } | 
|  | 1895 | 
|  | 1896 std::unique_ptr<base::DictionaryValue> DatatypeAssociationStatsToValue( | 
|  | 1897     const sync_pb::DatatypeAssociationStats& proto) { | 
|  | 1898   return DatatypeAssociationStatsVisit(proto, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1899 } | 
|  | 1900 | 
|  | 1901 std::unique_ptr<base::DictionaryValue> DebugEventInfoToValue( | 
|  | 1902     const sync_pb::DebugEventInfo& proto) { | 
|  | 1903   return DebugEventInfoVisit(proto, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1904 } | 
|  | 1905 | 
|  | 1906 std::unique_ptr<base::DictionaryValue> DebugInfoToValue( | 
|  | 1907     const sync_pb::DebugInfo& proto) { | 
|  | 1908   return DebugInfoVisit(proto, CONVERT_TO_VALUE).TakeDictValue(); | 
|  | 1909 } | 
|  | 1910 | 
|  | 1911 std::unique_ptr<base::DictionaryValue> SyncCycleCompletedEventInfoToValue( | 
|  | 1912     const sync_pb::SyncCycleCompletedEventInfo& proto) { | 
|  | 1913   return SyncCycleCompletedEventInfoVisit(proto, CONVERT_TO_VALUE) | 
|  | 1914       .TakeDictValue(); | 
|  | 1915 } | 
|  | 1916 | 
|  | 1917 std::unique_ptr<base::DictionaryValue> ClientConfigParamsToValue( | 
|  | 1918     const sync_pb::ClientConfigParams& proto) { | 
|  | 1919   return ClientConfigParamsVisit(proto, CONVERT_TO_VALUE).TakeDictValue(); | 
| 1080 } | 1920 } | 
| 1081 | 1921 | 
| 1082 std::unique_ptr<base::DictionaryValue> AttachmentIdProtoToValue( | 1922 std::unique_ptr<base::DictionaryValue> AttachmentIdProtoToValue( | 
| 1083     const sync_pb::AttachmentIdProto& proto) { | 1923     const sync_pb::AttachmentIdProto& proto) { | 
| 1084   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 1924   return AttachmentIdProtoVisit(proto, CONVERT_TO_VALUE).TakeDictValue(); | 
| 1085   SET_STR(unique_id); | 1925 } | 
| 1086   return value; | 1926 | 
| 1087 } | 1927 size_t GetEntitySpecificsSize(const sync_pb::EntitySpecifics& specifics) { | 
| 1088 | 1928   return EntitySpecificsVisit(specifics, MEMORY_USAGE).memory_usage + | 
|  | 1929          sizeof(specifics); | 
|  | 1930 } | 
|  | 1931 | 
|  | 1932 #undef SET_WITH_EXPR | 
| 1089 #undef SET_TYPE | 1933 #undef SET_TYPE | 
| 1090 #undef SET | 1934 #undef SET | 
| 1091 #undef SET_REP | 1935 #undef SET_REP | 
|  | 1936 #undef SET_ENUM | 
| 1092 | 1937 | 
| 1093 #undef SET_BOOL | 1938 #undef SET_BOOL | 
| 1094 #undef SET_BYTES | 1939 #undef SET_BYTES | 
| 1095 #undef SET_INT32 | 1940 #undef SET_INT32 | 
| 1096 #undef SET_INT64 | 1941 #undef SET_INT64 | 
| 1097 #undef SET_INT64_REP | 1942 #undef SET_INT64_REP | 
| 1098 #undef SET_STR | 1943 #undef SET_STR | 
|  | 1944 #undef SET_TIME_STR | 
| 1099 #undef SET_STR_REP | 1945 #undef SET_STR_REP | 
| 1100 | 1946 | 
|  | 1947 #undef SET_EXPERIMENT_ENABLED_FIELD | 
| 1101 #undef SET_FIELD | 1948 #undef SET_FIELD | 
| 1102 | 1949 | 
| 1103 }  // namespace syncer | 1950 }  // namespace syncer | 
| OLD | NEW | 
|---|