Index: chrome/app/breakpad_win.cc |
diff --git a/chrome/app/breakpad_win.cc b/chrome/app/breakpad_win.cc |
index 06ace8e4dc76267991c1636b47240170b4fd53c2..c6ea28e7304765a607c7867a28b3b0786faf1eed 100644 |
--- a/chrome/app/breakpad_win.cc |
+++ b/chrome/app/breakpad_win.cc |
@@ -17,12 +17,14 @@ |
#include "base/file_version_info.h" |
#include "base/registry.h" |
#include "base/string_util.h" |
+#include "base/utf_string_conversions.h" |
#include "base/win_util.h" |
#include "breakpad/src/client/windows/handler/exception_handler.h" |
#include "chrome/app/hard_error_handler_win.h" |
#include "chrome/common/child_process_logging.h" |
#include "chrome/common/env_vars.h" |
#include "chrome/common/result_codes.h" |
+#include "chrome/common/policy_constants.h" |
#include "chrome/installer/util/google_chrome_sxs_distribution.h" |
#include "chrome/installer/util/google_update_settings.h" |
#include "chrome/installer/util/install_util.h" |
@@ -385,6 +387,29 @@ bool ShowRestartDialogIfCrashed(bool* exit_now) { |
flags, exit_now); |
} |
+// Determine whether configuration management allows loading the crash reporter. |
+// Since the configuration management infrastructure is not initialized at this |
+// point, we read the corresponding registry key directly. The return status |
+// indicates whether policy data was successfully read. If it is true, |result| |
+// contains the value set by policy. |
+static bool MetricsReportingControlledByPolicy(bool* result) { |
+ std::wstring key_name = UTF8ToWide(policy::key::kMetricsReportingEnabled); |
+ DWORD value; |
+ RegKey hkcu_policy_key(HKEY_LOCAL_MACHINE, policy::kRegistrySubKey); |
+ if (hkcu_policy_key.ReadValueDW(key_name.c_str(), &value)) { |
+ *result = value != 0; |
+ return true; |
+ } |
+ |
+ RegKey hklm_policy_key(HKEY_CURRENT_USER, policy::kRegistrySubKey); |
+ if (hklm_policy_key.ReadValueDW(key_name.c_str(), &value)) { |
+ *result = value != 0; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
static DWORD __stdcall InitCrashReporterThread(void* param) { |
scoped_ptr<CrashReporterInfo> info( |
reinterpret_cast<CrashReporterInfo*>(param)); |
@@ -400,9 +425,16 @@ static DWORD __stdcall InitCrashReporterThread(void* param) { |
callback = &DumpDoneCallback; |
} |
+ // Check whether configuration management controls crash reporting. |
+ bool crash_reporting_enabled = true; |
+ bool controlled_by_policy = |
+ MetricsReportingControlledByPolicy(&crash_reporting_enabled); |
+ |
const CommandLine& command = *CommandLine::ForCurrentProcess(); |
- bool use_crash_service = command.HasSwitch(switches::kNoErrorDialogs) || |
- GetEnvironmentVariable(ASCIIToWide(env_vars::kHeadless).c_str(), NULL, 0); |
+ bool use_crash_service = !controlled_by_policy && |
nsylvain
2010/07/30 17:12:49
I'm not sure when/how the registry value is going
Mattias Nissler (ping if slow)
2010/07/30 18:14:06
The registry value is the hook administrators use
|
+ ((command.HasSwitch(switches::kNoErrorDialogs) || |
+ GetEnvironmentVariable( |
+ ASCIIToWide(env_vars::kHeadless).c_str(), NULL, 0))); |
bool is_per_user_install = |
InstallUtil::IsPerUserInstall(info->dll_path.c_str()); |
@@ -412,10 +444,17 @@ static DWORD __stdcall InitCrashReporterThread(void* param) { |
pipe_name = kChromePipeName; |
} else { |
// We want to use the Google Update crash reporting. We need to check if the |
- // user allows it first. |
- if (!GoogleUpdateSettings::GetCollectStatsConsent()) { |
- // The user did not allow Google Update to send crashes, we need to use |
- // our default crash handler instead, but only for the browser process. |
+ // user allows it first (in case the administrator didn't already decide |
+ // via policy). |
+ if (!controlled_by_policy) |
+ crash_reporting_enabled = GoogleUpdateSettings::GetCollectStatsConsent(); |
+ |
+ LOG(ERROR) << "crash reporting enabled " << crash_reporting_enabled; |
+ |
+ if (!crash_reporting_enabled) { |
+ // Configuration managed or the user did not allow Google Update to send |
+ // crashes, we need to use our default crash handler instead, but only |
+ // for the browser process. |
if (callback) |
InitDefaultCrashCallback(); |
return 0; |