PM: Start moving performance manager to components/.
This moves the performance manager and the graph implementation
as well as the public API to a new component.
Bug: 953031
Change-Id: Ie96011bbe615e31f183da8aae24a20b6e9c79228
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1829911
Commit-Queue: Sébastien Marchand <[email protected]>
Reviewed-by: Robert Kaplow <[email protected]>
Reviewed-by: Scott Violet <[email protected]>
Reviewed-by: Chris Hamilton <[email protected]>
Reviewed-by: Avi Drissman <[email protected]>
Reviewed-by: Cait Phillips <[email protected]>
Cr-Commit-Position: refs/heads/master@{#703442}
diff --git a/components/performance_manager/public/graph/graph.h b/components/performance_manager/public/graph/graph.h
new file mode 100644
index 0000000..37cd408
--- /dev/null
+++ b/components/performance_manager/public/graph/graph.h
@@ -0,0 +1,147 @@
+// Copyright 2019 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_PERFORMANCE_MANAGER_PUBLIC_GRAPH_GRAPH_H_
+#define COMPONENTS_PERFORMANCE_MANAGER_PUBLIC_GRAPH_GRAPH_H_
+
+#include <cstdint>
+#include <memory>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+
+namespace ukm {
+class UkmRecorder;
+} // namespace ukm
+
+namespace performance_manager {
+
+class GraphObserver;
+class GraphOwned;
+class FrameNode;
+class FrameNodeObserver;
+class PageNode;
+class PageNodeObserver;
+class ProcessNode;
+class ProcessNodeObserver;
+class SystemNode;
+class SystemNodeObserver;
+class WorkerNode;
+class WorkerNodeObserver;
+
+// Represents a graph of the nodes representing a single browser. Maintains a
+// set of nodes that can be retrieved in different ways, some indexed. Keeps
+// a list of observers that are notified of node addition and removal.
+class Graph {
+ public:
+ using Observer = GraphObserver;
+
+ Graph();
+ virtual ~Graph();
+
+ // Adds an |observer| on the graph. It is safe for observers to stay
+ // registered on the graph at the time of its death.
+ virtual void AddGraphObserver(GraphObserver* observer) = 0;
+ virtual void AddFrameNodeObserver(FrameNodeObserver* observer) = 0;
+ virtual void AddPageNodeObserver(PageNodeObserver* observer) = 0;
+ virtual void AddProcessNodeObserver(ProcessNodeObserver* observer) = 0;
+ virtual void AddSystemNodeObserver(SystemNodeObserver* observer) = 0;
+ virtual void AddWorkerNodeObserver(WorkerNodeObserver* observer) = 0;
+
+ // Removes an |observer| from the graph.
+ virtual void RemoveGraphObserver(GraphObserver* observer) = 0;
+ virtual void RemoveFrameNodeObserver(FrameNodeObserver* observer) = 0;
+ virtual void RemovePageNodeObserver(PageNodeObserver* observer) = 0;
+ virtual void RemoveProcessNodeObserver(ProcessNodeObserver* observer) = 0;
+ virtual void RemoveSystemNodeObserver(SystemNodeObserver* observer) = 0;
+ virtual void RemoveWorkerNodeObserver(WorkerNodeObserver* observer) = 0;
+
+ // For convenience, allows you to pass ownership of an object to the graph.
+ // Useful for attaching observers that will live with the graph until it dies.
+ // If you can name the object you can also take it back via "TakeFromGraph".
+ virtual void PassToGraph(std::unique_ptr<GraphOwned> graph_owned) = 0;
+ virtual std::unique_ptr<GraphOwned> TakeFromGraph(
+ GraphOwned* graph_owned) = 0;
+
+ // A TakeFromGraph helper for taking back the ownership of a GraphOwned
+ // subclass.
+ template <typename DerivedType>
+ std::unique_ptr<DerivedType> TakeFromGraphAs(DerivedType* graph_owned) {
+ return base::WrapUnique(
+ static_cast<DerivedType*>(TakeFromGraph(graph_owned).release()));
+ }
+
+ // Returns a collection of all known nodes of the given type.
+ virtual const SystemNode* FindOrCreateSystemNode() = 0;
+ virtual std::vector<const ProcessNode*> GetAllProcessNodes() const = 0;
+ virtual std::vector<const FrameNode*> GetAllFrameNodes() const = 0;
+ virtual std::vector<const PageNode*> GetAllPageNodes() const = 0;
+ virtual std::vector<const WorkerNode*> GetAllWorkerNodes() const = 0;
+
+ // Returns the associated UKM recorder if it is defined.
+ virtual ukm::UkmRecorder* GetUkmRecorder() const = 0;
+
+ // The following functions are implementation detail and should not need to be
+ // used by external clients. They provide the ability to safely downcast to
+ // the underlying implementation.
+ virtual uintptr_t GetImplType() const = 0;
+ virtual const void* GetImpl() const = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Graph);
+};
+
+// Observer interface for the graph.
+class GraphObserver {
+ public:
+ GraphObserver();
+ virtual ~GraphObserver();
+
+ // Called before the |graph| associated with this observer disappears. This
+ // allows the observer to do any necessary cleanup work. Note that the
+ // observer should remove itself from observing the graph using this
+ // callback.
+ // TODO(chrisha): Make this run before the destructor!
+ // crbug.com/966840
+ virtual void OnBeforeGraphDestroyed(Graph* graph) = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(GraphObserver);
+};
+
+// Helper class for passing ownership of objects to a graph.
+class GraphOwned {
+ public:
+ GraphOwned();
+ virtual ~GraphOwned();
+
+ // Called when the object is passed into the graph.
+ virtual void OnPassedToGraph(Graph* graph) = 0;
+
+ // Called when the object is removed from the graph, either via an explicit
+ // call to Graph::TakeFromGraph, or prior to the Graph being destroyed.
+ virtual void OnTakenFromGraph(Graph* graph) = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(GraphOwned);
+};
+
+// A default implementation of GraphOwned.
+class GraphOwnedDefaultImpl : public GraphOwned {
+ public:
+ GraphOwnedDefaultImpl();
+ ~GraphOwnedDefaultImpl() override;
+
+ // GraphOwned implementation:
+ void OnPassedToGraph(Graph* graph) override {}
+ void OnTakenFromGraph(Graph* graph) override {}
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(GraphOwnedDefaultImpl);
+};
+
+} // namespace performance_manager
+
+#endif // COMPONENTS_PERFORMANCE_MANAGER_PUBLIC_GRAPH_GRAPH_H_