// Copyright 2013 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.
#ifndef COMPONENTS_BREAKPAD_APP_BREAKPAD_CLIENT_H_
#define COMPONENTS_BREAKPAD_APP_BREAKPAD_CLIENT_H_
#include <string>
#include "base/strings/string16.h"
#include "build/build_config.h"
namespace base {
class FilePath;
}
#if defined(OS_MACOSX)
// We don't want to directly include
// breakpad/src/client/mac/Framework/Breakpad.h here, so we repeat the
// definition of BreakpadRef.
//
// On Mac, when compiling without breakpad support, a stub implementation is
// compiled in. Not having any includes of the breakpad library allows for
// reusing this header for the stub.
typedef void* BreakpadRef;
#endif
namespace breakpad {
class BreakpadClient;
// Setter and getter for the client. The client should be set early, before any
// breakpad code is called, and should stay alive throughout the entire runtime.
void SetBreakpadClient(BreakpadClient* client);
#if defined(BREAKPAD_IMPLEMENTATION)
// Breakpad's embedder API should only be used by breakpad.
BreakpadClient* GetBreakpadClient();
#endif
// Interface that the embedder implements.
class BreakpadClient {
public:
BreakpadClient();
virtual ~BreakpadClient();
// Sets the Breakpad client ID, which is a unique identifier for the client
// that is sending crash reports. After it is set, it should not be changed.
virtual void SetClientID(const std::string& client_id);
#if defined(OS_WIN)
// Returns true if an alternative location to store the minidump files was
// specified. Returns true if |crash_dir| was set.
virtual bool GetAlternativeCrashDumpLocation(base::FilePath* crash_dir);
// Returns a textual description of the product type and version to include
// in the crash report.
virtual void GetProductNameAndVersion(const base::FilePath& exe_path,
base::string16* product_name,
base::string16* version,
base::string16* special_build,
base::string16* channel_name);
// Returns true if a restart dialog should be displayed. In that case,
// |message| and |title| are set to a message to display in a dialog box with
// the given title before restarting, and |is_rtl_locale| indicates whether
// to display the text as RTL.
virtual bool ShouldShowRestartDialog(base::string16* title,
base::string16* message,
bool* is_rtl_locale);
// Returns true if it is ok to restart the application. Invoked right before
// restarting after a crash.
virtual bool AboutToRestart();
// Returns true if the crash report uploader supports deferred uploads.
virtual bool GetDeferredUploadsSupported(bool is_per_user_install);
// Returns true if the running binary is a per-user installation.
virtual bool GetIsPerUserInstall(const base::FilePath& exe_path);
// Returns true if larger crash dumps should be dumped.
virtual bool GetShouldDumpLargerDumps(bool is_per_user_install);
// Returns the result code to return when breakpad failed to respawn a
// crashed process.
virtual int GetResultCodeRespawnFailed();
// Invoked when initializing breakpad in the browser process.
virtual void InitBrowserCrashDumpsRegKey();
// Invoked before attempting to write a minidump.
virtual void RecordCrashDumpAttempt(bool is_real_crash);
#endif
#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_IOS)
// Returns a textual description of the product type and version to include
// in the crash report.
virtual void GetProductNameAndVersion(std::string* product_name,
std::string* version);
virtual base::FilePath GetReporterLogFilename();
#endif
// The location where minidump files should be written. Returns true if
// |crash_dir| was set.
virtual bool GetCrashDumpLocation(base::FilePath* crash_dir);
#if defined(OS_POSIX)
// Sets a function that'll be invoked to dump the current process when
// without crashing.
virtual void SetDumpWithoutCrashingFunction(void (*function)());
#endif
// Register all of the potential crash keys that can be sent to the crash
// reporting server. Returns the size of the union of all keys.
virtual size_t RegisterCrashKeys();
// Returns true if running in unattended mode (for automated testing).
virtual bool IsRunningUnattended();
// Returns true if the user has given consent to collect stats.
virtual bool GetCollectStatsConsent();
#if defined(OS_WIN) || defined(OS_MACOSX)
// Returns true if breakpad is enforced via management policies. In that
// case, |breakpad_enabled| is set to the value enforced by policies.
virtual bool ReportingIsEnforcedByPolicy(bool* breakpad_enabled);
#endif
#if defined(OS_ANDROID)
// Returns the descriptor key of the android minidump global descriptor.
virtual int GetAndroidMinidumpDescriptor();
#endif
#if defined(OS_MACOSX)
// Install additional breakpad filter callbacks.
virtual void InstallAdditionalFilters(BreakpadRef breakpad);
#endif
// Returns true if breakpad should run in the given process type.
virtual bool EnableBreakpadForProcess(const std::string& process_type);
};
} // namespace breakpad
#endif // COMPONENTS_BREAKPAD_APP_BREAKPAD_CLIENT_H_