Index: chrome/browser/metrics/metrics_services_manager.cc |
diff --git a/chrome/browser/metrics/metrics_services_manager.cc b/chrome/browser/metrics/metrics_services_manager.cc |
index 8278913da7da438199e2c1b3f363649bc54148d3..effee1857671eca86035613975b4093fadf1e51f 100644 |
--- a/chrome/browser/metrics/metrics_services_manager.cc |
+++ b/chrome/browser/metrics/metrics_services_manager.cc |
@@ -4,12 +4,17 @@ |
#include "chrome/browser/metrics/metrics_services_manager.h" |
+#include <string> |
+ |
#include "base/command_line.h" |
+#include "base/guid.h" |
+#include "base/logging.h" |
#include "base/prefs/pref_service.h" |
#include "chrome/browser/metrics/chrome_metrics_service_client.h" |
#include "chrome/browser/metrics/variations/variations_service.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/pref_names.h" |
+#include "chrome/installer/util/google_update_settings.h" |
#include "components/metrics/metrics_service.h" |
#include "components/metrics/metrics_state_manager.h" |
#include "components/rappor/rappor_service.h" |
@@ -18,6 +23,47 @@ |
#include "chrome/browser/chromeos/settings/cros_settings.h" |
#endif |
+namespace { |
+ |
+// Returns the client info returned by |
+// GoogleUpdateSettings::LoadMetricsClientInfo. Also migrates old client id |
+// formats to the new one. |
+scoped_ptr<metrics::ClientInfo> LoadMetricsClientInfo() { |
+ scoped_ptr<metrics::ClientInfo> client_info = |
+ GoogleUpdateSettings::LoadMetricsClientInfo(); |
+ |
+ // Prior to 2014-07, the client ID was stripped of its dashes before being |
+ // saved. Migrate back to a proper GUID if this is the case. This migration |
+ // code below can be removed in M41+. |
+ const size_t kGUIDLengthWithoutDashes = 32U; |
+ if (client_info && |
+ client_info->client_id.length() == kGUIDLengthWithoutDashes) { |
+ DCHECK(client_info->client_id.find('-') == std::string::npos); |
+ |
+ std::string client_id_with_dashes; |
+ client_id_with_dashes.reserve(kGUIDLengthWithoutDashes + 4U); |
+ std::string::const_iterator client_id_it = client_info->client_id.begin(); |
+ for (size_t i = 0; i < kGUIDLengthWithoutDashes + 4U; ++i) { |
+ if (i == 8U || i == 13U || i == 18U || i == 23U) { |
+ client_id_with_dashes.push_back('-'); |
+ } else { |
+ client_id_with_dashes.push_back(*client_id_it); |
+ ++client_id_it; |
+ } |
+ } |
+ DCHECK(client_id_it == client_info->client_id.end()); |
+ client_info->client_id.assign(client_id_with_dashes); |
+ } |
+ |
+ // The GUID retrieved (and possibly fixed above) should be valid unless |
+ // retrieval failed. |
+ DCHECK(!client_info || base::IsValidGUID(client_info->client_id)); |
+ |
+ return client_info.Pass(); |
+} |
+ |
+} // namespace |
+ |
MetricsServicesManager::MetricsServicesManager(PrefService* local_state) |
: local_state_(local_state) { |
DCHECK(local_state); |
@@ -70,7 +116,9 @@ metrics::MetricsStateManager* MetricsServicesManager::GetMetricsStateManager() { |
metrics_state_manager_ = metrics::MetricsStateManager::Create( |
local_state_, |
base::Bind(&MetricsServicesManager::IsMetricsReportingEnabled, |
- base::Unretained(this))); |
+ base::Unretained(this)), |
+ base::Bind(&GoogleUpdateSettings::StoreMetricsClientInfo), |
+ base::Bind(&LoadMetricsClientInfo)); |
} |
return metrics_state_manager_.get(); |
} |