| Index: chrome/browser/component_updater/sw_reporter_installer_win.cc
|
| diff --git a/chrome/browser/component_updater/sw_reporter_installer_win.cc b/chrome/browser/component_updater/sw_reporter_installer_win.cc
|
| index f7beb46f81dfaacf0fd5411bf88a86ed98f615f1..72bd7fc7b736743585ebb3e8a603cf18eee07698 100644
|
| --- a/chrome/browser/component_updater/sw_reporter_installer_win.cc
|
| +++ b/chrome/browser/component_updater/sw_reporter_installer_win.cc
|
| @@ -82,7 +82,11 @@ const base::FilePath::CharType kSwReporterExeName[] =
|
| // Where to fetch the reporter exit code in the registry.
|
| const wchar_t kSoftwareRemovalToolRegistryKey[] =
|
| L"Software\\Google\\Software Removal Tool";
|
| +const wchar_t kCleanerSuffixRegistryKey[] = L"Cleaner";
|
| const wchar_t kExitCodeRegistryValueName[] = L"ExitCode";
|
| +const wchar_t kVersionRegistryValueName[] = L"Version";
|
| +const wchar_t kStartTimeRegistryValueName[] = L"StartTime";
|
| +const wchar_t kEndTimeRegistryValueName[] = L"EndTime";
|
|
|
| // Field trial strings.
|
| const char kSRTPromptTrialName[] = "SRTPromptFieldTrial";
|
| @@ -329,6 +333,47 @@ void RegisterSwReporterComponent(ComponentUpdateService* cus,
|
| return;
|
| }
|
|
|
| + // Check if we have information from Cleaner and record UMA statistics.
|
| + base::string16 cleaner_key_name(kSoftwareRemovalToolRegistryKey);
|
| + cleaner_key_name.append(1, L'\\').append(kCleanerSuffixRegistryKey);
|
| + base::win::RegKey cleaner_key(
|
| + HKEY_CURRENT_USER, cleaner_key_name.c_str(), KEY_ALL_ACCESS);
|
| + // Cleaner is assumed to have run if we have a start time.
|
| + if (cleaner_key.Valid() &&
|
| + cleaner_key.HasValue(kStartTimeRegistryValueName)) {
|
| + // Get version number.
|
| + if (cleaner_key.HasValue(kVersionRegistryValueName)) {
|
| + DWORD version;
|
| + cleaner_key.ReadValueDW(kVersionRegistryValueName, &version);
|
| + UMA_HISTOGRAM_SPARSE_SLOWLY("SoftwareReporter.Cleaner.Version", version);
|
| + cleaner_key.DeleteValue(kVersionRegistryValueName);
|
| + }
|
| + // Get start & end time. If we don't have an end time, we can assume the
|
| + // cleaner has crashed.
|
| + bool completed = cleaner_key.HasValue(kEndTimeRegistryValueName);
|
| + UMA_HISTOGRAM_BOOLEAN("SoftwareReporter.Cleaner.HasCompleted", completed);
|
| + if (completed) {
|
| + int64 start_time_value;
|
| + cleaner_key.ReadInt64(kStartTimeRegistryValueName, &start_time_value);
|
| + int64 end_time_value;
|
| + cleaner_key.ReadInt64(kEndTimeRegistryValueName, &end_time_value);
|
| + cleaner_key.DeleteValue(kEndTimeRegistryValueName);
|
| + base::TimeDelta run_time(base::Time::FromInternalValue(end_time_value) -
|
| + base::Time::FromInternalValue(start_time_value));
|
| + UMA_HISTOGRAM_LONG_TIMES("SoftwareReporter.Cleaner.RunningTime",
|
| + run_time);
|
| + }
|
| + // Get exit code.
|
| + if (cleaner_key.HasValue(kExitCodeRegistryValueName)) {
|
| + DWORD exit_code;
|
| + cleaner_key.ReadValueDW(kExitCodeRegistryValueName, &exit_code);
|
| + UMA_HISTOGRAM_SPARSE_SLOWLY("SoftwareReporter.Cleaner.ExitCode",
|
| + exit_code);
|
| + cleaner_key.DeleteValue(kExitCodeRegistryValueName);
|
| + }
|
| + cleaner_key.DeleteValue(kStartTimeRegistryValueName);
|
| + }
|
| +
|
| // Install the component.
|
| scoped_ptr<ComponentInstallerTraits> traits(
|
| new SwReporterInstallerTraits(prefs));
|
|
|