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

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

Powered by Google App Engine
This is Rietveld 408576698