105 lines
3.3 KiB
Text
105 lines
3.3 KiB
Text
// Copyright (c) 2013 GitHub, Inc. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "common/crash_reporter/crash_reporter.h"
|
|
|
|
#include "browser/browser.h"
|
|
#include "base/mac/mac_util.h"
|
|
#include "base/strings/sys_string_conversions.h"
|
|
#include "common/atom_version.h"
|
|
#import "vendor/breakpad/src/client/apple/Framework/BreakpadDefines.h"
|
|
#import "vendor/breakpad/src/client/mac/Framework/Breakpad.h"
|
|
|
|
namespace crash_reporter {
|
|
|
|
namespace {
|
|
|
|
class ScopedCrashReporter {
|
|
public:
|
|
ScopedCrashReporter() : is_browser_(!base::mac::IsBackgroundOnlyProcess()) {
|
|
NSMutableDictionary* parameters =
|
|
[NSMutableDictionary dictionaryWithCapacity:4];
|
|
[parameters setValue:@"GitHub, Inc" forKey:@BREAKPAD_VENDOR];
|
|
|
|
if (is_browser_) {
|
|
[parameters setValue:@"Atom-Shell" forKey:@BREAKPAD_PRODUCT];
|
|
// Use application's version for crashes in browser.
|
|
std::string version = atom::Browser::Get()->GetVersion();
|
|
[parameters setValue:base::SysUTF8ToNSString(version)
|
|
forKey:@BREAKPAD_VERSION];
|
|
} else {
|
|
[parameters setValue:@"Atom-Shell Renderer" forKey:@BREAKPAD_PRODUCT];
|
|
[parameters setValue:@ATOM_VERSION_STRING forKey:@BREAKPAD_VERSION];
|
|
}
|
|
|
|
// Report all crashes (important for testing the crash reporter).
|
|
[parameters setValue:@"0" forKey:@BREAKPAD_REPORT_INTERVAL];
|
|
|
|
// Let the crash reporter log everything in Console.app.
|
|
[parameters setValue:@"NO" forKey:@BREAKPAD_SEND_AND_EXIT];
|
|
|
|
// Send the report by default.
|
|
[parameters setValue:@"YES" forKey:@BREAKPAD_SKIP_CONFIRM];
|
|
|
|
// Use my server as /dev/null if not specified.
|
|
[parameters setValue:@"http://54.249.141.255" forKey:@BREAKPAD_URL];
|
|
|
|
breakpad_ = BreakpadCreate(parameters);
|
|
}
|
|
|
|
~ScopedCrashReporter() { if (breakpad_) BreakpadRelease(breakpad_); }
|
|
|
|
bool is_browser() const { return is_browser_; }
|
|
|
|
void SetKey(const std::string& key, const std::string& value) {
|
|
BreakpadSetKeyValue(breakpad_,
|
|
base::SysUTF8ToNSString(key),
|
|
base::SysUTF8ToNSString(value));
|
|
}
|
|
|
|
static ScopedCrashReporter* Get() {
|
|
if (g_scoped_crash_reporter_ == NULL)
|
|
g_scoped_crash_reporter_ = new ScopedCrashReporter();
|
|
return g_scoped_crash_reporter_;
|
|
}
|
|
|
|
private:
|
|
BreakpadRef breakpad_;
|
|
bool is_browser_;
|
|
|
|
static ScopedCrashReporter* g_scoped_crash_reporter_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(ScopedCrashReporter);
|
|
};
|
|
|
|
ScopedCrashReporter* ScopedCrashReporter::g_scoped_crash_reporter_ = NULL;
|
|
|
|
} // namespace
|
|
|
|
// static
|
|
void CrashReporter::SetProductName(const std::string& name) {
|
|
ScopedCrashReporter* reporter = ScopedCrashReporter::Get();
|
|
if (reporter->is_browser())
|
|
ScopedCrashReporter::Get()->SetKey(BREAKPAD_PRODUCT_DISPLAY, name);
|
|
else
|
|
ScopedCrashReporter::Get()->SetKey(BREAKPAD_PRODUCT_DISPLAY,
|
|
name + " Renderer");
|
|
}
|
|
|
|
// static
|
|
void CrashReporter::SetCompanyName(const std::string& name) {
|
|
ScopedCrashReporter::Get()->SetKey(BREAKPAD_VENDOR, name);
|
|
}
|
|
|
|
// static
|
|
void CrashReporter::SetSubmissionURL(const std::string& url) {
|
|
ScopedCrashReporter::Get()->SetKey(BREAKPAD_URL, url);
|
|
}
|
|
|
|
// static
|
|
void CrashReporter::SetAutoSubmit(bool yes) {
|
|
ScopedCrashReporter::Get()->SetKey(BREAKPAD_SKIP_CONFIRM, yes ? "YES" : "NO");
|
|
}
|
|
|
|
} // namespace crash_reporter
|