| // Copyright 2016 The Chromium Embedded Framework Authors. Portions copyright |
| // 2016 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 CEF_LIBCEF_COMMON_CRASH_REPORTER_CLIENT_H_ |
| #define CEF_LIBCEF_COMMON_CRASH_REPORTER_CLIENT_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| // Include this first to avoid compiler errors. |
| #include "base/compiler_specific.h" |
| |
| #include "include/cef_version.h" |
| |
| #include "base/macros.h" |
| #include "base/synchronization/lock.h" |
| #include "build/build_config.h" |
| #include "components/crash/core/app/crash_reporter_client.h" |
| |
| // Global object that is instantiated in each process and configures crash |
| // reporting. On Windows this is created by the |
| // InitializeCrashReportingForProcess() method called from chrome_elf. On |
| // Linux and macOS this is created by crash_reporting::BasicStartupComplete(). |
| class CefCrashReporterClient : public crash_reporter::CrashReporterClient { |
| public: |
| CefCrashReporterClient(); |
| ~CefCrashReporterClient() override; |
| |
| // Reads the crash config file and returns true on success. Failure to read |
| // the crash config file will disable crash reporting. This method should be |
| // called immediately after the CefCrashReporterClient instance is created. |
| bool ReadCrashConfigFile(); |
| bool HasCrashConfigFile() const; |
| |
| #if defined(OS_WIN) |
| // Called from chrome_elf (chrome_elf/crash/crash_helper.cc) to instantiate |
| // a process wide instance of CefCrashReporterClient and initialize crash |
| // reporting for the process. The instance is leaked. |
| // crash_reporting_win::InitializeCrashReportingForModule() will be called |
| // later from crash_reporting::PreSandboxStartup() to read global state into |
| // the module address space. |
| static void InitializeCrashReportingForProcess(); |
| |
| bool GetAlternativeCrashDumpLocation(base::string16* crash_dir) override; |
| void GetProductNameAndVersion(const base::string16& exe_path, |
| base::string16* product_name, |
| base::string16* version, |
| base::string16* special_build, |
| base::string16* channel_name) override; |
| bool GetCrashDumpLocation(base::string16* crash_dir) override; |
| bool GetCrashMetricsLocation(base::string16* metrics_dir) override; |
| #elif defined(OS_POSIX) |
| void GetProductNameAndVersion(const char** product_name, |
| const char** version) override; |
| void GetProductNameAndVersion(std::string* product_name, |
| std::string* version, |
| std::string* channel) override; |
| #if !defined(OS_MACOSX) |
| base::FilePath GetReporterLogFilename() override; |
| bool EnableBreakpadForProcess(const std::string& process_type) override; |
| #endif |
| bool GetCrashDumpLocation(base::FilePath* crash_dir) override; |
| #endif // defined(OS_POSIX) |
| |
| // All of these methods must return true to enable crash report upload. |
| bool GetCollectStatsConsent() override; |
| bool GetCollectStatsInSample() override; |
| #if defined(OS_WIN) || defined(OS_MACOSX) |
| bool ReportingIsEnforcedByPolicy(bool* crashpad_enabled) override; |
| #endif |
| |
| #if defined(OS_POSIX) && !defined(OS_MACOSX) |
| bool IsRunningUnattended() override; |
| #endif |
| |
| std::string GetCrashServerURL() override; |
| void GetCrashOptionalArguments(std::vector<std::string>* arguments) override; |
| |
| #if defined(OS_WIN) |
| base::string16 GetCrashExternalHandler( |
| const base::string16& exe_dir) override; |
| bool HasCrashExternalHandler() const; |
| #endif |
| |
| #if defined(OS_MACOSX) |
| bool EnableBrowserCrashForwarding() override; |
| #endif |
| |
| #if defined(OS_POSIX) && !defined(OS_MACOSX) |
| ParameterMap FilterParameters(const ParameterMap& parameters) override; |
| #endif |
| |
| // Set or clear a crash key value. |
| bool SetCrashKeyValue(const base::StringPiece& key, |
| const base::StringPiece& value); |
| |
| private: |
| bool has_crash_config_file_ = false; |
| |
| enum KeySize { SMALL_SIZE, MEDIUM_SIZE, LARGE_SIZE }; |
| |
| // Map of crash key name to (KeySize, index). |
| // Const access to |crash_keys_| is thread-safe after initialization. |
| using KeyMap = std::map<std::string, std::pair<KeySize, size_t>>; |
| KeyMap crash_keys_; |
| |
| // Modification of CrashKeyString values must be synchronized. |
| base::Lock crash_key_lock_; |
| |
| std::string server_url_; |
| bool rate_limit_ = true; |
| int max_uploads_ = 5; |
| int max_db_size_ = 20; |
| int max_db_age_ = 5; |
| |
| std::string product_name_ = "cef"; |
| std::string product_version_ = CEF_VERSION; |
| |
| #if defined(OS_WIN) |
| std::string app_name_ = "CEF"; |
| std::string external_handler_; |
| #endif |
| |
| #if defined(OS_MACOSX) |
| bool enable_browser_crash_forwarding_ = false; |
| #endif |
| |
| DISALLOW_COPY_AND_ASSIGN(CefCrashReporterClient); |
| }; |
| |
| #endif // CEF_LIBCEF_COMMON_CRASH_REPORTER_CLIENT_H_ |