blob: 438e4bd99f2499d968b8d59358567fa354f0ee45 [file] [log] [blame]
// 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.
#include "content/browser/preloading/preload_serving_metrics_holder.h"
#include "base/debug/crash_logging.h"
#include "base/debug/dump_without_crashing.h"
namespace content {
base::RepeatingCallback<void(std::unique_ptr<PreloadServingMetrics>)>&
GetDestructorCallbackForTesting() {
static base::NoDestructor<
base::RepeatingCallback<void(std::unique_ptr<PreloadServingMetrics>)>>
dtor_callback_for_testing;
return *dtor_callback_for_testing;
}
NAVIGATION_HANDLE_USER_DATA_KEY_IMPL(PreloadServingMetricsHolder);
// static
void PreloadServingMetricsHolder::SetDestructorCallbackForTesting(
base::RepeatingCallback<void(std::unique_ptr<PreloadServingMetrics>)>
callback) {
GetDestructorCallbackForTesting() = std::move(callback); // IN-TEST
}
PreloadServingMetricsHolder::PreloadServingMetricsHolder(
NavigationHandle& handle)
: preload_serving_metrics_(std::make_unique<PreloadServingMetrics>()) {
CHECK(PreloadServingMetricsCapsule::IsFeatureEnabled());
}
PreloadServingMetricsHolder::~PreloadServingMetricsHolder() {
if (GetDestructorCallbackForTesting()) {
GetDestructorCallbackForTesting().Run( // IN-TEST
std::move(preload_serving_metrics_));
}
}
void PreloadServingMetricsHolder::AddPrefetchMatchMetrics(
std::unique_ptr<PrefetchMatchMetrics> prefetch_match_metrics) {
CHECK(prefetch_match_metrics);
// Do nothing if `PreloadServingMetrics` is already taken.
//
// This happens if a prerender that is potentially matching to a prefetch
// while the prefetch is blocking the prerender.
// `PrerenderHost::OnWillBeCancelled()` took the `PreloadServingMetrics`, and
// this path is reached when something of the prefetch is updated and unblocks
// the prerender.
//
// For more details, see
// https://docs.google.com/document/d/1ITMr_qyysUPIMZpLkmpQABwtVseMBduRqxHGZxIJ1R0/edit?resourcekey=0-ccZ-G6JV4WO-1bP4TiNvjQ&tab=t.x99jls7s2xug
if (!preload_serving_metrics_) {
return;
}
preload_serving_metrics_->prefetch_match_metrics_list.push_back(
std::move(prefetch_match_metrics));
}
void PreloadServingMetricsHolder::SetPrerenderInitialPreloadServingMetrics(
std::unique_ptr<PreloadServingMetrics>
prerender_initial_preload_serving_metrics) {
CHECK(prerender_initial_preload_serving_metrics);
CHECK(!preload_serving_metrics_->prerender_initial_preload_serving_metrics);
preload_serving_metrics_->prerender_initial_preload_serving_metrics =
std::move(prerender_initial_preload_serving_metrics);
}
std::unique_ptr<PreloadServingMetrics> PreloadServingMetricsHolder::Take() {
// Ensures not to take it twice.
CHECK(preload_serving_metrics_);
return std::move(preload_serving_metrics_);
}
} // namespace content