// 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_PERFORMANCE_MANAGER_FRAME_NODE_SOURCE_H_
#define COMPONENTS_PERFORMANCE_MANAGER_FRAME_NODE_SOURCE_H_

#include "base/functional/callback.h"
#include "base/observer_list_types.h"
#include "content/public/browser/global_routing_id.h"

namespace performance_manager {

class FrameNodeImpl;

// Represents a source of existing frame nodes that lives on the main thread.
// In practice, this is used by the worker watchers as an abstraction over the
// PerformanceManagerTabHelper to make testing easier.
// TODO(pmonette): Get rid of this class now that a test implementation is no
// longer needed.
class FrameNodeSource {
 public:
  virtual ~FrameNodeSource() = default;

  using OnbeforeFrameNodeRemovedCallback =
      base::OnceCallback<void(FrameNodeImpl*)>;

  // Returns the frame node associated with |render_process_host_id|. Returns
  // null if no such node exists.
  virtual FrameNodeImpl* GetFrameNode(
      content::GlobalRenderFrameHostId render_process_host_id) = 0;

  // Subscribes to receive removal notification for a frame node.
  virtual void SubscribeToFrameNode(
      content::GlobalRenderFrameHostId render_process_host_id,
      OnbeforeFrameNodeRemovedCallback
          on_before_frame_node_removed_callback) = 0;

  // Unsubscribes to a frame node
  virtual void UnsubscribeFromFrameNode(
      content::GlobalRenderFrameHostId render_process_host_id) = 0;
};

}  // namespace performance_manager

#endif  // COMPONENTS_PERFORMANCE_MANAGER_FRAME_NODE_SOURCE_H_
