summaryrefslogtreecommitdiffstats
path: root/chrome/app/breakpad_mac.mm
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/app/breakpad_mac.mm')
-rw-r--r--chrome/app/breakpad_mac.mm98
1 files changed, 46 insertions, 52 deletions
diff --git a/chrome/app/breakpad_mac.mm b/chrome/app/breakpad_mac.mm
index 3bad98d..8a36f16 100644
--- a/chrome/app/breakpad_mac.mm
+++ b/chrome/app/breakpad_mac.mm
@@ -14,15 +14,14 @@
#include "base/sys_string_conversions.h"
#import "breakpad/src/client/mac/Framework/Breakpad.h"
#include "chrome/common/child_process_logging.h"
+#include "chrome/common/chrome_switches.h"
#include "chrome/installer/util/google_update_settings.h"
-extern "C" {
-
namespace {
BreakpadRef gBreakpadRef = NULL;
-} // namespace
+} // namespace
bool IsCrashReporterDisabled() {
return gBreakpadRef == NULL;
@@ -40,66 +39,65 @@ void InitCrashReporter() {
DCHECK(gBreakpadRef == NULL);
base::ScopedNSAutoreleasePool autorelease_pool;
- // Check for Send stats preference. If preference is not specifically turned
- // on then disable crash reporting.
- bool user_consented = GoogleUpdateSettings::GetCollectStatsConsent();
- if (!user_consented) {
+ // Check whether the user has consented to stats and crash reporting. The
+ // browser process can make this determination directly. Helper processes
+ // may not have access to the disk or to the same data as the browser
+ // process, so the browser passes the consent preference to them on the
+ // command line.
+ NSBundle* main_bundle = [NSBundle mainBundle];
+ NSDictionary* info_dictionary = [main_bundle infoDictionary];
+ bool is_browser = [[info_dictionary objectForKey:@"LSUIElement"]
+ isEqualToString:@"1"] ? true : false;
+ bool enable_breakpad =
+ is_browser ? GoogleUpdateSettings::GetCollectStatsConsent() :
+ CommandLine::ForCurrentProcess()->
+ HasSwitch(switches::kEnableCrashReporter);
+
+ if (!enable_breakpad) {
LOG(WARNING) << "Breakpad disabled";
return;
}
- NSBundle* main_bundle = [NSBundle mainBundle];
+ // Tell Breakpad where crash_inspector and crash_report_sender are.
NSString* resource_path = [main_bundle resourcePath];
-
- NSDictionary* info_dictionary = [main_bundle infoDictionary];
- NSMutableDictionary *breakpad_config = [info_dictionary
- mutableCopy];
-
- // Tell Breakpad where inspector & crash_reporter are.
- NSString *inspector_location = [resource_path
- stringByAppendingPathComponent:@"crash_inspector"];
- NSString *reporter_bundle_location = [resource_path
- stringByAppendingPathComponent:@"crash_report_sender.app"];
- NSString *reporter_location = [[NSBundle
- bundleWithPath:reporter_bundle_location]
- executablePath];
-
+ NSString *inspector_location =
+ [resource_path stringByAppendingPathComponent:@"crash_inspector"];
+ NSString *reporter_bundle_location =
+ [resource_path stringByAppendingPathComponent:@"crash_report_sender.app"];
+ NSString *reporter_location =
+ [[NSBundle bundleWithPath:reporter_bundle_location] executablePath];
+
+ NSMutableDictionary *breakpad_config =
+ [[info_dictionary mutableCopy] autorelease];
[breakpad_config setObject:inspector_location
forKey:@BREAKPAD_INSPECTOR_LOCATION];
[breakpad_config setObject:reporter_location
forKey:@BREAKPAD_REPORTER_EXE_LOCATION];
- // Pass crash to Crash Reporter if we're a foreground application [the
- // browser process]. This is so the user gets notification when Chrome
- // crashes and also since we get "restart ui" for free.
- BOOL is_background_app = [[info_dictionary objectForKey:@"LSUIElement"]
- isEqualToString:@"1"];
- if (!is_background_app) {
+ // In the main application (the browser process), crashes can be passed to
+ // the system's Crash Reporter. This allows the system to notify the user
+ // when the application crashes, and provide the user with the option to
+ // restart it.
+ if (is_browser)
[breakpad_config setObject:@"NO" forKey:@BREAKPAD_SEND_AND_EXIT];
- }
- // Init breakpad
- BreakpadRef breakpad = NULL;
- breakpad = BreakpadCreate(breakpad_config);
- if (!breakpad) {
- LOG(ERROR) << "Breakpad init failed.";
+ // Initialize Breakpad.
+ gBreakpadRef = BreakpadCreate(breakpad_config);
+ if (!gBreakpadRef) {
+ LOG(ERROR) << "Breakpad initializaiton failed";
return;
}
- // This needs to be set before calling SetCrashKeyValue().
- gBreakpadRef = breakpad;
-
- // Set breakpad MetaData values.
- // These values are added to the plist when building a branded Chrome.app.
- NSString* version_str = [info_dictionary objectForKey:@BREAKPAD_VERSION];
- SetCrashKeyValue(@"ver", version_str);
- NSString* prod_name_str = [info_dictionary objectForKey:@BREAKPAD_PRODUCT];
- SetCrashKeyValue(@"prod", prod_name_str);
+ // Set Breakpad metadata values. These values are added to Info.plist during
+ // the branded Google Chrome.app build.
+ SetCrashKeyValue(@"ver", [info_dictionary objectForKey:@BREAKPAD_VERSION]);
+ SetCrashKeyValue(@"prod", [info_dictionary objectForKey:@BREAKPAD_PRODUCT]);
SetCrashKeyValue(@"plat", @"OS X");
- // Enable child process crashes to include the page url.
- child_process_logging::SetCrashKeyFunctions(
- SetCrashKeyValue, ClearCrashKeyValue);
+ // Enable child process crashes to include the page URL.
+ // TODO: Should this only be done for certain process types?
+ child_process_logging::SetCrashKeyFunctions(SetCrashKeyValue,
+ ClearCrashKeyValue);
}
void InitCrashProcessInfo() {
@@ -108,10 +106,9 @@ void InitCrashProcessInfo() {
}
// Determine the process type.
- NSString *process_type = @"browser";
- const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
+ NSString* process_type = @"browser";
std::wstring process_type_switch =
- parsed_command_line.GetSwitchValue(switches::kProcessType);
+ CommandLine::ForCurrentProcess()->GetSwitchValue(switches::kProcessType);
if (!process_type_switch.empty()) {
process_type = base::SysWideToNSString(process_type_switch);
}
@@ -139,6 +136,3 @@ void ClearCrashKeyValue(NSString* key) {
BreakpadRemoveUploadParameter(gBreakpadRef, key);
}
-
-}
-