Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2022 The Chromium Authors |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Sreeja Kamishetty | f66553a | 2022-07-14 17:41:27 | [diff] [blame] | 5 | #ifndef CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_STATUS_H_ |
| 6 | #define CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_STATUS_H_ |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 7 | |
Hiroshige Hayashizaki | 4e3e016 | 2023-11-01 16:50:12 | [diff] [blame] | 8 | #include "content/public/browser/preloading.h" |
| 9 | |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 10 | namespace content { |
| 11 | |
| 12 | // The various states that a prefetch can go through or terminate with. Used in |
| 13 | // UKM logging so don't remove or reorder values. Update |
| 14 | // |PrefetchProxyPrefetchStatus| in //tools/metrics/histograms/enums.xml |
| 15 | // whenever this is changed. |
keno | 434b82d | 2023-06-07 22:59:11 | [diff] [blame] | 16 | // |
| 17 | // If you change this, please follow the process |
| 18 | // https://docs.google.com/document/d/1PnrfowsZMt62PX1EvvTp2Nqs3ji1zrklrAEe1JYbkTk |
| 19 | // to ensure failure reasons are correctly shown in the DevTools |
| 20 | // frontend. |
Domenic Denicola | 31e7eb7 | 2024-05-31 05:20:50 | [diff] [blame] | 21 | // |
| 22 | // If you change this, please follow the process in |
| 23 | // go/preloading-dashboard-updates to update the mapping reflected in dashboard, |
| 24 | // or if you are not a Googler, please file an FYI bug on https://crbug.new with |
| 25 | // component Internals>Preload. |
| 26 | // LINT.IfChange |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 27 | enum class PrefetchStatus { |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 28 | // Deprecated. Replaced by `kPrefetchResponseUsed`. |
| 29 | // |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 30 | // The interceptor used a prefetch. |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 31 | // kPrefetchUsedNoProbe = 0, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 32 | |
William Liu | 7708905 | 2022-12-15 18:53:35 | [diff] [blame] | 33 | // Deprecated. Probe success implies the response is used. Thus replaced |
| 34 | // by `kPrefetchResponseUsed`. |
| 35 | // |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 36 | // The interceptor used a prefetch after successfully probing the origin. |
William Liu | 7708905 | 2022-12-15 18:53:35 | [diff] [blame] | 37 | // kPrefetchUsedProbeSuccess = 1, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 38 | |
| 39 | // The interceptor was not able to use an available prefetch because the |
| 40 | // origin probe failed. |
| 41 | kPrefetchNotUsedProbeFailed = 2, |
| 42 | |
| 43 | // The url was eligible to be prefetched, but the network request was never |
| 44 | // made. |
| 45 | kPrefetchNotStarted = 3, |
| 46 | |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 47 | // Deprecated. No longer a reason for ineligibility. |
| 48 | // |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 49 | // The url was not eligible to be prefetched because it is a Google-owned |
| 50 | // domain. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 51 | // kPrefetchIneligibleGoogleDomain = 4, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 52 | |
| 53 | // The url was not eligible to be prefetched because the user had cookies for |
| 54 | // that origin. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 55 | kPrefetchIneligibleUserHasCookies = 5, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 56 | |
| 57 | // The url was not eligible to be prefetched because there was a registered |
| 58 | // service worker for that origin. |
Hiroshige Hayashizaki | 5fcc71e | 2025-03-06 21:50:31 | [diff] [blame] | 59 | // Some other ServiceWorker-related `PrefetchStatus`/`PreloadingEligibility` |
| 60 | // values (e.g. `kPrefetchIneligibleUserHasServiceWorkerNoFetchHandler`) are |
| 61 | // used for some subcases. |
| 62 | // Even after the initial ServiceWorker support (https://crbug.com/40947546), |
| 63 | // this will still used for ServiceWorker-ineligible prefetches. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 64 | kPrefetchIneligibleUserHasServiceWorker = 6, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 65 | |
| 66 | // The url was not eligible to be prefetched because its scheme was not |
| 67 | // https://. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 68 | kPrefetchIneligibleSchemeIsNotHttps = 7, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 69 | |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 70 | // Deprecated. No longer a reason for ineligibility. |
| 71 | // |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 72 | // The url was not eligible to be prefetched because its host was an IP |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 73 | // address. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 74 | // kPrefetchIneligibleHostIsIPAddress = 8, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 75 | |
| 76 | // The url was not eligible to be prefetched because it uses a non-default |
| 77 | // storage partition. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 78 | kPrefetchIneligibleNonDefaultStoragePartition = 9, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 79 | |
| 80 | // The network request was cancelled before it finished. This happens when |
| 81 | // there is a new navigation. |
| 82 | kPrefetchNotFinishedInTime = 10, |
| 83 | |
| 84 | // The prefetch failed because of a net error. |
| 85 | kPrefetchFailedNetError = 11, |
| 86 | |
| 87 | // The prefetch failed with a non-2XX HTTP response code. |
| 88 | kPrefetchFailedNon2XX = 12, |
| 89 | |
Simon Pelchat | 5830fcb5 | 2022-04-13 00:17:18 | [diff] [blame] | 90 | // The prefetch's Content-Type header was not supported. |
| 91 | kPrefetchFailedMIMENotSupported = 13, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 92 | |
| 93 | // The prefetch finished successfully but was never used. |
| 94 | kPrefetchSuccessful = 14, |
| 95 | |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 96 | // Deprecated. No longer used. |
| 97 | // |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 98 | // The navigation off of the Google SRP was to a url that was not on the SRP. |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 99 | // kNavigatedToLinkNotOnSRP = 15, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 100 | |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 101 | // Deprecated. NSP no longer supported. |
| 102 | // |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 103 | // Variants of the first three statuses with the additional context of a |
| 104 | // successfully completed NoStatePrefetch. |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 105 | // kPrefetchUsedNoProbeWithNSP = 16, |
| 106 | // kPrefetchUsedProbeSuccessWithNSP = 17, |
| 107 | // kPrefetchNotUsedProbeFailedWithNSP = 18, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 108 | |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 109 | // Deprecated. NSP no longer supported |
| 110 | // |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 111 | // Variants of the first three statuses within the additional context of a |
| 112 | // link that was eligible for NoStatePrefetch, but was not started because |
| 113 | // the Prerender code denied the request. |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 114 | // kPrefetchUsedNoProbeNSPAttemptDenied = 19, |
| 115 | // kPrefetchUsedProbeSuccessNSPAttemptDenied = 20, |
| 116 | // kPrefetchNotUsedProbeFailedNSPAttemptDenied = 21, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 117 | |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 118 | // Deprecated. NSP no longer supported. |
| 119 | // |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 120 | // Variants of the first three statuses with in the additional context of a |
| 121 | // link that was eligible for NoStatePrefetch that was never started. |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 122 | // kPrefetchUsedNoProbeNSPNotStarted = 22, |
| 123 | // kPrefetchUsedProbeSuccessNSPNotStarted = 23, |
| 124 | // kPrefetchNotUsedProbeFailedNSPNotStarted = 24, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 125 | |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 126 | // Deprecated. Subresources no longer supported. |
| 127 | // |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 128 | // A subresource which was not fetched because it was throttled by an |
| 129 | // experimental control for the max number of subresources per prerender. |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 130 | // kSubresourceThrottled = 25, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 131 | |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 132 | // Deprecated. No longer a reason for ineligibilty. |
| 133 | // |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 134 | // The position of the link in the navigation prediction was not eligible to |
| 135 | // be prefetch due to experiment controls. |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 136 | // kPrefetchPositionIneligible = 26, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 137 | |
| 138 | // A previous prefetch to the origin got a HTTP 503 response with an |
| 139 | // Retry-After header that has no elapsed yet. |
| 140 | kPrefetchIneligibleRetryAfter = 27, |
| 141 | |
| 142 | // A network error or intentional loadshed was previously encountered when |
| 143 | // trying to setup a connection to the proxy and a prefetch should not be done |
| 144 | // right now. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 145 | kPrefetchIneligiblePrefetchProxyNotAvailable = 28, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 146 | |
| 147 | // The prefetch was not eligible, but was put on the network anyways and not |
| 148 | // used to disguise that the user had some kind of previous relationship with |
| 149 | // the origin. |
| 150 | kPrefetchIsPrivacyDecoy = 29, |
| 151 | |
| 152 | // The prefetch was eligible, but too much time elapsed between the prefetch |
Adithya Srinivasan | 006b365 | 2023-12-14 14:52:12 | [diff] [blame] | 153 | // and the interception. |
| 154 | kPrefetchIsStale = 30, |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 155 | |
| 156 | // Deprecated. NSP no longer supported |
| 157 | // kPrefetchIsStaleWithNSP = 31, |
| 158 | // kPrefetchIsStaleNSPAttemptDenied = 32, |
| 159 | // kPrefetchIsStaleNSPNotStarted = 33, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 160 | |
| 161 | // The prefetch was not used because cookies were added to the URL after the |
| 162 | // initial eligibility check. |
| 163 | kPrefetchNotUsedCookiesChanged = 34, |
| 164 | |
Adithya Srinivasan | 006b365 | 2023-12-14 14:52:12 | [diff] [blame] | 165 | // Deprecated. Support for redirects added. |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 166 | // |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 167 | // The prefetch was redirected, but following redirects was disabled. |
| 168 | // See crbug.com/1266876 for more details. |
Max Curran | 094ee862 | 2023-05-08 18:12:33 | [diff] [blame] | 169 | // kPrefetchFailedRedirectsDisabled = 35, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 170 | |
| 171 | // The url was not eligible to be prefetched because its host was not unique |
| 172 | // (e.g., a non publicly routable IP address or a hostname which is not |
| 173 | // registry-controlled) but the prefetch was to be proxied. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 174 | kPrefetchIneligibleHostIsNonUnique = 36, |
Jeremy Roman | bae6a42 | 2022-05-17 22:41:17 | [diff] [blame] | 175 | |
| 176 | // The prefetch was not made because the user requested that the browser use |
| 177 | // less data. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 178 | kPrefetchIneligibleDataSaverEnabled = 37, |
Max Curran | cc1ab0c | 2022-09-12 22:03:11 | [diff] [blame] | 179 | |
| 180 | // The URL is not eligible to be prefetched, because in the default network |
| 181 | // context it is configured to use a proxy server. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 182 | kPrefetchIneligibleExistingProxy = 38, |
William Liu | 7708905 | 2022-12-15 18:53:35 | [diff] [blame] | 183 | |
| 184 | // Prefetch not supported in Guest or Incognito mode. |
Jeremy Roman | a7c3fa7 | 2024-07-10 14:09:15 | [diff] [blame] | 185 | // OBSOLETE: kPrefetchIneligibleBrowserContextOffTheRecord = 39, |
William Liu | 7708905 | 2022-12-15 18:53:35 | [diff] [blame] | 186 | |
| 187 | // Whether this prefetch is heldback for counterfactual logging. |
| 188 | kPrefetchHeldback = 40, |
Hiroshige Hayashizaki | f1f8b360 | 2025-01-15 11:50:49 | [diff] [blame] | 189 | |
| 190 | // DEPRECATED |
| 191 | // kPrefetchAllowed = 41, |
William Liu | 7708905 | 2022-12-15 18:53:35 | [diff] [blame] | 192 | |
| 193 | // The response of the prefetch is used for the next navigation. This is the |
| 194 | // final successful state. |
| 195 | kPrefetchResponseUsed = 42, |
| 196 | |
Max Curran | 5d4da4b4 | 2023-03-10 23:41:46 | [diff] [blame] | 197 | // The prefetch was redirected, but there was a problem with the redirect. |
| 198 | kPrefetchFailedInvalidRedirect = 43, |
| 199 | |
| 200 | // The prefetch was redirected, but the redirect URL is not eligible for |
| 201 | // prefetch. |
| 202 | kPrefetchFailedIneligibleRedirect = 44, |
| 203 | |
Adithya Srinivasan | 9d1b6fa | 2024-08-29 15:04:35 | [diff] [blame] | 204 | // Deprecated; prefetches are now queued until other prefetches are evicted |
| 205 | // when the limit is reached. |
| 206 | // |
keno | 8ae912c | 2023-04-28 06:01:54 | [diff] [blame] | 207 | // The prefetch was not made because prefetches exceeded the limit per |
| 208 | // page. |
Adithya Srinivasan | 9d1b6fa | 2024-08-29 15:04:35 | [diff] [blame] | 209 | // kPrefetchFailedPerPageLimitExceeded = 45, |
keno | 8ae912c | 2023-04-28 06:01:54 | [diff] [blame] | 210 | |
Max Curran | c013750 | 2023-05-02 18:06:22 | [diff] [blame] | 211 | // The prefetch needed to fetch a same-site cross-origin URL and required the |
| 212 | // use of the prefetch proxy. These prefetches are blocked since the default |
| 213 | // network context cannot be configured to use the prefetch proxy for a single |
| 214 | // prefetch request. |
Alison Gale | 770f3fc | 2024-04-27 00:39:58 | [diff] [blame] | 215 | // TODO(crbug.com/40265797): Allow same-site cross-origin prefetches |
Max Curran | c013750 | 2023-05-02 18:06:22 | [diff] [blame] | 216 | // that require the prefetch proxy to be made. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 217 | kPrefetchIneligibleSameSiteCrossOriginPrefetchRequiredProxy = 46, |
Max Curran | c013750 | 2023-05-02 18:06:22 | [diff] [blame] | 218 | |
Iman Saboori | 8fc6d25a | 2023-05-17 18:19:20 | [diff] [blame] | 219 | // The prefetch was not made because the `Battery Saver` setting was enabled. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 220 | kPrefetchIneligibleBatterySaverEnabled = 47, |
Iman Saboori | 8fc6d25a | 2023-05-17 18:19:20 | [diff] [blame] | 221 | |
| 222 | // The prefetch was not made because preloading was disabled. |
Hiroshige Hayashizaki | 238198d8 | 2023-10-23 23:04:12 | [diff] [blame] | 223 | kPrefetchIneligiblePreloadingDisabled = 48, |
Iman Saboori | 8fc6d25a | 2023-05-17 18:19:20 | [diff] [blame] | 224 | |
kenoss | 6ccd702 | 2025-05-20 14:24:21 | [diff] [blame] | 225 | // The prefetch was evicted to make room for a newer prefetch. |
Adithya Srinivasan | b7f08b4 | 2023-12-05 15:49:36 | [diff] [blame] | 226 | // kPrefetchEvicted = 49, DEPRECATED |
| 227 | kPrefetchEvictedAfterCandidateRemoved = 50, |
| 228 | kPrefetchEvictedForNewerPrefetch = 51, |
Adithya Srinivasan | 6054e13 | 2023-05-18 17:38:39 | [diff] [blame] | 229 | |
Hiroshige Hayashizaki | 5fcc71e | 2025-03-06 21:50:31 | [diff] [blame] | 230 | // The initial URL is controlled by a ServiceWorker and then redirected |
| 231 | // (https://crbug.com/399819894). |
| 232 | kPrefetchIneligibleRedirectFromServiceWorker = 52, |
| 233 | |
| 234 | // The initial URL is redirected to a URL controlled by a ServiceWorker |
| 235 | // (https://crbug.com/399819894). |
| 236 | // This case was previously counted as |
| 237 | // `kPrefetchIneligibleUserHasServiceWorker`. |
| 238 | kPrefetchIneligibleRedirectToServiceWorker = 53, |
| 239 | |
| 240 | // The url was not eligible to be prefetched because there was a registered |
| 241 | // service worker with no fetch handler (when |
| 242 | // `kPrefetchServiceWorkerNoFetchHandlerFix` is enabled). |
| 243 | // This case was previously counted as |
| 244 | // `kPrefetchIneligibleUserHasServiceWorker`. |
| 245 | // Even after the initial ServiceWorker support (https://crbug.com/40947546), |
| 246 | // this will be still used for ServiceWorker-ineligible prefetches. |
| 247 | kPrefetchIneligibleUserHasServiceWorkerNoFetchHandler = 54, |
| 248 | |
Steven Wei | e829c85f7 | 2025-03-17 18:57:59 | [diff] [blame] | 249 | // The prefetch canceled by clearing cache from browsing data removal. |
| 250 | kPrefetchEvictedAfterBrowsingDataRemoved = 55, |
| 251 | |
William Liu | 7708905 | 2022-12-15 18:53:35 | [diff] [blame] | 252 | // The max value of the PrefetchStatus. Update this when new enums are added. |
Steven Wei | e829c85f7 | 2025-03-17 18:57:59 | [diff] [blame] | 253 | kMaxValue = kPrefetchEvictedAfterBrowsingDataRemoved, |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 254 | }; |
Adithya Srinivasan | 4d3dad0 | 2024-10-17 18:06:59 | [diff] [blame] | 255 | // LINT.ThenChange(/tools/metrics/histograms/enums.xml) |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 256 | |
Hiroshige Hayashizaki | 4e3e016 | 2023-11-01 16:50:12 | [diff] [blame] | 257 | // Mapping from `PrefetchStatus` to `PreloadingFailureReason`. |
| 258 | static_assert( |
| 259 | static_cast<int>(PrefetchStatus::kMaxValue) + |
| 260 | static_cast<int>( |
| 261 | PreloadingFailureReason::kPreloadingFailureReasonCommonEnd) <= |
| 262 | static_cast<int>( |
| 263 | PreloadingFailureReason::kPreloadingFailureReasonContentEnd)); |
| 264 | |
| 265 | inline PreloadingFailureReason ToPreloadingFailureReason( |
| 266 | PrefetchStatus prefetch_container_metrics) { |
| 267 | return static_cast<PreloadingFailureReason>( |
| 268 | static_cast<int>(prefetch_container_metrics) + |
| 269 | static_cast<int>( |
| 270 | PreloadingFailureReason::kPreloadingFailureReasonCommonEnd)); |
| 271 | } |
| 272 | |
Max Curran | 146bf44 | 2022-03-28 23:22:14 | [diff] [blame] | 273 | } // namespace content |
| 274 | |
Sreeja Kamishetty | f66553a | 2022-07-14 17:41:27 | [diff] [blame] | 275 | #endif // CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_STATUS_H_ |