| Index: chrome/app/breakpad_mac.mm
|
| diff --git a/chrome/app/breakpad_mac.mm b/chrome/app/breakpad_mac.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5ffc147df86e24eb9d0e58e99a03b781ff846bd8
|
| --- /dev/null
|
| +++ b/chrome/app/breakpad_mac.mm
|
| @@ -0,0 +1,95 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#import "chrome/app/breakpad_mac.h"
|
| +
|
| +#import <objc/objc-class.h>
|
| +#import <Foundation/Foundation.h>
|
| +
|
| +#import "base/basictypes.h"
|
| +#import "base/logging.h"
|
| +#import "base/scoped_nsautorelease_pool.h"
|
| +
|
| +// TODO(jeremy): Remove this block once we include the breakpad sources
|
| +// in the public tree.
|
| +@interface GoogleBreakpadWrapper : NSObject
|
| + +(void*)Create:(NSDictionary*) parameters;
|
| + +(void)Release:(void*) ref;
|
| +@end
|
| +typedef void* GoogleBreakpadRef;
|
| +
|
| +namespace {
|
| +
|
| +// TODO(jeremy): On Windows we store the current URL when a process crashes
|
| +// we probably want to do the same on OS X.
|
| +
|
| +GoogleBreakpadRef gBreakpadRef = NULL;
|
| +
|
| +// Did the user optin for reporting stats.
|
| +bool IsStatsReportingAllowed() {
|
| + NOTIMPLEMENTED();
|
| + return true;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +bool IsCrashReporterEnabled() {
|
| + return gBreakpadRef == NULL;
|
| +}
|
| +
|
| +void DestructCrashReporter() {
|
| + if (gBreakpadRef) {
|
| + Class breakpad_interface = objc_getClass("GoogleBreakpadWrapper");
|
| + [breakpad_interface Release:gBreakpadRef];
|
| + gBreakpadRef = NULL;
|
| + }
|
| +}
|
| +
|
| +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.
|
| + if (!IsStatsReportingAllowed()) {
|
| + LOG(WARNING) << "Breakpad disabled";
|
| + return;
|
| + }
|
| +
|
| + NSBundle* main_bundle = [NSBundle mainBundle];
|
| +
|
| + // Get location of breakpad.
|
| + NSString* breakpadBundlePath = [[main_bundle privateFrameworksPath]
|
| + stringByAppendingPathComponent:@"GoogleBreakpad.framework"];
|
| +
|
| + BOOL is_dir = NO;
|
| + if (![[NSFileManager defaultManager] fileExistsAtPath:breakpadBundlePath
|
| + isDirectory:&is_dir] || !is_dir) {
|
| + return;
|
| + }
|
| +
|
| + NSBundle* breakpad_bundle = [NSBundle bundleWithPath:breakpadBundlePath];
|
| + if (![breakpad_bundle load]) {
|
| + LOG(ERROR) << "Failed to load Breakpad framework.";
|
| + return;
|
| + }
|
| +
|
| + Class breakpad_interface = [breakpad_bundle
|
| + classNamed:@"GoogleBreakpadWrapper"];
|
| +
|
| + if (!breakpad_interface) {
|
| + LOG(ERROR) << "Failed to find GoogleBreakpadWrapper class.";
|
| + return;
|
| + }
|
| +
|
| + NSDictionary* info_dictionary = [main_bundle infoDictionary];
|
| + GoogleBreakpadRef breakpad = 0;
|
| + breakpad = [breakpad_interface Create:info_dictionary];
|
| + if (!breakpad) {
|
| + LOG(ERROR) << "Breakpad init failed.";
|
| + return;
|
| + }
|
| +
|
| + gBreakpadRef = breakpad;
|
| +}
|
|
|