#ifndef CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_METRICS_H_
#define CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_METRICS_H_
#include <cstdint>
#include <string>
#include <variant>
#include "base/time/time.h"
#include "content/browser/preloading/prerender/prerender_final_status.h"
#include "content/browser/preloading/prerender/prerender_host.h"
#include "content/common/content_export.h"
#include "content/public/browser/preloading_trigger_type.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
namespace content {
struct CONTENT_EXPORT PrerenderMismatchedHeaders {
public:
PrerenderMismatchedHeaders(const std::string& header_name,
std::optional<std::string> initial_value,
std::optional<std::string> activation_value);
~PrerenderMismatchedHeaders();
PrerenderMismatchedHeaders(const PrerenderMismatchedHeaders& other);
PrerenderMismatchedHeaders(PrerenderMismatchedHeaders&& other);
PrerenderMismatchedHeaders& operator=(
const PrerenderMismatchedHeaders& other);
PrerenderMismatchedHeaders& operator=(PrerenderMismatchedHeaders&& other);
std::string header_name;
std::optional<std::string> initial_value;
std::optional<std::string> activation_value;
};
enum class PrerenderCancelledInterface {
kUnknown = 0,
kGamepadHapticsManager = 1,
kGamepadMonitor = 2,
kTrustedVaultEncryptionKeys = 4,
kMaxValue = kTrustedVaultEncryptionKeys
};
enum class PrerenderCrossOriginRedirectionMismatch {
kShouldNotBeReported = 0,
kPortMismatch = 1,
kHostMismatch = 2,
kHostPortMismatch = 3,
kSchemeMismatch = 4,
kSchemePortMismatch = 5,
kSchemeHostMismatch = 6,
kSchemeHostPortMismatch = 7,
kMaxValue = kSchemeHostPortMismatch
};
class CONTENT_EXPORT PrerenderCancellationReason {
public:
using DetailedReasonVariant =
std::variant<std::monostate,
int32_t,
uint64_t,
std::string,
std::vector<PrerenderMismatchedHeaders>>;
explicit PrerenderCancellationReason(PrerenderFinalStatus final_status);
~PrerenderCancellationReason();
static PrerenderCancellationReason BuildForDisallowActivationState(
uint64_t disallow_activation_reason);
static PrerenderCancellationReason BuildForMojoBinderPolicy(
const std::string& interface_name);
static PrerenderCancellationReason BuildForLoadingError(int32_t error_code);
static PrerenderCancellationReason
CreateCandidateReasonForActivationParameterMismatch();
PrerenderCancellationReason(PrerenderCancellationReason&& reason);
void ReportMetrics(const std::string& histogram_suffix) const;
PrerenderFinalStatus final_status() const { return final_status_; }
std::optional<std::string> DisallowedMojoInterface() const;
const std::vector<PrerenderMismatchedHeaders>* GetPrerenderMismatchedHeaders()
const;
void SetPrerenderMismatchedHeaders(
std::unique_ptr<std::vector<PrerenderMismatchedHeaders>>
mismatched_headers);
private:
PrerenderCancellationReason(PrerenderFinalStatus final_status,
DetailedReasonVariant explanation);
const PrerenderFinalStatus final_status_;
DetailedReasonVariant explanation_;
};
enum class PrerenderCrossOriginRedirectionProtocolChange {
kHttpProtocolUpgrade = 0,
kHttpProtocolDowngrade = 1,
kMaxValue = kHttpProtocolDowngrade
};
std::string GeneratePrerenderHistogramSuffix(
PreloadingTriggerType trigger_type,
const std::string& embedder_suffix);
void RecordPrerenderTriggered(ukm::SourceId ukm_id);
void RecordPrerenderActivationTime(
base::TimeDelta delta,
PreloadingTriggerType trigger_type,
const std::string& embedder_histogram_suffix);
void RecordFailedPrerenderFinalStatus(
const PrerenderCancellationReason& cancellation_reason,
const PrerenderAttributes& attributes);
void ReportSuccessActivation(const PrerenderAttributes& attributes,
ukm::SourceId prerendered_ukm_id);
void RecordPrerenderActivationNavigationParamsMatch(
PrerenderHost::ActivationNavigationParamsMatch result,
const std::string& histogram_suffix);
void RecordPrerenderRedirectionMismatchType(
PrerenderCrossOriginRedirectionMismatch case_type,
const std::string& histogram_suffix);
void RecordPrerenderRedirectionProtocolChange(
PrerenderCrossOriginRedirectionProtocolChange change_type,
const std::string& histogram_suffix);
void RecordPrerenderActivationTransition(
int32_t potential_activation_transition,
const std::string& histogram_suffix);
enum class PrerenderBackNavigationEligibility {
kEligible = 0,
kNoBackEntry = 1,
kTargetIsSameDocument = 2,
kMethodNotGet = 3,
kTargetIsFailedNavigation = 4,
kBfcacheEntryExists = 5,
kTargetIsSameSite = 6,
kNoHttpCacheEntry = 7,
kTargetingOtherWindow = 8,
kTargetIsNonHttp = 9,
kRelatedActiveContents = 10,
kMaxValue = kRelatedActiveContents,
};
CONTENT_EXPORT PreloadingEligibility
ToPreloadingEligibility(PrerenderBackNavigationEligibility eligibility);
void RecordPrerenderBackNavigationEligibility(
PreloadingPredictor predictor,
PrerenderBackNavigationEligibility eligibility,
PreloadingAttempt* preloading_attempt);
void RecordPrerenderActivationCommitDeferTime(
base::TimeDelta time_delta,
PreloadingTriggerType trigger_type,
const std::string& embedder_histogram_suffix);
void RecordReceivedPrerendersPerPrimaryPageChangedCount(
int number,
PreloadingTriggerType trigger_type,
const std::string& eagerness_category);
}
#endif