|  | // Copyright (c) 2014 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_BROWSER_WATCHER_WATCHER_METRICS_PROVIDER_WIN_H_ | 
|  | #define COMPONENTS_BROWSER_WATCHER_WATCHER_METRICS_PROVIDER_WIN_H_ | 
|  |  | 
|  | #include "base/callback.h" | 
|  | #include "base/files/file_path.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/memory/weak_ptr.h" | 
|  | #include "base/strings/string16.h" | 
|  | #include "base/task_runner.h" | 
|  | #include "base/threading/thread_checker.h" | 
|  | #include "components/metrics/metrics_provider.h" | 
|  |  | 
|  | namespace browser_watcher { | 
|  |  | 
|  | // Provides stability data captured by the Chrome Watcher, namely the browser | 
|  | // process exit codes. | 
|  | class WatcherMetricsProviderWin : public metrics::MetricsProvider { | 
|  | public: | 
|  | // A callback that provides product name, version number and channel name. | 
|  | using GetExecutableDetailsCallback = | 
|  | base::Callback<void(base::string16*, base::string16*, base::string16*)>; | 
|  |  | 
|  | static const char kBrowserExitCodeHistogramName[]; | 
|  |  | 
|  | // Initializes the reporter. |io_task_runner| is used for collecting | 
|  | // postmortem reports and clearing leftover data in registry if metrics | 
|  | // reporting is disabled. | 
|  | WatcherMetricsProviderWin(const base::string16& registry_path, | 
|  | const base::FilePath& user_data_dir, | 
|  | const base::FilePath& crash_dir, | 
|  | const GetExecutableDetailsCallback& exe_details_cb, | 
|  | base::TaskRunner* io_task_runner); | 
|  | ~WatcherMetricsProviderWin() override; | 
|  |  | 
|  | // metrics::MetricsProvider implementation. | 
|  | void OnRecordingEnabled() override; | 
|  | void OnRecordingDisabled() override; | 
|  | // Note: this function collects metrics, some of which are related to the | 
|  | // previous run's version and some to the current version. Doing the correct | 
|  | // attribution on upgrade is difficult, and currently ignored. Metrics | 
|  | // clearing is one mechanism to avoid misattribution, but is not used in this | 
|  | // case (ClearSavedStabilityMetrics is not overridden) as version | 
|  | // misattribution is preferred to data loss. Metrics will likely be attributed | 
|  | // to the previous run's version, unless no initial log is sent, in which case | 
|  | // they should be attributed to the current version (though they may actually | 
|  | // be attributed to still another following version). | 
|  | // TODO(manzagop): proper metric version attribution on upgrade. | 
|  | void ProvideStabilityMetrics( | 
|  | metrics::SystemProfileProto* system_profile_proto) override; | 
|  |  | 
|  | // Collects postmortem reports asynchronously and calls |done_callback| when | 
|  | // done. | 
|  | void CollectPostmortemReports(const base::Closure& done_callback); | 
|  |  | 
|  | private: | 
|  | // TODO(manzagop): avoid collecting reports for clean exits from the fast exit | 
|  | // path. | 
|  | void CollectPostmortemReportsOnBlockingPool(); | 
|  |  | 
|  | bool recording_enabled_; | 
|  | bool cleanup_scheduled_; | 
|  | const base::string16 registry_path_; | 
|  | const base::FilePath user_data_dir_; | 
|  | const base::FilePath crash_dir_; | 
|  | GetExecutableDetailsCallback exe_details_cb_; | 
|  | scoped_refptr<base::TaskRunner> io_task_runner_; | 
|  | base::WeakPtrFactory<WatcherMetricsProviderWin> weak_ptr_factory_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(WatcherMetricsProviderWin); | 
|  | }; | 
|  |  | 
|  | }  // namespace browser_watcher | 
|  |  | 
|  | #endif  // COMPONENTS_BROWSER_WATCHER_WATCHER_METRICS_PROVIDER_WIN_H_ |