| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/sync_driver/about_sync_util.h" | 5 #include "components/sync/driver/about_sync_util.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| 11 #include "base/strings/string16.h" | 11 #include "base/strings/string16.h" |
| 12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
| 13 #include "base/values.h" | 13 #include "base/values.h" |
| 14 #include "components/signin/core/browser/signin_manager_base.h" | 14 #include "components/signin/core/browser/signin_manager_base.h" |
| 15 #include "components/sync/api/time.h" | 15 #include "components/sync/api/time.h" |
| 16 #include "components/sync/base/sync_string_conversions.h" | 16 #include "components/sync/base/sync_string_conversions.h" |
| 17 #include "components/sync/driver/sync_service.h" |
| 17 #include "components/sync/engine/sync_status.h" | 18 #include "components/sync/engine/sync_status.h" |
| 18 #include "components/sync/protocol/proto_enum_conversions.h" | 19 #include "components/sync/protocol/proto_enum_conversions.h" |
| 19 #include "components/sync/sessions/sync_session_snapshot.h" | 20 #include "components/sync/sessions/sync_session_snapshot.h" |
| 20 #include "components/sync_driver/sync_service.h" | |
| 21 #include "components/version_info/version_info.h" | 21 #include "components/version_info/version_info.h" |
| 22 | 22 |
| 23 using base::DictionaryValue; | 23 using base::DictionaryValue; |
| 24 using base::ListValue; | 24 using base::ListValue; |
| 25 | 25 |
| 26 namespace sync_driver { | 26 namespace sync_driver { |
| 27 | 27 |
| 28 namespace sync_ui_util { | 28 namespace sync_ui_util { |
| 29 | 29 |
| 30 const char kIdentityTitle[] = "Identity"; | 30 const char kIdentityTitle[] = "Identity"; |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 AddSensitiveSection(stats_list, kIdentityTitle); | 267 AddSensitiveSection(stats_list, kIdentityTitle); |
| 268 StringSyncStat sync_id(section_identity, "Sync Client ID"); | 268 StringSyncStat sync_id(section_identity, "Sync Client ID"); |
| 269 StringSyncStat invalidator_id(section_identity, "Invalidator Client ID"); | 269 StringSyncStat invalidator_id(section_identity, "Invalidator Client ID"); |
| 270 StringSyncStat username(section_identity, "Username"); | 270 StringSyncStat username(section_identity, "Username"); |
| 271 | 271 |
| 272 base::ListValue* section_credentials = AddSection(stats_list, "Credentials"); | 272 base::ListValue* section_credentials = AddSection(stats_list, "Credentials"); |
| 273 StringSyncStat request_token_time(section_credentials, "Requested Token"); | 273 StringSyncStat request_token_time(section_credentials, "Requested Token"); |
| 274 StringSyncStat receive_token_time(section_credentials, "Received Token"); | 274 StringSyncStat receive_token_time(section_credentials, "Received Token"); |
| 275 StringSyncStat token_request_status(section_credentials, | 275 StringSyncStat token_request_status(section_credentials, |
| 276 "Token Request Status"); | 276 "Token Request Status"); |
| 277 StringSyncStat next_token_request(section_credentials, | 277 StringSyncStat next_token_request(section_credentials, "Next Token Request"); |
| 278 "Next Token Request"); | |
| 279 | 278 |
| 280 base::ListValue* section_local = AddSection(stats_list, "Local State"); | 279 base::ListValue* section_local = AddSection(stats_list, "Local State"); |
| 281 StringSyncStat server_connection(section_local, | 280 StringSyncStat server_connection(section_local, "Server Connection"); |
| 282 "Server Connection"); | |
| 283 StringSyncStat last_synced(section_local, "Last Synced"); | 281 StringSyncStat last_synced(section_local, "Last Synced"); |
| 284 BoolSyncStat is_setup_complete(section_local, | 282 BoolSyncStat is_setup_complete(section_local, |
| 285 "Sync First-Time Setup Complete"); | 283 "Sync First-Time Setup Complete"); |
| 286 StringSyncStat backend_initialization(section_local, | 284 StringSyncStat backend_initialization(section_local, |
| 287 "Sync Backend Initialization"); | 285 "Sync Backend Initialization"); |
| 288 BoolSyncStat is_syncing(section_local, "Syncing"); | 286 BoolSyncStat is_syncing(section_local, "Syncing"); |
| 289 | 287 |
| 290 base::ListValue* section_network = AddSection(stats_list, "Network"); | 288 base::ListValue* section_network = AddSection(stats_list, "Network"); |
| 291 BoolSyncStat is_throttled(section_network, "Throttled"); | 289 BoolSyncStat is_throttled(section_network, "Throttled"); |
| 292 StringSyncStat retry_time(section_network, "Retry time (maybe stale)"); | 290 StringSyncStat retry_time(section_network, "Retry time (maybe stale)"); |
| 293 BoolSyncStat are_notifications_enabled(section_network, | 291 BoolSyncStat are_notifications_enabled(section_network, |
| 294 "Notifications Enabled"); | 292 "Notifications Enabled"); |
| 295 | 293 |
| 296 base::ListValue* section_encryption = AddSection(stats_list, "Encryption"); | 294 base::ListValue* section_encryption = AddSection(stats_list, "Encryption"); |
| 297 BoolSyncStat is_using_explicit_passphrase(section_encryption, | 295 BoolSyncStat is_using_explicit_passphrase(section_encryption, |
| 298 "Explicit Passphrase"); | 296 "Explicit Passphrase"); |
| 299 BoolSyncStat is_passphrase_required(section_encryption, | 297 BoolSyncStat is_passphrase_required(section_encryption, |
| 300 "Passphrase Required"); | 298 "Passphrase Required"); |
| 301 BoolSyncStat is_cryptographer_ready(section_encryption, | 299 BoolSyncStat is_cryptographer_ready(section_encryption, |
| 302 "Cryptographer Ready"); | 300 "Cryptographer Ready"); |
| 303 BoolSyncStat has_pending_keys(section_encryption, | 301 BoolSyncStat has_pending_keys(section_encryption, |
| 304 "Cryptographer Has Pending Keys"); | 302 "Cryptographer Has Pending Keys"); |
| 305 StringSyncStat encrypted_types(section_encryption, "Encrypted Types"); | 303 StringSyncStat encrypted_types(section_encryption, "Encrypted Types"); |
| 306 BoolSyncStat has_keystore_key(section_encryption, "Has Keystore Key"); | 304 BoolSyncStat has_keystore_key(section_encryption, "Has Keystore Key"); |
| 307 StringSyncStat keystore_migration_time(section_encryption, | 305 StringSyncStat keystore_migration_time(section_encryption, |
| 308 "Keystore Migration Time"); | 306 "Keystore Migration Time"); |
| 309 StringSyncStat passphrase_type(section_encryption, | 307 StringSyncStat passphrase_type(section_encryption, "Passphrase Type"); |
| 310 "Passphrase Type"); | 308 StringSyncStat passphrase_time(section_encryption, "Passphrase Time"); |
| 311 StringSyncStat passphrase_time(section_encryption, | |
| 312 "Passphrase Time"); | |
| 313 | 309 |
| 314 base::ListValue* section_last_session = AddSection( | 310 base::ListValue* section_last_session = |
| 315 stats_list, "Status from Last Completed Session"); | 311 AddSection(stats_list, "Status from Last Completed Session"); |
| 316 StringSyncStat session_source(section_last_session, "Sync Source"); | 312 StringSyncStat session_source(section_last_session, "Sync Source"); |
| 317 StringSyncStat get_key_result(section_last_session, "GetKey Step Result"); | 313 StringSyncStat get_key_result(section_last_session, "GetKey Step Result"); |
| 318 StringSyncStat download_result(section_last_session, "Download Step Result"); | 314 StringSyncStat download_result(section_last_session, "Download Step Result"); |
| 319 StringSyncStat commit_result(section_last_session, "Commit Step Result"); | 315 StringSyncStat commit_result(section_last_session, "Commit Step Result"); |
| 320 | 316 |
| 321 base::ListValue* section_counters = AddSection(stats_list, "Running Totals"); | 317 base::ListValue* section_counters = AddSection(stats_list, "Running Totals"); |
| 322 IntSyncStat notifications_received(section_counters, | 318 IntSyncStat notifications_received(section_counters, |
| 323 "Notifications Received"); | 319 "Notifications Received"); |
| 324 IntSyncStat updates_received(section_counters, "Updates Downloaded"); | 320 IntSyncStat updates_received(section_counters, "Updates Downloaded"); |
| 325 IntSyncStat tombstone_updates(section_counters, "Tombstone Updates"); | 321 IntSyncStat tombstone_updates(section_counters, "Tombstone Updates"); |
| 326 IntSyncStat reflected_updates(section_counters, "Reflected Updates"); | 322 IntSyncStat reflected_updates(section_counters, "Reflected Updates"); |
| 327 IntSyncStat successful_commits(section_counters, "Successful Commits"); | 323 IntSyncStat successful_commits(section_counters, "Successful Commits"); |
| 328 IntSyncStat conflicts_resolved_local_wins(section_counters, | 324 IntSyncStat conflicts_resolved_local_wins(section_counters, |
| 329 "Conflicts Resolved: Client Wins"); | 325 "Conflicts Resolved: Client Wins"); |
| 330 IntSyncStat conflicts_resolved_server_wins(section_counters, | 326 IntSyncStat conflicts_resolved_server_wins(section_counters, |
| 331 "Conflicts Resolved: Server Wins"); | 327 "Conflicts Resolved: Server Wins"); |
| 332 | 328 |
| 333 base::ListValue *section_this_cycle = AddSection(stats_list, | 329 base::ListValue* section_this_cycle = |
| 334 "Transient Counters (this cycle)"); | 330 AddSection(stats_list, "Transient Counters (this cycle)"); |
| 335 IntSyncStat encryption_conflicts(section_this_cycle, "Encryption Conflicts"); | 331 IntSyncStat encryption_conflicts(section_this_cycle, "Encryption Conflicts"); |
| 336 IntSyncStat hierarchy_conflicts(section_this_cycle, "Hierarchy Conflicts"); | 332 IntSyncStat hierarchy_conflicts(section_this_cycle, "Hierarchy Conflicts"); |
| 337 IntSyncStat server_conflicts(section_this_cycle, "Server Conflicts"); | 333 IntSyncStat server_conflicts(section_this_cycle, "Server Conflicts"); |
| 338 IntSyncStat committed_items(section_this_cycle, "Committed Items"); | 334 IntSyncStat committed_items(section_this_cycle, "Committed Items"); |
| 339 | 335 |
| 340 base::ListValue* section_that_cycle = AddSection( | 336 base::ListValue* section_that_cycle = AddSection( |
| 341 stats_list, "Transient Counters (last cycle of last completed session)"); | 337 stats_list, "Transient Counters (last cycle of last completed session)"); |
| 342 IntSyncStat updates_downloaded(section_that_cycle, "Updates Downloaded"); | 338 IntSyncStat updates_downloaded(section_that_cycle, "Updates Downloaded"); |
| 343 IntSyncStat committed_count(section_that_cycle, "Committed Count"); | 339 IntSyncStat committed_count(section_that_cycle, "Committed Count"); |
| 344 IntSyncStat entries(section_that_cycle, "Entries"); | 340 IntSyncStat entries(section_that_cycle, "Entries"); |
| 345 | 341 |
| 346 base::ListValue* section_nudge_info = AddSection( | 342 base::ListValue* section_nudge_info = |
| 347 stats_list, "Nudge Source Counters"); | 343 AddSection(stats_list, "Nudge Source Counters"); |
| 348 IntSyncStat nudge_source_notification( | 344 IntSyncStat nudge_source_notification(section_nudge_info, |
| 349 section_nudge_info, "Server Invalidations"); | 345 "Server Invalidations"); |
| 350 IntSyncStat nudge_source_local(section_nudge_info, "Local Changes"); | 346 IntSyncStat nudge_source_local(section_nudge_info, "Local Changes"); |
| 351 IntSyncStat nudge_source_local_refresh(section_nudge_info, "Local Refreshes"); | 347 IntSyncStat nudge_source_local_refresh(section_nudge_info, "Local Refreshes"); |
| 352 | 348 |
| 353 // This list of sections belongs in the 'details' field of the returned | 349 // This list of sections belongs in the 'details' field of the returned |
| 354 // message. | 350 // message. |
| 355 about_info->Set(kDetailsKey, stats_list); | 351 about_info->Set(kDetailsKey, stats_list); |
| 356 | 352 |
| 357 // Populate all the fields we declared above. | 353 // Populate all the fields we declared above. |
| 358 client_version.SetValue(GetVersionString(channel)); | 354 client_version.SetValue(GetVersionString(channel)); |
| 359 | 355 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 376 if (is_status_valid && !full_status.sync_id.empty()) | 372 if (is_status_valid && !full_status.sync_id.empty()) |
| 377 sync_id.SetValue(full_status.sync_id); | 373 sync_id.SetValue(full_status.sync_id); |
| 378 if (is_status_valid && !full_status.invalidator_client_id.empty()) | 374 if (is_status_valid && !full_status.invalidator_client_id.empty()) |
| 379 invalidator_id.SetValue(full_status.invalidator_client_id); | 375 invalidator_id.SetValue(full_status.invalidator_client_id); |
| 380 if (signin) | 376 if (signin) |
| 381 username.SetValue(signin->GetAuthenticatedAccountInfo().email); | 377 username.SetValue(signin->GetAuthenticatedAccountInfo().email); |
| 382 | 378 |
| 383 const sync_driver::SyncService::SyncTokenStatus& token_status = | 379 const sync_driver::SyncService::SyncTokenStatus& token_status = |
| 384 service->GetSyncTokenStatus(); | 380 service->GetSyncTokenStatus(); |
| 385 server_connection.SetValue(GetConnectionStatus(token_status)); | 381 server_connection.SetValue(GetConnectionStatus(token_status)); |
| 386 request_token_time.SetValue(GetTimeStr(token_status.token_request_time, | 382 request_token_time.SetValue( |
| 387 "n/a")); | 383 GetTimeStr(token_status.token_request_time, "n/a")); |
| 388 receive_token_time.SetValue(GetTimeStr(token_status.token_receive_time, | 384 receive_token_time.SetValue( |
| 389 "n/a")); | 385 GetTimeStr(token_status.token_receive_time, "n/a")); |
| 390 std::string err = token_status.last_get_token_error.error_message(); | 386 std::string err = token_status.last_get_token_error.error_message(); |
| 391 token_request_status.SetValue(err.empty() ? "OK" : err); | 387 token_request_status.SetValue(err.empty() ? "OK" : err); |
| 392 next_token_request.SetValue( | 388 next_token_request.SetValue( |
| 393 GetTimeStr(token_status.next_token_request_time, "not scheduled")); | 389 GetTimeStr(token_status.next_token_request_time, "not scheduled")); |
| 394 | 390 |
| 395 last_synced.SetValue(service->GetLastSyncedTimeString()); | 391 last_synced.SetValue(service->GetLastSyncedTimeString()); |
| 396 is_setup_complete.SetValue(service->IsFirstSetupComplete()); | 392 is_setup_complete.SetValue(service->IsFirstSetupComplete()); |
| 397 backend_initialization.SetValue( | 393 backend_initialization.SetValue( |
| 398 service->GetBackendInitializationStateString()); | 394 service->GetBackendInitializationStateString()); |
| 399 if (is_status_valid) { | 395 if (is_status_valid) { |
| 400 is_syncing.SetValue(full_status.syncing); | 396 is_syncing.SetValue(full_status.syncing); |
| 401 retry_time.SetValue(GetTimeStr(full_status.retry_time, | 397 retry_time.SetValue(GetTimeStr(full_status.retry_time, |
| 402 "Scheduler is not in backoff or throttled")); | 398 "Scheduler is not in backoff or throttled")); |
| 403 } | 399 } |
| 404 | 400 |
| 405 if (snapshot.is_initialized()) | 401 if (snapshot.is_initialized()) |
| 406 is_throttled.SetValue(snapshot.is_silenced()); | 402 is_throttled.SetValue(snapshot.is_silenced()); |
| 407 if (is_status_valid) { | 403 if (is_status_valid) { |
| 408 are_notifications_enabled.SetValue( | 404 are_notifications_enabled.SetValue(full_status.notifications_enabled); |
| 409 full_status.notifications_enabled); | |
| 410 } | 405 } |
| 411 | 406 |
| 412 if (sync_active) { | 407 if (sync_active) { |
| 413 is_using_explicit_passphrase.SetValue( | 408 is_using_explicit_passphrase.SetValue( |
| 414 service->IsUsingSecondaryPassphrase()); | 409 service->IsUsingSecondaryPassphrase()); |
| 415 is_passphrase_required.SetValue(service->IsPassphraseRequired()); | 410 is_passphrase_required.SetValue(service->IsPassphraseRequired()); |
| 416 passphrase_time.SetValue( | 411 passphrase_time.SetValue( |
| 417 GetTimeStr(service->GetExplicitPassphraseTime(), "No Passphrase Time")); | 412 GetTimeStr(service->GetExplicitPassphraseTime(), "No Passphrase Time")); |
| 418 } | 413 } |
| 419 if (is_status_valid) { | 414 if (is_status_valid) { |
| 420 is_cryptographer_ready.SetValue(full_status.cryptographer_ready); | 415 is_cryptographer_ready.SetValue(full_status.cryptographer_ready); |
| 421 has_pending_keys.SetValue(full_status.crypto_has_pending_keys); | 416 has_pending_keys.SetValue(full_status.crypto_has_pending_keys); |
| 422 encrypted_types.SetValue( | 417 encrypted_types.SetValue(ModelTypeSetToString(full_status.encrypted_types)); |
| 423 ModelTypeSetToString(full_status.encrypted_types)); | |
| 424 has_keystore_key.SetValue(full_status.has_keystore_key); | 418 has_keystore_key.SetValue(full_status.has_keystore_key); |
| 425 keystore_migration_time.SetValue( | 419 keystore_migration_time.SetValue( |
| 426 GetTimeStr(full_status.keystore_migration_time, "Not Migrated")); | 420 GetTimeStr(full_status.keystore_migration_time, "Not Migrated")); |
| 427 passphrase_type.SetValue( | 421 passphrase_type.SetValue( |
| 428 PassphraseTypeToString(full_status.passphrase_type)); | 422 PassphraseTypeToString(full_status.passphrase_type)); |
| 429 } | 423 } |
| 430 | 424 |
| 431 if (snapshot.is_initialized()) { | 425 if (snapshot.is_initialized()) { |
| 432 if (snapshot.legacy_updates_source() != | 426 if (snapshot.legacy_updates_source() != |
| 433 sync_pb::GetUpdatesCallerInfo::UNKNOWN) { | 427 sync_pb::GetUpdatesCallerInfo::UNKNOWN) { |
| 434 session_source.SetValue( | 428 session_source.SetValue( |
| 435 syncer::GetUpdatesSourceString(snapshot.legacy_updates_source())); | 429 syncer::GetUpdatesSourceString(snapshot.legacy_updates_source())); |
| 436 } | 430 } |
| 437 get_key_result.SetValue( | 431 get_key_result.SetValue(GetSyncerErrorString( |
| 438 GetSyncerErrorString( | 432 snapshot.model_neutral_state().last_get_key_result)); |
| 439 snapshot.model_neutral_state().last_get_key_result)); | 433 download_result.SetValue(GetSyncerErrorString( |
| 440 download_result.SetValue( | 434 snapshot.model_neutral_state().last_download_updates_result)); |
| 441 GetSyncerErrorString( | |
| 442 snapshot.model_neutral_state().last_download_updates_result)); | |
| 443 commit_result.SetValue( | 435 commit_result.SetValue( |
| 444 GetSyncerErrorString( | 436 GetSyncerErrorString(snapshot.model_neutral_state().commit_result)); |
| 445 snapshot.model_neutral_state().commit_result)); | |
| 446 } | 437 } |
| 447 | 438 |
| 448 if (is_status_valid) { | 439 if (is_status_valid) { |
| 449 notifications_received.SetValue(full_status.notifications_received); | 440 notifications_received.SetValue(full_status.notifications_received); |
| 450 updates_received.SetValue(full_status.updates_received); | 441 updates_received.SetValue(full_status.updates_received); |
| 451 tombstone_updates.SetValue(full_status.tombstone_updates_received); | 442 tombstone_updates.SetValue(full_status.tombstone_updates_received); |
| 452 reflected_updates.SetValue(full_status.reflected_updates_received); | 443 reflected_updates.SetValue(full_status.reflected_updates_received); |
| 453 successful_commits.SetValue(full_status.num_commits_total); | 444 successful_commits.SetValue(full_status.num_commits_total); |
| 454 conflicts_resolved_local_wins.SetValue( | 445 conflicts_resolved_local_wins.SetValue( |
| 455 full_status.num_local_overwrites_total); | 446 full_status.num_local_overwrites_total); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 base::ListValue* actionable_error = new base::ListValue(); | 488 base::ListValue* actionable_error = new base::ListValue(); |
| 498 about_info->Set("actionable_error", actionable_error); | 489 about_info->Set("actionable_error", actionable_error); |
| 499 | 490 |
| 500 StringSyncStat error_type(actionable_error, "Error Type"); | 491 StringSyncStat error_type(actionable_error, "Error Type"); |
| 501 StringSyncStat action(actionable_error, "Action"); | 492 StringSyncStat action(actionable_error, "Action"); |
| 502 StringSyncStat url(actionable_error, "URL"); | 493 StringSyncStat url(actionable_error, "URL"); |
| 503 StringSyncStat description(actionable_error, "Error Description"); | 494 StringSyncStat description(actionable_error, "Error Description"); |
| 504 | 495 |
| 505 if (actionable_error_detected) { | 496 if (actionable_error_detected) { |
| 506 error_type.SetValue(syncer::GetSyncErrorTypeString( | 497 error_type.SetValue(syncer::GetSyncErrorTypeString( |
| 507 full_status.sync_protocol_error.error_type)); | 498 full_status.sync_protocol_error.error_type)); |
| 508 action.SetValue(syncer::GetClientActionString( | 499 action.SetValue( |
| 509 full_status.sync_protocol_error.action)); | 500 syncer::GetClientActionString(full_status.sync_protocol_error.action)); |
| 510 url.SetValue(full_status.sync_protocol_error.url); | 501 url.SetValue(full_status.sync_protocol_error.url); |
| 511 description.SetValue(full_status.sync_protocol_error.error_description); | 502 description.SetValue(full_status.sync_protocol_error.error_description); |
| 512 } | 503 } |
| 513 | 504 |
| 514 about_info->SetBoolean("unrecoverable_error_detected", | 505 about_info->SetBoolean("unrecoverable_error_detected", |
| 515 service->HasUnrecoverableError()); | 506 service->HasUnrecoverableError()); |
| 516 | 507 |
| 517 if (service->HasUnrecoverableError()) { | 508 if (service->HasUnrecoverableError()) { |
| 518 tracked_objects::Location loc(service->unrecoverable_error_location()); | 509 tracked_objects::Location loc(service->unrecoverable_error_location()); |
| 519 std::string location_str; | 510 std::string location_str; |
| 520 loc.Write(true, true, &location_str); | 511 loc.Write(true, true, &location_str); |
| 521 std::string unrecoverable_error_message = | 512 std::string unrecoverable_error_message = |
| 522 "Unrecoverable error detected at " + location_str + | 513 "Unrecoverable error detected at " + location_str + ": " + |
| 523 ": " + service->unrecoverable_error_message(); | 514 service->unrecoverable_error_message(); |
| 524 about_info->SetString("unrecoverable_error_message", | 515 about_info->SetString("unrecoverable_error_message", |
| 525 unrecoverable_error_message); | 516 unrecoverable_error_message); |
| 526 } | 517 } |
| 527 | 518 |
| 528 about_info->Set("type_status", service->GetTypeStatusMap()); | 519 about_info->Set("type_status", service->GetTypeStatusMap()); |
| 529 | 520 |
| 530 return about_info; | 521 return about_info; |
| 531 } | 522 } |
| 532 | 523 |
| 533 } // namespace sync_ui_util | 524 } // namespace sync_ui_util |
| 534 | 525 |
| 535 } // namespace sync_driver | 526 } // namespace sync_driver |
| OLD | NEW |