blob: 344e34232f3c58ca3cb7e6c63a1cd1c0cba9bff2 [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_GRAPH_GRAPH_IMPL_OPERATIONS_H_
#define COMPONENTS_PERFORMANCE_MANAGER_GRAPH_GRAPH_IMPL_OPERATIONS_H_
#include "base/containers/flat_set.h"
#include "base/functional/function_ref.h"
#include "base/memory/raw_ptr.h"
namespace performance_manager {
class FrameNodeImpl;
class PageNodeImpl;
class ProcessNodeImpl;
class WorkerNodeImpl;
// A collection of utilities for performing common queries and traversals on a
// graph.
struct GraphImplOperations {
using FrameNodeImplVisitor = base::FunctionRef<bool(FrameNodeImpl*)>;
using PageNodeImplVisitor = base::FunctionRef<bool(PageNodeImpl*)>;
using WorkerNodeImplVisitor = base::FunctionRef<bool(WorkerNodeImpl*)>;
// Returns the collection of page nodes that are associated with the given
// |process|. A page is associated with a process if the page's frame tree
// contains 1 or more frames hosted in the given |process|.
static base::flat_set<raw_ptr<PageNodeImpl, CtnExperimental>>
GetAssociatedPageNodes(const ProcessNodeImpl* process);
// Returns the collection of process nodes associated with the given |page|.
// A |process| is associated with a page if the page's frame tree contains 1
// or more frames hosted in that |process|.
static base::flat_set<raw_ptr<ProcessNodeImpl, CtnExperimental>>
GetAssociatedProcessNodes(const PageNodeImpl* page);
// Returns the collection of frame nodes associated with a page. This is
// returned in level order, with main frames first (level 0), main frame
// children next (level 1), all the way down to the deepest leaf frames.
static std::vector<FrameNodeImpl*> GetFrameNodes(const PageNodeImpl* page);
// Traverse the frame and its children in the given order, invoking the
// provided `visitor` for each frame node in the tree. If the visitor returns
// false then the iteration is halted. Returns true if all calls to the
// visitor returned true, false otherwise.
static bool VisitFrameAndChildrenPreOrder(
FrameNodeImpl* frame,
GraphImplOperations::FrameNodeImplVisitor visitor);
static bool VisitFrameAndChildrenPostOrder(
FrameNodeImpl* frame,
GraphImplOperations::FrameNodeImplVisitor visitor);
// Traverse the frame tree of a `page` in the given order, invoking the
// provided `visitor` for each frame node in the tree. If the visitor returns
// false then the iteration is halted. Returns true if all calls to the
// visitor returned true, false otherwise.
static bool VisitFrameTreePreOrder(const PageNodeImpl* page,
FrameNodeImplVisitor visitor);
static bool VisitFrameTreePostOrder(const PageNodeImpl* page,
FrameNodeImplVisitor visitor);
// Traverses the tree of embedded pages rooted at `page`, invoking `visitor`
// for each page node. Returns false if `visitor` returns false (stopping the
// traversal at that point); otherwise, returns `true`.
static bool VisitPageAndEmbedsPreOrder(PageNodeImpl* page,
PageNodeImplVisitor visitor);
// Returns true if the given |frame| is in the frame tree associated with the
// given |page|.
static bool HasFrame(const PageNodeImpl* page, FrameNodeImpl* frame);
// Recursively visits all frames and workers that are clients of the given
// `worker`. Each client will only be visited once. If the visitor returns
// false then the iteration is halted. Returns true if all calls to the
// visitor returned true, false otherwise.
static bool VisitAllWorkerClients(const WorkerNodeImpl* worker,
FrameNodeImplVisitor frame_visitor,
WorkerNodeImplVisitor worker_visitor);
};
} // namespace performance_manager
#endif // COMPONENTS_PERFORMANCE_MANAGER_GRAPH_GRAPH_IMPL_OPERATIONS_H_