// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_UI_DEVTOOLS_DEVTOOLS_PROCESS_OBSERVER_H_
#define COMPONENTS_UI_DEVTOOLS_DEVTOOLS_PROCESS_OBSERVER_H_

#include "base/memory/raw_ptr.h"
#include "base/process/process.h"
#include "components/ui_devtools/devtools_export.h"
#include "content/public/browser/browser_child_process_observer.h"

namespace ui_devtools {
class TracingAgent;
}

// Observer that is notified of browser and gpu processes when they are launched
// and destroyed. This is used to update the process id for event tracing.
class UI_DEVTOOLS_EXPORT DevtoolsProcessObserver
    : public content::BrowserChildProcessObserver {
 public:
  explicit DevtoolsProcessObserver(ui_devtools::TracingAgent* agent);

  DevtoolsProcessObserver(const DevtoolsProcessObserver&) = delete;
  DevtoolsProcessObserver& operator=(const DevtoolsProcessObserver&) = delete;

  ~DevtoolsProcessObserver() override;

 private:
  // content::BrowserChildProcessObserver:
  void BrowserChildProcessLaunchedAndConnected(
      const content::ChildProcessData& data) override;
  void BrowserChildProcessHostDisconnected(
      const content::ChildProcessData& data) override;
  void BrowserChildProcessCrashed(
      const content::ChildProcessData& data,
      const content::ChildProcessTerminationInfo& info) override;
  void BrowserChildProcessKilled(
      const content::ChildProcessData& data,
      const content::ChildProcessTerminationInfo& info) override;

  raw_ptr<ui_devtools::TracingAgent> tracing_agent_;
};

#endif  // COMPONENTS_UI_DEVTOOLS_DEVTOOLS_PROCESS_OBSERVER_H_
