blob: 6a4539d47c9680327e2e79f2865ec5925e7a99f5 [file]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_NETWORK_DEVTOOLS_DURABLE_MSG_COLLECTOR_MANAGER_H_
#define SERVICES_NETWORK_DEVTOOLS_DURABLE_MSG_COLLECTOR_MANAGER_H_
#include <memory>
#include <set>
#include "base/memory/memory_pressure_listener.h"
#include "base/time/time.h"
#include "base/trace_event/memory_dump_provider.h"
#include "services/network/devtools_durable_msg_collector.h"
#include "services/network/public/mojom/network_service.mojom.h"
namespace network {
// DevtoolsDurableMessageCollectorManager class is responsible for managing
// lifetime of self owned collector instances and associating each to
// different DevTools Profiles.
class COMPONENT_EXPORT(NETWORK_SERVICE) DevtoolsDurableMessageCollectorManager
: public base::trace_event::MemoryDumpProvider {
public:
// Allow certain friendship to call back on OnCollector* protected methods.
friend class DevtoolsDurableMessageCollector;
FRIEND_TEST_ALL_PREFIXES(DevtoolsDurableMessageCollectorManagerTest,
ReportAggregateMemoryUsage);
DevtoolsDurableMessageCollectorManager();
~DevtoolsDurableMessageCollectorManager() override;
// base::trace_event::MemoryDumpProvider implementation:
bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
base::trace_event::ProcessMemoryDump* pmd) override;
// Create a self-owned collector instance and bind it to the mojo pipe
// provided. The collector and all data associated with it will be destroyed
// on the mojo being tore down.
void AddCollector(
mojo::PendingReceiver<network::mojom::DurableMessageCollector> receiver);
// Enable or disable response body collection on the provided DevTools
// profile.
void EnableForProfile(const base::UnguessableToken& profile_id,
DevtoolsDurableMessageCollector& collector);
void DisableForProfile(const base::UnguessableToken& profile_id,
DevtoolsDurableMessageCollector& collector);
// Get a list of collectors enabled for the given DevTools profile.
std::vector<DevtoolsDurableMessageCollector*> GetCollectorsEnabledForProfile(
const base::UnguessableToken& profile_id);
std::vector<DevtoolsDurableMessageCollector*> GetCollectorsForTesting() {
return std::vector<DevtoolsDurableMessageCollector*>(collectors_.begin(),
collectors_.end());
}
size_t total_memory_usage_for_testing() const { return total_memory_usage_; }
// Returns true if the given size can be accommodated by the global limit.
bool CanAccommodate(size_t size) const;
private:
// Callback by collector instances to inform of creation/destruction.
void OnCollectorCreated(DevtoolsDurableMessageCollector* collector);
void OnCollectorDestroyed(DevtoolsDurableMessageCollector* collector);
void OnCollectorAddedBytes(size_t delta);
void OnCollectorRemovedBytes(size_t delta);
void OnCollectorAddedMessage(size_t count = 1);
void OnCollectorRemovedMessage(size_t count = 1);
// Keeps track of aggregate memory usage of all managed collectors, for
// reporting purposes.
size_t total_memory_usage_ = 0;
size_t total_message_count_ = 0;
// A set of collectors managed by this class.
std::set<raw_ptr<DevtoolsDurableMessageCollector>> collectors_;
// Keeps track of collectors being attached to a DevTools profile.
std::multimap<const base::UnguessableToken,
raw_ptr<DevtoolsDurableMessageCollector>>
profile_collectors_;
// Cached global limit buffer size.
const uint64_t max_global_buffer_size_;
base::WeakPtrFactory<DevtoolsDurableMessageCollectorManager> weak_factory_{
this};
};
} // namespace network
#endif // SERVICES_NETWORK_DEVTOOLS_DURABLE_MSG_COLLECTOR_MANAGER_H_