blob: 3e3b3463d595f859c5eca683e57d18a0fff4ccd3 [file] [log] [blame]
// 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_TAB_HELPER_FRAME_NODE_SOURCE_H_
#define COMPONENTS_PERFORMANCE_MANAGER_TAB_HELPER_FRAME_NODE_SOURCE_H_
#include "base/memory/raw_ptr.h"
#include "components/performance_manager/frame_node_source.h"
#include "base/observer_list_types.h"
#include "base/scoped_multi_source_observation.h"
#include "components/performance_manager/performance_manager_tab_helper.h"
namespace performance_manager {
// An implementation of FrameNodeSource that uses PerformanceManagerTabHelper to
// get frame node information.
class TabHelperFrameNodeSource : public FrameNodeSource,
public PerformanceManagerTabHelper::Observer {
public:
TabHelperFrameNodeSource();
TabHelperFrameNodeSource(const TabHelperFrameNodeSource&) = delete;
TabHelperFrameNodeSource& operator=(const TabHelperFrameNodeSource&) = delete;
~TabHelperFrameNodeSource() override;
// FrameNodeSource:
FrameNodeImpl* GetFrameNode(
content::GlobalRenderFrameHostId render_process_host_id) override;
void SubscribeToFrameNode(
content::GlobalRenderFrameHostId render_process_host_id,
OnbeforeFrameNodeRemovedCallback on_before_frame_node_removed_callback)
override;
void UnsubscribeFromFrameNode(
content::GlobalRenderFrameHostId render_process_host_id) override;
// PerformanceManagerTabHelper::Observer:
void OnBeforeFrameNodeRemoved(
PerformanceManagerTabHelper* performance_manager_tab_helper,
FrameNodeImpl* frame_node) override;
private:
// Adds |frame_node| to the set of observed frame nodes associated with
// |performance_manager_tab_helper|. Returns true if |frame_node| was the
// first frame added to that set.
bool AddObservedFrameNode(
PerformanceManagerTabHelper* performance_manager_tab_helper,
FrameNodeImpl* frame_node);
// Removes |frame_node| to the set of observed frame nodes associated with
// |performance_manager_tab_helper|. Returns true if |frame_node| was the
// last frame removed from that set.
bool RemoveObservedFrameNode(
PerformanceManagerTabHelper* performance_manager_tab_helper,
FrameNodeImpl* frame_node);
// Maps each observed frame node to their callback.
base::flat_map<FrameNodeImpl*, OnbeforeFrameNodeRemovedCallback>
frame_node_callbacks_;
// Maps each tab helper to the set of observed frame nodes that belongs to
// that tab helper.
base::flat_map<PerformanceManagerTabHelper*,
base::flat_set<raw_ptr<FrameNodeImpl, CtnExperimental>>>
observed_frame_nodes_;
// Observes frame node deletions.
base::ScopedMultiSourceObservation<PerformanceManagerTabHelper,
PerformanceManagerTabHelper::Observer>
performance_manager_tab_helper_observations_;
};
} // namespace performance_manager
#endif // COMPONENTS_PERFORMANCE_MANAGER_TAB_HELPER_FRAME_NODE_SOURCE_H_