diff options
author | gab@chromium.org <gab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-09 18:53:22 +0000 |
---|---|---|
committer | gab@chromium.org <gab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-09 18:53:22 +0000 |
commit | 9d1b0158bcf46195412d15b9d1be9d479caab740 (patch) | |
tree | 76bf98efe1a3981e300f1ce02b499ee7113839d9 | |
parent | b8da79f3624019a2bcd3916fc573f5f861840fb5 (diff) | |
download | chromium_src-9d1b0158bcf46195412d15b9d1be9d479caab740.zip chromium_src-9d1b0158bcf46195412d15b9d1be9d479caab740.tar.gz chromium_src-9d1b0158bcf46195412d15b9d1be9d479caab740.tar.bz2 |
Refactor SetClientID such that metrics rather than crash backs up the client id
in Google Update settings.
Consequentially, the backed up client_id now keeps its dashes and crash_keys
strips them at runtime rather than when backing it up
(https://codereview.chromium.org/372473004/ will add support for stripped
client_id backups for some time).
Also rename a lot of methods involved in setting the client id; having all of
them named "SetClientID" makes this series of calls very hard to follow!
BUG=391338
TBR=thestig
Review URL: https://codereview.chromium.org/365133005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282093 0039d316-1c4b-4281-b951-d872f2087c98
20 files changed, 76 insertions, 62 deletions
diff --git a/chrome/app/chrome_breakpad_client.cc b/chrome/app/chrome_breakpad_client.cc index 09cf2fa..38abe83 100644 --- a/chrome/app/chrome_breakpad_client.cc +++ b/chrome/app/chrome_breakpad_client.cc @@ -80,8 +80,9 @@ ChromeBreakpadClient::ChromeBreakpadClient() {} ChromeBreakpadClient::~ChromeBreakpadClient() {} -void ChromeBreakpadClient::SetClientID(const std::string& client_id) { - crash_keys::SetClientID(client_id); +void ChromeBreakpadClient::SetBreakpadClientIdFromGUID( + const std::string& client_guid) { + crash_keys::SetCrashClientIdFromGUID(client_guid); } #if defined(OS_WIN) diff --git a/chrome/app/chrome_breakpad_client.h b/chrome/app/chrome_breakpad_client.h index 489e8fe..7b750bd 100644 --- a/chrome/app/chrome_breakpad_client.h +++ b/chrome/app/chrome_breakpad_client.h @@ -17,7 +17,8 @@ class ChromeBreakpadClient : public breakpad::BreakpadClient { virtual ~ChromeBreakpadClient(); // breakpad::BreakpadClient implementation. - virtual void SetClientID(const std::string& client_id) OVERRIDE; + virtual void SetBreakpadClientIdFromGUID( + const std::string& client_guid) OVERRIDE; #if defined(OS_WIN) virtual bool GetAlternativeCrashDumpLocation(base::FilePath* crash_dir) OVERRIDE; diff --git a/chrome/app/client_util.cc b/chrome/app/client_util.cc index e8c0900..ac6dbfc 100644 --- a/chrome/app/client_util.cc +++ b/chrome/app/client_util.cc @@ -76,7 +76,7 @@ void GetPreReadPopulationAndGroup(double* population, double* group) { // By default we use the metrics id for the user as stable pseudo-random // input to a hash. std::string metrics_id; - GoogleUpdateSettings::GetMetricsId(&metrics_id); + GoogleUpdateSettings::LoadMetricsClientId(&metrics_id); // If this user has not metrics id, we fall back to a purely random value // per browser session. diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 14511cc..068ddde 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -1470,7 +1470,7 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches( #if defined(OS_POSIX) if (breakpad::IsCrashReporterEnabled()) { std::string enable_crash_reporter; - GoogleUpdateSettings::GetMetricsId(&enable_crash_reporter); + GoogleUpdateSettings::LoadMetricsClientId(&enable_crash_reporter); command_line->AppendSwitchASCII(switches::kEnableCrashReporter, enable_crash_reporter); } diff --git a/chrome/browser/google/google_update_settings_posix.cc b/chrome/browser/google/google_update_settings_posix.cc index 67e63cc..99dc0cc 100644 --- a/chrome/browser/google/google_update_settings_posix.cc +++ b/chrome/browser/google/google_update_settings_posix.cc @@ -14,8 +14,9 @@ namespace { -base::LazyInstance<std::string>::Leaky g_posix_guid = LAZY_INSTANCE_INITIALIZER; -base::LazyInstance<base::Lock>::Leaky g_posix_guid_lock = +base::LazyInstance<std::string>::Leaky g_posix_client_id = + LAZY_INSTANCE_INITIALIZER; +base::LazyInstance<base::Lock>::Leaky g_posix_client_id_lock = LAZY_INSTANCE_INITIALIZER; // File name used in the user data dir to indicate consent. @@ -28,11 +29,15 @@ bool GoogleUpdateSettings::GetCollectStatsConsent() { base::FilePath consent_file; PathService::Get(chrome::DIR_USER_DATA, &consent_file); consent_file = consent_file.Append(kConsentToSendStats); + + if (!base::DirectoryExists(consent_file.DirName())) + return false; + std::string tmp_guid; bool consented = base::ReadFileToString(consent_file, &tmp_guid); if (consented) { - base::AutoLock lock(g_posix_guid_lock.Get()); - g_posix_guid.Get().assign(tmp_guid); + base::AutoLock lock(g_posix_client_id_lock.Get()); + g_posix_client_id.Get().assign(tmp_guid); } return consented; } @@ -44,44 +49,40 @@ bool GoogleUpdateSettings::SetCollectStatsConsent(bool consented) { if (!base::DirectoryExists(consent_dir)) return false; - base::AutoLock lock(g_posix_guid_lock.Get()); + base::AutoLock lock(g_posix_client_id_lock.Get()); base::FilePath consent_file = consent_dir.AppendASCII(kConsentToSendStats); if (consented) { if ((!base::PathExists(consent_file)) || - (base::PathExists(consent_file) && !g_posix_guid.Get().empty())) { - const char* c_str = g_posix_guid.Get().c_str(); - int size = g_posix_guid.Get().size(); + (base::PathExists(consent_file) && !g_posix_client_id.Get().empty())) { + const char* c_str = g_posix_client_id.Get().c_str(); + int size = g_posix_client_id.Get().size(); return base::WriteFile(consent_file, c_str, size) == size; } } else { - g_posix_guid.Get().clear(); + g_posix_client_id.Get().clear(); return base::DeleteFile(consent_file, false); } return true; } // static -bool GoogleUpdateSettings::GetMetricsId(std::string* metrics_id) { - base::AutoLock lock(g_posix_guid_lock.Get()); - *metrics_id = g_posix_guid.Get(); +bool GoogleUpdateSettings::LoadMetricsClientId(std::string* metrics_id) { + base::AutoLock lock(g_posix_client_id_lock.Get()); + *metrics_id = g_posix_client_id.Get(); return true; } // static -bool GoogleUpdateSettings::SetMetricsId(const std::string& client_id) { +bool GoogleUpdateSettings::StoreMetricsClientId(const std::string& client_id) { // Make sure that user has consented to send crashes. - base::FilePath consent_dir; - PathService::Get(chrome::DIR_USER_DATA, &consent_dir); - if (!base::DirectoryExists(consent_dir) || - !GoogleUpdateSettings::GetCollectStatsConsent()) { + if (!GoogleUpdateSettings::GetCollectStatsConsent()) return false; - } { // Since user has consented, write the metrics id to the file. - base::AutoLock lock(g_posix_guid_lock.Get()); - g_posix_guid.Get() = client_id; + base::AutoLock lock(g_posix_client_id_lock.Get()); + g_posix_client_id.Get() = client_id; } return GoogleUpdateSettings::SetCollectStatsConsent(true); } diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index 6a2c51b..f10cc15 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc @@ -35,6 +35,7 @@ #include "chrome/common/crash_keys.h" #include "chrome/common/pref_names.h" #include "chrome/common/render_messages.h" +#include "chrome/installer/util/google_update_settings.h" #include "components/metrics/metrics_service.h" #include "components/metrics/net/net_metrics_log_uploader.h" #include "content/public/browser/browser_thread.h" @@ -161,8 +162,12 @@ void ChromeMetricsServiceClient::RegisterPrefs(PrefRegistrySimple* registry) { #endif // defined(ENABLE_PLUGINS) } -void ChromeMetricsServiceClient::SetClientID(const std::string& client_id) { - crash_keys::SetClientID(client_id); +void ChromeMetricsServiceClient::SetMetricsClientId( + const std::string& client_id) { + crash_keys::SetCrashClientIdFromGUID(client_id); + + // Store a backup of the client id in Google Update settings. + GoogleUpdateSettings::StoreMetricsClientId(client_id); } bool ChromeMetricsServiceClient::IsOffTheRecordSessionActive() { diff --git a/chrome/browser/metrics/chrome_metrics_service_client.h b/chrome/browser/metrics/chrome_metrics_service_client.h index 03f9c83..12015f7 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.h +++ b/chrome/browser/metrics/chrome_metrics_service_client.h @@ -52,7 +52,7 @@ class ChromeMetricsServiceClient static void RegisterPrefs(PrefRegistrySimple* registry); // metrics::MetricsServiceClient: - virtual void SetClientID(const std::string& client_id) OVERRIDE; + virtual void SetMetricsClientId(const std::string& client_id) OVERRIDE; virtual bool IsOffTheRecordSessionActive() OVERRIDE; virtual std::string GetApplicationLocale() OVERRIDE; virtual bool GetBrand(std::string* brand_code) OVERRIDE; diff --git a/chrome/common/child_process_logging_win.cc b/chrome/common/child_process_logging_win.cc index 1befb33..b849734 100644 --- a/chrome/common/child_process_logging_win.cc +++ b/chrome/common/child_process_logging_win.cc @@ -65,12 +65,13 @@ void Init() { base::debug::SetCrashKeyReportingFunctions( &SetCrashKeyValueTrampoline, &ClearCrashKeyValueTrampoline); - // This would be handled by BreakpadClient::SetClientID(), but because of the - // aforementioned issue, crash keys aren't ready yet at the time of Breakpad - // initialization. - std::string client_id; - if (GoogleUpdateSettings::GetMetricsId(&client_id)) - base::debug::SetCrashKeyValue(crash_keys::kClientID, client_id); + // This would be handled by BreakpadClient::SetCrashClientIdFromGUID(), but + // because of the aforementioned issue, crash keys aren't ready yet at the + // time of Breakpad initialization, load the client id backed up in Google + // Update settings instead. + std::string client_guid; + if (GoogleUpdateSettings::LoadMetricsClientId(&client_guid)) + crash_keys::SetCrashClientIdFromGUID(client_guid); } } // namespace child_process_logging diff --git a/chrome/common/crash_keys.cc b/chrome/common/crash_keys.cc index edb6cac..84a83ef 100644 --- a/chrome/common/crash_keys.cc +++ b/chrome/common/crash_keys.cc @@ -11,7 +11,6 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/installer/util/google_update_settings.h" #if defined(OS_MACOSX) #include "breakpad/src/common/simple_string_dictionary.h" @@ -56,7 +55,7 @@ COMPILE_ASSERT(kMediumSize <= kSingleChunkLength, mac_has_medium_size_crash_key_chunks); #endif -const char kClientID[] = "guid"; +const char kClientId[] = "guid"; const char kChannel[] = "channel"; @@ -119,7 +118,7 @@ size_t RegisterChromeCrashKeys() { // The following keys may be chunked by the underlying crash logging system, // but ultimately constitute a single key-value pair. base::debug::CrashKey fixed_keys[] = { - { kClientID, kSmallSize }, + { kClientId, kSmallSize }, { kChannel, kSmallSize }, { kActiveURL, kLargeSize }, { kNumSwitches, kSmallSize }, @@ -225,15 +224,14 @@ size_t RegisterChromeCrashKeys() { kSingleChunkLength); } -void SetClientID(const std::string& client_id) { - std::string guid(client_id); +void SetCrashClientIdFromGUID(const std::string& client_guid) { + std::string stripped_guid(client_guid); // Remove all instance of '-' char from the GUID. So BCD-WXY becomes BCDWXY. - ReplaceSubstringsAfterOffset(&guid, 0, "-", ""); - if (guid.empty()) + ReplaceSubstringsAfterOffset(&stripped_guid, 0, "-", ""); + if (stripped_guid.empty()) return; - base::debug::SetCrashKeyValue(kClientID, guid); - GoogleUpdateSettings::SetMetricsId(guid); + base::debug::SetCrashKeyValue(kClientId, stripped_guid); } static bool IsBoringSwitch(const std::string& flag) { diff --git a/chrome/common/crash_keys.h b/chrome/common/crash_keys.h index dd378fb..e38880b 100644 --- a/chrome/common/crash_keys.h +++ b/chrome/common/crash_keys.h @@ -21,8 +21,11 @@ namespace crash_keys { // reporting server. Returns the size of the union of all keys. size_t RegisterChromeCrashKeys(); -// Sets the GUID by which this crash reporting client can be identified. -void SetClientID(const std::string& client_id); +// Sets the ID (based on |client_guid| which may either be a full GUID or a +// GUID that was already stripped from its dashes -- in either cases this method +// will strip remaining dashes before setting the crash key) by which this crash +// reporting client can be identified. +void SetCrashClientIdFromGUID(const std::string& client_guid); // Sets the kSwitch and kNumSwitches keys based on the given |command_line|. void SetSwitchesFromCommandLine(const base::CommandLine* command_line); diff --git a/chrome/installer/util/google_update_settings.cc b/chrome/installer/util/google_update_settings.cc index 81e33ed..4d53eca 100644 --- a/chrome/installer/util/google_update_settings.cc +++ b/chrome/installer/util/google_update_settings.cc @@ -296,14 +296,14 @@ bool GoogleUpdateSettings::SetCollectStatsConsentAtLevel(bool system_install, return (result == ERROR_SUCCESS); } -bool GoogleUpdateSettings::GetMetricsId(std::string* metrics_id) { +bool GoogleUpdateSettings::LoadMetricsClientId(std::string* metrics_id) { base::string16 metrics_id16; bool rv = ReadGoogleUpdateStrKey(google_update::kRegMetricsId, &metrics_id16); *metrics_id = base::UTF16ToUTF8(metrics_id16); return rv; } -bool GoogleUpdateSettings::SetMetricsId(const std::string& metrics_id) { +bool GoogleUpdateSettings::StoreMetricsClientId(const std::string& metrics_id) { base::string16 metrics_id16 = base::UTF8ToUTF16(metrics_id); return WriteGoogleUpdateStrKey(google_update::kRegMetricsId, metrics_id16); } diff --git a/chrome/installer/util/google_update_settings.h b/chrome/installer/util/google_update_settings.h index b7bf612..a8e43c4 100644 --- a/chrome/installer/util/google_update_settings.h +++ b/chrome/installer/util/google_update_settings.h @@ -86,12 +86,12 @@ class GoogleUpdateSettings { bool consented); #endif - // Returns the metrics id set in the registry (that can be used in crash - // reports). If none found, returns empty string. - static bool GetMetricsId(std::string* metrics_id); + // Returns the metrics client id backed up in the registry. If none found, + // returns empty string. + static bool LoadMetricsClientId(std::string* metrics_id); - // Sets the metrics id to be used in crash reports. - static bool SetMetricsId(const std::string& metrics_id); + // Stores a backup of the metrics client id in the registry. + static bool StoreMetricsClientId(const std::string& metrics_id); // Sets the machine-wide EULA consented flag required on OEM installs. // Returns false if the setting could not be recorded. diff --git a/components/breakpad/app/breakpad_client.cc b/components/breakpad/app/breakpad_client.cc index 84931ea..5c763ca 100644 --- a/components/breakpad/app/breakpad_client.cc +++ b/components/breakpad/app/breakpad_client.cc @@ -27,7 +27,8 @@ BreakpadClient* GetBreakpadClient() { BreakpadClient::BreakpadClient() {} BreakpadClient::~BreakpadClient() {} -void BreakpadClient::SetClientID(const std::string& client_id) { +void BreakpadClient::SetBreakpadClientIdFromGUID( + const std::string& client_guid) { } #if defined(OS_WIN) diff --git a/components/breakpad/app/breakpad_client.h b/components/breakpad/app/breakpad_client.h index fb3b205..7ade184c 100644 --- a/components/breakpad/app/breakpad_client.h +++ b/components/breakpad/app/breakpad_client.h @@ -46,7 +46,9 @@ class BreakpadClient { // Sets the Breakpad client ID, which is a unique identifier for the client // that is sending crash reports. After it is set, it should not be changed. - virtual void SetClientID(const std::string& client_id); + // |client_guid| may either be a full GUID or a GUID that was already stripped + // from its dashes. + virtual void SetBreakpadClientIdFromGUID(const std::string& client_guid); #if defined(OS_WIN) // Returns true if an alternative location to store the minidump files was diff --git a/components/breakpad/app/breakpad_linux.cc b/components/breakpad/app/breakpad_linux.cc index fe9388c..df9d588 100644 --- a/components/breakpad/app/breakpad_linux.cc +++ b/components/breakpad/app/breakpad_linux.cc @@ -206,7 +206,7 @@ void SetClientIdFromCommandLine(const CommandLine& command_line) { // Get the guid from the command line switch. std::string switch_value = command_line.GetSwitchValueASCII(switches::kEnableCrashReporter); - GetBreakpadClient()->SetClientID(switch_value); + GetBreakpadClient()->SetBreakpadClientIdFromGUID(switch_value); } // MIME substrings. diff --git a/components/breakpad/app/breakpad_mac.mm b/components/breakpad/app/breakpad_mac.mm index d46b0c4..6cb5504 100644 --- a/components/breakpad/app/breakpad_mac.mm +++ b/components/breakpad/app/breakpad_mac.mm @@ -238,9 +238,9 @@ void InitCrashReporter(const std::string& process_type) { if (!is_browser) { // Get the guid from the command line switch. - std::string guid = + std::string client_guid = command_line->GetSwitchValueASCII(switches::kEnableCrashReporter); - GetBreakpadClient()->SetClientID(guid); + GetBreakpadClient()->SetBreakpadClientIdFromGUID(client_guid); } logging::SetLogMessageHandler(&FatalMessageHandler); diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc index b9d8dbb..797ec70 100644 --- a/components/metrics/metrics_service.cc +++ b/components/metrics/metrics_service.cc @@ -404,7 +404,7 @@ void MetricsService::EnableRecording() { recording_active_ = true; state_manager_->ForceClientIdCreation(); - client_->SetClientID(state_manager_->client_id()); + client_->SetMetricsClientId(state_manager_->client_id()); if (!log_manager_.current_log()) OpenNewLog(); diff --git a/components/metrics/metrics_service_client.h b/components/metrics/metrics_service_client.h index 1fcfb6e..d8e2c15 100644 --- a/components/metrics/metrics_service_client.h +++ b/components/metrics/metrics_service_client.h @@ -22,9 +22,9 @@ class MetricsServiceClient { public: virtual ~MetricsServiceClient() {} - // Register the client id with other services (e.g. crash reporting), called + // Registers the client id with other services (e.g. crash reporting), called // when metrics recording gets enabled. - virtual void SetClientID(const std::string& client_id) = 0; + virtual void SetMetricsClientId(const std::string& client_id) = 0; // Whether there's an "off the record" (aka "Incognito") session active. virtual bool IsOffTheRecordSessionActive() = 0; diff --git a/components/metrics/test_metrics_service_client.cc b/components/metrics/test_metrics_service_client.cc index 4e1a3c3..e5e9778 100644 --- a/components/metrics/test_metrics_service_client.cc +++ b/components/metrics/test_metrics_service_client.cc @@ -19,7 +19,8 @@ TestMetricsServiceClient::TestMetricsServiceClient() TestMetricsServiceClient::~TestMetricsServiceClient() { } -void TestMetricsServiceClient::SetClientID(const std::string& client_id) { +void TestMetricsServiceClient::SetMetricsClientId( + const std::string& client_id) { client_id_ = client_id; } diff --git a/components/metrics/test_metrics_service_client.h b/components/metrics/test_metrics_service_client.h index 0b7bdef..edbee2f 100644 --- a/components/metrics/test_metrics_service_client.h +++ b/components/metrics/test_metrics_service_client.h @@ -21,7 +21,7 @@ class TestMetricsServiceClient : public MetricsServiceClient { virtual ~TestMetricsServiceClient(); // MetricsServiceClient: - virtual void SetClientID(const std::string& client_id) OVERRIDE; + virtual void SetMetricsClientId(const std::string& client_id) OVERRIDE; virtual bool IsOffTheRecordSessionActive() OVERRIDE; virtual std::string GetApplicationLocale() OVERRIDE; virtual bool GetBrand(std::string* brand_code) OVERRIDE; |