blob: 8463f2aecb5b59964a217617d5f463e9894dd0f0 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2021 The Chromium Authors
Lingqi Chifc4b7d9c2021-04-08 01:41:222// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Sreeja Kamishettyc227f7a2022-07-08 22:33:155#ifndef CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_METRICS_H_
6#define CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_METRICS_H_
Lingqi Chifc4b7d9c2021-04-08 01:41:227
Lingqi Chidb949732022-11-08 05:55:218#include <cstdint>
Lingqi Chifc4b7d9c2021-04-08 01:41:229#include <string>
Victor Hugo Vianna Silva00692722025-03-18 19:51:4810#include <variant>
Lingqi Chifc4b7d9c2021-04-08 01:41:2211
Asami Doi02406272021-11-12 05:01:4412#include "base/time/time.h"
Yoshiki Tanioka49b4cfb2022-10-20 09:25:3113#include "content/browser/preloading/prerender/prerender_final_status.h"
Sreeja Kamishettyc227f7a2022-07-08 22:33:1514#include "content/browser/preloading/prerender/prerender_host.h"
Miina Koyamad0e41f32023-11-13 06:50:0915#include "content/common/content_export.h"
Kouhei Ueno3f37992b2023-11-09 23:29:0216#include "content/public/browser/preloading_trigger_type.h"
Robert Lind75062bf2021-10-28 12:50:5517#include "services/metrics/public/cpp/ukm_source_id.h"
Lingqi Chifc4b7d9c2021-04-08 01:41:2218
Robert Lind75062bf2021-10-28 12:50:5519namespace content {
Kunihiko Sakamoto73d0a902021-07-15 00:22:3220
Miina Koyamad0e41f32023-11-13 06:50:0921struct CONTENT_EXPORT PrerenderMismatchedHeaders {
Miina Koyama89b815042023-10-31 08:20:1222 public:
23 PrerenderMismatchedHeaders(const std::string& header_name,
Arthur Sonzognic686e8f2024-01-11 08:36:3724 std::optional<std::string> initial_value,
25 std::optional<std::string> activation_value);
Miina Koyama89b815042023-10-31 08:20:1226
27 ~PrerenderMismatchedHeaders();
28
Adithya Srinivasan6bd22472024-08-21 17:13:1729 PrerenderMismatchedHeaders(const PrerenderMismatchedHeaders& other);
Miina Koyama89b815042023-10-31 08:20:1230 PrerenderMismatchedHeaders(PrerenderMismatchedHeaders&& other);
31
Adithya Srinivasan6bd22472024-08-21 17:13:1732 PrerenderMismatchedHeaders& operator=(
33 const PrerenderMismatchedHeaders& other);
Miina Koyama89b815042023-10-31 08:20:1234 PrerenderMismatchedHeaders& operator=(PrerenderMismatchedHeaders&& other);
35
36 std::string header_name;
Arthur Sonzognic686e8f2024-01-11 08:36:3737 std::optional<std::string> initial_value;
38 std::optional<std::string> activation_value;
Miina Koyama89b815042023-10-31 08:20:1239};
40
Lingqi Chifc4b7d9c2021-04-08 01:41:2241// These values are persisted to logs. Entries should not be renumbered and
42// numeric values should never be reused.
43// Note: Please update GetCancelledInterfaceType() in the corresponding .cc file
Julie Jeongeun Kim7a9439c2022-01-26 13:17:4544// and the enum of PrerenderCancelledUnknownInterface in
45// tools/metrics/histograms/enums.xml if you add a new item.
Lingqi Chifc4b7d9c2021-04-08 01:41:2246enum class PrerenderCancelledInterface {
47 kUnknown = 0, // For kCancel interfaces added by embedders or tests.
48 kGamepadHapticsManager = 1,
49 kGamepadMonitor = 2,
Lingqi Chid9aedcb2022-06-07 08:06:5550 // kNotificationService = 3, Deprecated.
Martin Kreichgauer8f2098982023-06-12 22:13:4751 kTrustedVaultEncryptionKeys = 4,
52 kMaxValue = kTrustedVaultEncryptionKeys
Lingqi Chifc4b7d9c2021-04-08 01:41:2253};
54
Lingqi Chic7fe2242022-08-26 10:35:3655// Used by PrerenderNavigationThrottle, to track the cross-origin cancellation
56// reason, and break it down into more cases.
57// These values are persisted to logs. Entries should not be renumbered and
58// numeric values should never be reused.
59enum class PrerenderCrossOriginRedirectionMismatch {
60 kShouldNotBeReported = 0,
61 kPortMismatch = 1,
62 kHostMismatch = 2,
63 kHostPortMismatch = 3,
64 kSchemeMismatch = 4,
65 kSchemePortMismatch = 5,
66 kSchemeHostMismatch = 6,
67 kSchemeHostPortMismatch = 7,
68 kMaxValue = kSchemeHostPortMismatch
69};
70
Lingqi Chi8e192ba2022-11-22 04:34:2571// Assembles PrerenderHostFinalStatus with a detailed explanation if applicable.
72// Some FinalStatus enums cover multiple sub cases. To explain them in detail,
73// some explanations can be attached to the status.
Miina Koyamad0e41f32023-11-13 06:50:0974class CONTENT_EXPORT PrerenderCancellationReason {
Lingqi Chi8e192ba2022-11-22 04:34:2575 public:
kenoe16970c2023-06-26 10:59:2976 // Tagged by `final_status_`. See `BuildFor*` and `ToDevtoolReasonString`.
Miina Koyamad0e41f32023-11-13 06:50:0977 using DetailedReasonVariant =
Victor Hugo Vianna Silva00692722025-03-18 19:51:4878 std::variant<std::monostate,
79 int32_t,
80 uint64_t,
81 std::string,
82 std::vector<PrerenderMismatchedHeaders>>;
Miina Koyamad0e41f32023-11-13 06:50:0983
84 explicit PrerenderCancellationReason(PrerenderFinalStatus final_status);
85 ~PrerenderCancellationReason();
Lingqi Chi8e192ba2022-11-22 04:34:2586
87 static PrerenderCancellationReason BuildForDisallowActivationState(
88 uint64_t disallow_activation_reason);
89
90 static PrerenderCancellationReason BuildForMojoBinderPolicy(
91 const std::string& interface_name);
92
Lingqi Chi897e7ec2023-04-28 05:50:5993 static PrerenderCancellationReason BuildForLoadingError(int32_t error_code);
94
Miina Koyamad0e41f32023-11-13 06:50:0995 static PrerenderCancellationReason
96 CreateCandidateReasonForActivationParameterMismatch();
Lingqi Chi8e192ba2022-11-22 04:34:2597
98 PrerenderCancellationReason(PrerenderCancellationReason&& reason);
99
Lingqi Chi20b3fd842022-11-24 05:29:11100 // Reports UMA and UKM metrics.
Lingqi Chi746334662024-06-04 01:11:22101 void ReportMetrics(const std::string& histogram_suffix) const;
Lingqi Chi8e192ba2022-11-22 04:34:25102
103 PrerenderFinalStatus final_status() const { return final_status_; }
104
kenoe16970c2023-06-26 10:59:29105 // Returns disallowed Mojo interface name iff final status is
106 // `kMojoBinderPolicy`.
Arthur Sonzognic686e8f2024-01-11 08:36:37107 std::optional<std::string> DisallowedMojoInterface() const;
Lingqi Chi20b3fd842022-11-24 05:29:11108
Miina Koyamad0e41f32023-11-13 06:50:09109 // Returns the pointer of the vector of PrerenderMismatchedHeaders iff
110 // header mismatch occurred.
111 const std::vector<PrerenderMismatchedHeaders>* GetPrerenderMismatchedHeaders()
112 const;
113
114 void SetPrerenderMismatchedHeaders(
115 std::unique_ptr<std::vector<PrerenderMismatchedHeaders>>
116 mismatched_headers);
Miina Koyama89b815042023-10-31 08:20:12117
Lingqi Chi8e192ba2022-11-22 04:34:25118 private:
119 PrerenderCancellationReason(PrerenderFinalStatus final_status,
120 DetailedReasonVariant explanation);
121
122 const PrerenderFinalStatus final_status_;
123
Miina Koyama89b815042023-10-31 08:20:12124 DetailedReasonVariant explanation_;
Lingqi Chi8e192ba2022-11-22 04:34:25125};
126
Lingqi Chic7fe2242022-08-26 10:35:36127// Used by PrerenderNavigationThrottle. This is a breakdown enum for
128// PrerenderCrossOriginRedirectionMismatch.kSchemePortMismatch.
129// These values are persisted to logs. Entries should not be renumbered and
130// numeric values should never be reused.
131enum class PrerenderCrossOriginRedirectionProtocolChange {
132 kHttpProtocolUpgrade = 0,
133 kHttpProtocolDowngrade = 1,
134 kMaxValue = kHttpProtocolDowngrade
135};
136
Lingqi Chi2a7b3c42024-05-31 03:50:06137std::string GeneratePrerenderHistogramSuffix(
138 PreloadingTriggerType trigger_type,
139 const std::string& embedder_suffix);
140
Robert Lind75062bf2021-10-28 12:50:55141void RecordPrerenderTriggered(ukm::SourceId ukm_id);
Kunihiko Sakamoto73d0a902021-07-15 00:22:32142
Asami Doi02406272021-11-12 05:01:44143void RecordPrerenderActivationTime(
144 base::TimeDelta delta,
Kouhei Ueno3f37992b2023-11-09 23:29:02145 PreloadingTriggerType trigger_type,
Asami Doi02406272021-11-12 05:01:44146 const std::string& embedder_histogram_suffix);
147
Lingqi Chi20b3fd842022-11-24 05:29:11148// Used by failing prerender attempts. Records the status to UMA and UKM, and
149// reports the failing reason to devtools. In the attributes, `initiator_ukm_id`
150// represents the page that starts prerendering.
151void RecordFailedPrerenderFinalStatus(
152 const PrerenderCancellationReason& cancellation_reason,
153 const PrerenderAttributes& attributes);
154
155// Records a success activation to UMA and UKM.
156// `prerendered_ukm_id` is the UKM ID of the activated page.
157void ReportSuccessActivation(const PrerenderAttributes& attributes,
158 ukm::SourceId prerendered_ukm_id);
Asami Doi4584b3b2021-12-13 04:17:14159
Yoshiki Taniokaab74ea52022-08-17 02:09:17160// Records which navigation parameters are different between activation and
161// initial prerender navigation when activation fails.
162void RecordPrerenderActivationNavigationParamsMatch(
163 PrerenderHost::ActivationNavigationParamsMatch result,
Lingqi Chi746334662024-06-04 01:11:22164 const std::string& histogram_suffix);
Yoshiki Taniokaab74ea52022-08-17 02:09:17165
Lingqi Chic7fe2242022-08-26 10:35:36166// Records the detailed types of the cross-origin redirection, e.g., changes to
167// scheme, host name etc.
168void RecordPrerenderRedirectionMismatchType(
169 PrerenderCrossOriginRedirectionMismatch case_type,
Lingqi Chi746334662024-06-04 01:11:22170 const std::string& histogram_suffix);
Lingqi Chic7fe2242022-08-26 10:35:36171
172// Records whether the redirection was caused by HTTP protocol upgrade.
173void RecordPrerenderRedirectionProtocolChange(
174 PrerenderCrossOriginRedirectionProtocolChange change_type,
Lingqi Chi746334662024-06-04 01:11:22175 const std::string& histogram_suffix);
Lingqi Chic7fe2242022-08-26 10:35:36176
Hiroki Nakagawa9c5bc502023-05-01 23:27:22177// Records ui::PageTransition of prerender activation navigation when transition
178// mismatch happens on prerender activation.
179void RecordPrerenderActivationTransition(
180 int32_t potential_activation_transition,
Lingqi Chi746334662024-06-04 01:11:22181 const std::string& histogram_suffix);
Hiroki Nakagawa9c5bc502023-05-01 23:27:22182
Domenic Denicola31e7eb72024-05-31 05:20:50183// If you change this, please follow the process in
184// go/preloading-dashboard-updates to update the mapping reflected in dashboard,
185// or if you are not a Googler, please file an FYI bug on https://crbug.new with
186// component Internals>Preload.
187//
Kevin McNee097680d2023-04-05 22:14:51188// These values are persisted to logs. Entries should not be renumbered and
189// numeric values should never be reused.
190// These are also mapped onto the second content internal range of
191// `PreloadingEligibility`.
Domenic Denicola31e7eb72024-05-31 05:20:50192//
193// LINT.IfChange
Kevin McNee097680d2023-04-05 22:14:51194enum class PrerenderBackNavigationEligibility {
195 kEligible = 0,
196
197 kNoBackEntry = 1,
198 kTargetIsSameDocument = 2,
199 kMethodNotGet = 3,
200 kTargetIsFailedNavigation = 4,
201 kBfcacheEntryExists = 5,
202 kTargetIsSameSite = 6,
203 kNoHttpCacheEntry = 7,
204 kTargetingOtherWindow = 8,
205 kTargetIsNonHttp = 9,
Kevin McNee8bad63f2023-08-23 21:19:37206 kRelatedActiveContents = 10,
Kevin McNee097680d2023-04-05 22:14:51207
Kevin McNee8bad63f2023-08-23 21:19:37208 kMaxValue = kRelatedActiveContents,
Kevin McNee097680d2023-04-05 22:14:51209};
Domenic Denicola31e7eb72024-05-31 05:20:50210// LINT.ThenChange()
Kevin McNee097680d2023-04-05 22:14:51211
212// Maps `eligibility` onto a content internal range of PreloadingEligibility.
213CONTENT_EXPORT PreloadingEligibility
214ToPreloadingEligibility(PrerenderBackNavigationEligibility eligibility);
215
216void RecordPrerenderBackNavigationEligibility(
217 PreloadingPredictor predictor,
218 PrerenderBackNavigationEligibility eligibility,
219 PreloadingAttempt* preloading_attempt);
220
Hiroki Nakagawa938494a2023-05-30 03:21:10221void RecordPrerenderActivationCommitDeferTime(
222 base::TimeDelta time_delta,
Kouhei Ueno3f37992b2023-11-09 23:29:02223 PreloadingTriggerType trigger_type,
Hiroki Nakagawa938494a2023-05-30 03:21:10224 const std::string& embedder_histogram_suffix);
225
Taiyo Mizuhashi5470a522023-08-21 05:05:56226void RecordReceivedPrerendersPerPrimaryPageChangedCount(
227 int number,
Kouhei Ueno3f37992b2023-11-09 23:29:02228 PreloadingTriggerType trigger_type,
Taiyo Mizuhashi5470a522023-08-21 05:05:56229 const std::string& eagerness_category);
230
Lingqi Chifc4b7d9c2021-04-08 01:41:22231} // namespace content
232
Sreeja Kamishettyc227f7a2022-07-08 22:33:15233#endif // CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_METRICS_H_