Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Side by Side Diff: sync/protocol/proto_value_conversions.cc

Issue 2084243004: [WIP][tracing] Add memory dump provider for sync Directory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698