// Copyright 2018 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_CRASH_CONTENT_BROWSER_CRASH_METRICS_REPORTER_ANDROID_H_
#define COMPONENTS_CRASH_CONTENT_BROWSER_CRASH_METRICS_REPORTER_ANDROID_H_

#include "base/containers/flat_set.h"
#include "base/observer_list_threadsafe.h"
#include "components/crash/content/browser/child_exit_observer_android.h"
#include "components/crash/content/browser/crash_dump_manager_android.h"

namespace crash_reporter {

// Reports crash metrics about child processes to UMA, which is used as ground
// truth for child process stability. This class should be used by any code that
// wants to observe reason for the death of a child process.
class CrashMetricsReporter {
 public:
  // This enum is used to back a UMA histogram, and must be treated as
  // append-only.
  enum ExitStatus {
    EMPTY_MINIDUMP_WHILE_RUNNING,
    EMPTY_MINIDUMP_WHILE_PAUSED,
    EMPTY_MINIDUMP_WHILE_BACKGROUND,
    VALID_MINIDUMP_WHILE_RUNNING,
    VALID_MINIDUMP_WHILE_PAUSED,
    VALID_MINIDUMP_WHILE_BACKGROUND,
    MINIDUMP_STATUS_COUNT
  };

  // These values are persisted to logs. Entries should not be renumbered and
  // numeric values should never be reused.
  enum class ProcessedCrashCounts {
    kGpuForegroundOom = 0,
    kRendererForegroundVisibleOom = 1,
    kRendererForegroundIntentionalKill = 2,
    kRendererForegroundVisibleSubframeOom = 3,
    kRendererForegroundVisibleSubframeIntentionalKill = 4,
    kRendererForegroundVisibleCrash = 5,
    kRendererForegroundVisibleSubframeCrash = 6,
    kGpuCrashAll = 7,
    kRendererCrashAll = 8,
    kRendererForegroundVisibleMainFrameIntentionalKill = 9,
    kRendererForegroundVisibleNormalTermNoMinidump = 10,
    kRendererForegroundInvisibleWithStrongBindingKilled = 11,
    kRendererForegroundInvisibleWithStrongBindingOom = 12,
    kRendererForegroundInvisibleWithModerateBindingKilled = 13,
    kRendererForegroundInvisibleWithModerateBindingOom = 14,
    kRendererForegroundVisibleAllocationFailure = 15,
    kRendererAllocationFailureAll = 16,
    kUtilityForegroundOom = 17,
    kUtilityCrashAll = 18,
    kMaxValue = kUtilityCrashAll
  };
  using ReportedCrashTypeSet = base::flat_set<ProcessedCrashCounts>;

  // Careful note: the CrashMetricsReporter observers are asynchronous, and are
  // notified via PostTask. This could be problematic with a large number of
  // observers. Consider using a middle-layer observer to fan out synchronously
  // to leaf observers if you need many objects listening to these messages.
  class Observer {
   public:
    // Called when child process is dead and minidump was processed.
    // |reported_counts| is a set of recorded metrics about child process
    // crashes. It could be empty if no metrics were recorded.
    virtual void OnCrashDumpProcessed(
        int rph_id,
        const ReportedCrashTypeSet& reported_counts) = 0;
  };

  static CrashMetricsReporter* GetInstance();

  // Can be called on any thread.
  void AddObserver(Observer* observer);
  void RemoveObserver(Observer* observer);

  void CrashDumpProcessed(const ChildExitObserver::TerminationInfo& info,
                          breakpad::CrashDumpManager::CrashDumpStatus status);

 private:
  CrashMetricsReporter();
  ~CrashMetricsReporter();

  void NotifyObservers(int rph_id, const ReportedCrashTypeSet& reported_counts);

  scoped_refptr<base::ObserverListThreadSafe<CrashMetricsReporter::Observer>>
      async_observers_;

  DISALLOW_COPY_AND_ASSIGN(CrashMetricsReporter);
};

}  // namespace crash_reporter

#endif  // COMPONENTS_CRASH_CONTENT_BROWSER_CRASH_METRICS_REPORTER_ANDROID_H_
