passphrase_type_metrics_provider.cc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/sync/driver/passphrase_type_metrics_provider.h"
  5. #include "base/check.h"
  6. #include "base/containers/flat_set.h"
  7. #include "base/metrics/histogram_functions.h"
  8. #include "base/notreached.h"
  9. #include "components/sync/base/passphrase_enums.h"
  10. #include "components/sync/driver/sync_service.h"
  11. #include "components/sync/driver/sync_user_settings.h"
  12. namespace syncer {
  13. namespace {
  14. absl::optional<PassphraseTypeForMetrics> GetPassphraseTypeForSingleProfile(
  15. const SyncService& sync_service) {
  16. if (sync_service.GetTransportState() != SyncService::TransportState::ACTIVE) {
  17. return absl::nullopt;
  18. }
  19. const SyncUserSettings* user_settings = sync_service.GetUserSettings();
  20. // Guaranteed by sync transport state.
  21. DCHECK(user_settings);
  22. switch (user_settings->GetPassphraseType()) {
  23. case PassphraseType::kImplicitPassphrase:
  24. return PassphraseTypeForMetrics::kImplicitPassphrase;
  25. case PassphraseType::kKeystorePassphrase:
  26. return PassphraseTypeForMetrics::kKeystorePassphrase;
  27. case PassphraseType::kFrozenImplicitPassphrase:
  28. return PassphraseTypeForMetrics::kFrozenImplicitPassphrase;
  29. case PassphraseType::kCustomPassphrase:
  30. return PassphraseTypeForMetrics::kCustomPassphrase;
  31. case PassphraseType::kTrustedVaultPassphrase:
  32. return PassphraseTypeForMetrics::kTrustedVaultPassphrase;
  33. }
  34. NOTREACHED();
  35. return absl::nullopt;
  36. }
  37. PassphraseTypeForMetrics GetPassphraseTypeForAllProfiles(
  38. const std::vector<const SyncService*>& sync_services) {
  39. base::flat_set<absl::optional<PassphraseTypeForMetrics>> passphrase_types;
  40. for (const SyncService* sync_service : sync_services) {
  41. DCHECK(sync_service);
  42. passphrase_types.insert(GetPassphraseTypeForSingleProfile(*sync_service));
  43. }
  44. if (passphrase_types.size() > 1) {
  45. return PassphraseTypeForMetrics::kInconsistentStateAcrossProfiles;
  46. }
  47. if (passphrase_types.empty() || !passphrase_types.begin()->has_value()) {
  48. return PassphraseTypeForMetrics::kNoActiveSyncingProfiles;
  49. }
  50. return **passphrase_types.begin();
  51. }
  52. } // namespace
  53. PassphraseTypeMetricsProvider::PassphraseTypeMetricsProvider(
  54. const GetAllSyncServicesCallback& get_all_sync_services_callback)
  55. : get_all_sync_services_callback_(get_all_sync_services_callback) {}
  56. PassphraseTypeMetricsProvider::~PassphraseTypeMetricsProvider() = default;
  57. void PassphraseTypeMetricsProvider::ProvideCurrentSessionData(
  58. metrics::ChromeUserMetricsExtension* uma_proto) {
  59. base::UmaHistogramEnumeration(
  60. "Sync.PassphraseType2",
  61. GetPassphraseTypeForAllProfiles(get_all_sync_services_callback_.Run()));
  62. }
  63. } // namespace syncer