Index: chrome/browser/metrics/metrics_state_manager.cc |
diff --git a/chrome/browser/metrics/metrics_state_manager.cc b/chrome/browser/metrics/metrics_state_manager.cc |
deleted file mode 100644 |
index e6024705f211367ceb4cfda2d07a722d21e47cad..0000000000000000000000000000000000000000 |
--- a/chrome/browser/metrics/metrics_state_manager.cc |
+++ /dev/null |
@@ -1,218 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/metrics/metrics_state_manager.h" |
- |
-#include "base/command_line.h" |
-#include "base/guid.h" |
-#include "base/metrics/histogram.h" |
-#include "base/metrics/sparse_histogram.h" |
-#include "base/prefs/pref_registry_simple.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/rand_util.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/time/time.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/pref_names.h" |
-#include "components/metrics/cloned_install_detector.h" |
-#include "components/metrics/machine_id_provider.h" |
-#include "components/metrics/metrics_pref_names.h" |
-#include "components/variations/caching_permuted_entropy_provider.h" |
- |
-namespace metrics { |
- |
-namespace { |
- |
-// The argument used to generate a non-identifying entropy source. We want no |
-// more than 13 bits of entropy, so use this max to return a number in the range |
-// [0, 7999] as the entropy source (12.97 bits of entropy). |
-const int kMaxLowEntropySize = 8000; |
- |
-// Default prefs value for ::prefs::kMetricsLowEntropySource to indicate that |
-// the value has not yet been set. |
-const int kLowEntropySourceNotSet = -1; |
- |
-// Generates a new non-identifying entropy source used to seed persistent |
-// activities. |
-int GenerateLowEntropySource() { |
- return base::RandInt(0, kMaxLowEntropySize - 1); |
-} |
- |
-} // namespace |
- |
-// static |
-bool MetricsStateManager::instance_exists_ = false; |
- |
-MetricsStateManager::MetricsStateManager( |
- PrefService* local_state, |
- const base::Callback<bool(void)>& is_reporting_enabled_callback) |
- : local_state_(local_state), |
- is_reporting_enabled_callback_(is_reporting_enabled_callback), |
- low_entropy_source_(kLowEntropySourceNotSet), |
- entropy_source_returned_(ENTROPY_SOURCE_NONE) { |
- ResetMetricsIDsIfNecessary(); |
- if (IsMetricsReportingEnabled()) |
- ForceClientIdCreation(); |
- |
- DCHECK(!instance_exists_); |
- instance_exists_ = true; |
-} |
- |
-MetricsStateManager::~MetricsStateManager() { |
- DCHECK(instance_exists_); |
- instance_exists_ = false; |
-} |
- |
-bool MetricsStateManager::IsMetricsReportingEnabled() { |
- return is_reporting_enabled_callback_.Run(); |
-} |
- |
-void MetricsStateManager::ForceClientIdCreation() { |
- if (!client_id_.empty()) |
- return; |
- |
- client_id_ = local_state_->GetString(::prefs::kMetricsClientID); |
- if (!client_id_.empty()) |
- return; |
- |
- client_id_ = base::GenerateGUID(); |
- local_state_->SetString(::prefs::kMetricsClientID, client_id_); |
- |
- if (local_state_->GetString(::prefs::kMetricsOldClientID).empty()) { |
- // Record the timestamp of when the user opted in to UMA. |
- local_state_->SetInt64(::prefs::kMetricsReportingEnabledTimestamp, |
- base::Time::Now().ToTimeT()); |
- } else { |
- UMA_HISTOGRAM_BOOLEAN("UMA.ClientIdMigrated", true); |
- } |
- local_state_->ClearPref(::prefs::kMetricsOldClientID); |
-} |
- |
-void MetricsStateManager::CheckForClonedInstall( |
- scoped_refptr<base::SingleThreadTaskRunner> task_runner) { |
- DCHECK(!cloned_install_detector_); |
- |
- MachineIdProvider* provider = MachineIdProvider::CreateInstance(); |
- if (!provider) |
- return; |
- |
- cloned_install_detector_.reset(new ClonedInstallDetector(provider)); |
- cloned_install_detector_->CheckForClonedInstall(local_state_, task_runner); |
-} |
- |
-scoped_ptr<const base::FieldTrial::EntropyProvider> |
-MetricsStateManager::CreateEntropyProvider() { |
- // For metrics reporting-enabled users, we combine the client ID and low |
- // entropy source to get the final entropy source. Otherwise, only use the low |
- // entropy source. |
- // This has two useful properties: |
- // 1) It makes the entropy source less identifiable for parties that do not |
- // know the low entropy source. |
- // 2) It makes the final entropy source resettable. |
- const int low_entropy_source_value = GetLowEntropySource(); |
- UMA_HISTOGRAM_SPARSE_SLOWLY("UMA.LowEntropySourceValue", |
- low_entropy_source_value); |
- if (IsMetricsReportingEnabled()) { |
- if (entropy_source_returned_ == ENTROPY_SOURCE_NONE) |
- entropy_source_returned_ = ENTROPY_SOURCE_HIGH; |
- DCHECK_EQ(ENTROPY_SOURCE_HIGH, entropy_source_returned_); |
- const std::string high_entropy_source = |
- client_id_ + base::IntToString(low_entropy_source_value); |
- return scoped_ptr<const base::FieldTrial::EntropyProvider>( |
- new SHA1EntropyProvider(high_entropy_source)); |
- } |
- |
- if (entropy_source_returned_ == ENTROPY_SOURCE_NONE) |
- entropy_source_returned_ = ENTROPY_SOURCE_LOW; |
- DCHECK_EQ(ENTROPY_SOURCE_LOW, entropy_source_returned_); |
- |
-#if defined(OS_ANDROID) || defined(OS_IOS) |
- return scoped_ptr<const base::FieldTrial::EntropyProvider>( |
- new CachingPermutedEntropyProvider(local_state_, |
- low_entropy_source_value, |
- kMaxLowEntropySize)); |
-#else |
- return scoped_ptr<const base::FieldTrial::EntropyProvider>( |
- new PermutedEntropyProvider(low_entropy_source_value, |
- kMaxLowEntropySize)); |
-#endif |
-} |
- |
-// static |
-scoped_ptr<MetricsStateManager> MetricsStateManager::Create( |
- PrefService* local_state, |
- const base::Callback<bool(void)>& is_reporting_enabled_callback) { |
- scoped_ptr<MetricsStateManager> result; |
- // Note: |instance_exists_| is updated in the constructor and destructor. |
- if (!instance_exists_) { |
- result.reset( |
- new MetricsStateManager(local_state, is_reporting_enabled_callback)); |
- } |
- return result.Pass(); |
-} |
- |
-// static |
-void MetricsStateManager::RegisterPrefs(PrefRegistrySimple* registry) { |
- registry->RegisterBooleanPref(prefs::kMetricsResetIds, false); |
- registry->RegisterStringPref(::prefs::kMetricsClientID, std::string()); |
- registry->RegisterInt64Pref(::prefs::kMetricsReportingEnabledTimestamp, 0); |
- registry->RegisterIntegerPref(::prefs::kMetricsLowEntropySource, |
- kLowEntropySourceNotSet); |
- |
- ClonedInstallDetector::RegisterPrefs(registry); |
- CachingPermutedEntropyProvider::RegisterPrefs(registry); |
- |
- // TODO(asvitkine): Remove these once a couple of releases have passed. |
- // http://crbug.com/357704 |
- registry->RegisterStringPref(::prefs::kMetricsOldClientID, std::string()); |
- registry->RegisterIntegerPref(::prefs::kMetricsOldLowEntropySource, 0); |
-} |
- |
-int MetricsStateManager::GetLowEntropySource() { |
- // Note that the default value for the low entropy source and the default pref |
- // value are both kLowEntropySourceNotSet, which is used to identify if the |
- // value has been set or not. |
- if (low_entropy_source_ != kLowEntropySourceNotSet) |
- return low_entropy_source_; |
- |
- const CommandLine* command_line(CommandLine::ForCurrentProcess()); |
- // Only try to load the value from ::prefs if the user did not request a |
- // reset. |
- // Otherwise, skip to generating a new value. |
- if (!command_line->HasSwitch(switches::kResetVariationState)) { |
- int value = local_state_->GetInteger(::prefs::kMetricsLowEntropySource); |
- // If the value is outside the [0, kMaxLowEntropySize) range, re-generate |
- // it below. |
- if (value >= 0 && value < kMaxLowEntropySize) { |
- low_entropy_source_ = value; |
- UMA_HISTOGRAM_BOOLEAN("UMA.GeneratedLowEntropySource", false); |
- return low_entropy_source_; |
- } |
- } |
- |
- UMA_HISTOGRAM_BOOLEAN("UMA.GeneratedLowEntropySource", true); |
- low_entropy_source_ = GenerateLowEntropySource(); |
- local_state_->SetInteger(::prefs::kMetricsLowEntropySource, |
- low_entropy_source_); |
- local_state_->ClearPref(::prefs::kMetricsOldLowEntropySource); |
- CachingPermutedEntropyProvider::ClearCache(local_state_); |
- |
- return low_entropy_source_; |
-} |
- |
-void MetricsStateManager::ResetMetricsIDsIfNecessary() { |
- if (!local_state_->GetBoolean(prefs::kMetricsResetIds)) |
- return; |
- |
- UMA_HISTOGRAM_BOOLEAN("UMA.MetricsIDsReset", true); |
- |
- DCHECK(client_id_.empty()); |
- DCHECK_EQ(kLowEntropySourceNotSet, low_entropy_source_); |
- |
- local_state_->ClearPref(::prefs::kMetricsClientID); |
- local_state_->ClearPref(::prefs::kMetricsLowEntropySource); |
- local_state_->ClearPref(prefs::kMetricsResetIds); |
-} |
- |
-} // namespace metrics |