blob: 5864c0def43f939393764ebc5cfb345a09e44205 [file] [log] [blame]
// Copyright 2017 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_WORKER_NODE_IMPL_H_
#define COMPONENTS_PERFORMANCE_MANAGER_GRAPH_WORKER_NODE_IMPL_H_
#include <memory>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/types/pass_key.h"
#include "components/performance_manager/execution_context/execution_context_impl.h"
#include "components/performance_manager/graph/node_attached_data_storage.h"
#include "components/performance_manager/graph/node_base.h"
#include "components/performance_manager/graph/node_inline_data.h"
#include "components/performance_manager/public/graph/worker_node.h"
#include "components/performance_manager/resource_attribution/cpu_measurement_data.h"
#include "third_party/blink/public/common/tokens/tokens.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace performance_manager {
class FrameNodeImpl;
class ProcessNodeImpl;
class WorkerNodeImpl
: public PublicNodeImpl<WorkerNodeImpl, WorkerNode>,
public TypedNodeBase<WorkerNodeImpl, WorkerNode, WorkerNodeObserver>,
public SupportsNodeInlineData<
execution_context::WorkerExecutionContext,
resource_attribution::SharedCPUTimeResultData,
// Keep this last to avoid merge conflicts.
NodeAttachedDataStorage> {
public:
static const char kDefaultPriorityReason[];
using TypedNodeBase<WorkerNodeImpl, WorkerNode, WorkerNodeObserver>::FromNode;
WorkerNodeImpl(const std::string& browser_context_id,
WorkerType worker_type,
ProcessNodeImpl* process_node,
const blink::WorkerToken& worker_token,
const url::Origin& origin);
WorkerNodeImpl(const WorkerNodeImpl&) = delete;
WorkerNodeImpl& operator=(const WorkerNodeImpl&) = delete;
~WorkerNodeImpl() override;
// Partial WorkerNode implementation:
WorkerType GetWorkerType() const override;
const std::string& GetBrowserContextID() const override;
const blink::WorkerToken& GetWorkerToken() const override;
resource_attribution::WorkerContext GetResourceContext() const override;
const GURL& GetURL() const override;
const url::Origin& GetOrigin() const override;
const PriorityAndReason& GetPriorityAndReason() const override;
uint64_t GetResidentSetKbEstimate() const override;
uint64_t GetPrivateFootprintKbEstimate() const override;
// Invoked when a frame starts/stops being a client of this worker.
void AddClientFrame(FrameNodeImpl* frame_node);
void RemoveClientFrame(FrameNodeImpl* frame_node);
// Invoked when a worker starts/stops being a client of this worker.
void AddClientWorker(WorkerNodeImpl* worker_node);
void RemoveClientWorker(WorkerNodeImpl* worker_node);
// Setters are not thread safe.
void SetPriorityAndReason(const PriorityAndReason& priority_and_reason);
void SetResidentSetKbEstimate(uint64_t rss_estimate);
void SetPrivateFootprintKbEstimate(uint64_t pmf_estimate);
// Invoked when the worker script was fetched and the final response URL is
// available.
void OnFinalResponseURLDetermined(const GURL& url);
// Getters for const properties.
ProcessNodeImpl* process_node() const;
// Getters for non-const properties. These are not thread safe.
NodeSetView<FrameNodeImpl*> client_frames() const;
NodeSetView<WorkerNodeImpl*> client_workers() const;
NodeSetView<WorkerNodeImpl*> child_workers() const;
base::WeakPtr<WorkerNodeImpl> GetWeakPtr();
private:
friend class WorkerNodeImplDescriber;
// NodeBase:
void OnInitializingProperties() override;
void OnInitializingEdges() override;
void OnUninitializingEdges() override;
void CleanUpNodeState() override;
// Rest of WorkerNode implementation. These are private so that users of the
// impl use the private getters rather than the public interface.
const ProcessNode* GetProcessNode() const override;
NodeSetView<const FrameNode*> GetClientFrames() const override;
NodeSetView<const WorkerNode*> GetClientWorkers() const override;
NodeSetView<const WorkerNode*> GetChildWorkers() const override;
// Invoked when |worker_node| becomes a child of this worker.
void AddChildWorker(WorkerNodeImpl* worker_node);
void RemoveChildWorker(WorkerNodeImpl* worker_node);
// The unique ID of the browser context that this worker belongs to.
const std::string browser_context_id_;
// The type of this worker.
const WorkerType worker_type_;
// The process in which this worker lives.
const raw_ptr<ProcessNodeImpl> process_node_;
// A unique identifier shared with all representations of this worker across
// content and blink. This token should only ever be sent between the browser
// and the renderer hosting the worker. It should not be used to identify a
// worker in browser-to-renderer control messages, but may be used to identify
// a worker in informational messages going in either direction.
const blink::WorkerToken worker_token_;
// The URL of the worker script. This is the final response URL which takes
// into account redirections. This is initially empty and it is set when
// OnFinalResponseURLDetermined() is invoked.
GURL url_ GUARDED_BY_CONTEXT(sequence_checker_);
// The worker's security origin. Set at creation and never varies.
const url::Origin origin_ GUARDED_BY_CONTEXT(sequence_checker_);
// Frames that are clients of this worker.
NodeSet client_frames_ GUARDED_BY_CONTEXT(sequence_checker_);
// Other workers that are clients of this worker. See the declaration of
// WorkerNode for a distinction between client workers and child workers.
NodeSet client_workers_ GUARDED_BY_CONTEXT(sequence_checker_);
// The child workers of this worker. See the declaration of WorkerNode for a
// distinction between client workers and child workers.
NodeSet child_workers_ GUARDED_BY_CONTEXT(sequence_checker_);
uint64_t resident_set_kb_estimate_ = 0;
uint64_t private_footprint_kb_estimate_ = 0;
// Worker priority information. Set via ExecutionContextPriorityDecorator.
ObservedProperty::NotifiesOnlyOnChangesWithPreviousValue<
PriorityAndReason,
const PriorityAndReason&,
&WorkerNodeObserver::OnPriorityAndReasonChanged>
priority_and_reason_ GUARDED_BY_CONTEXT(sequence_checker_){
PriorityAndReason(base::TaskPriority::LOWEST,
kDefaultPriorityReason)};
base::WeakPtrFactory<WorkerNodeImpl> weak_factory_
GUARDED_BY_CONTEXT(sequence_checker_){this};
};
} // namespace performance_manager
#endif // COMPONENTS_PERFORMANCE_MANAGER_GRAPH_WORKER_NODE_IMPL_H_