Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2022 The Chromium Authors |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [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 | #include "content/browser/preloading/prefetch/prefetch_params.h" |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [diff] [blame] | 6 | |
Kouhei Ueno | 58165ea | 2023-11-13 03:41:07 | [diff] [blame] | 7 | #include <string> |
| 8 | |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [diff] [blame] | 9 | #include "base/command_line.h" |
| 10 | #include "base/metrics/field_trial_params.h" |
Kouhei Ueno | 58165ea | 2023-11-13 03:41:07 | [diff] [blame] | 11 | #include "base/no_destructor.h" |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [diff] [blame] | 12 | #include "base/rand_util.h" |
Taiyo Mizuhashi | 43066071f | 2025-04-25 23:40:22 | [diff] [blame] | 13 | #include "base/strings/strcat.h" |
Sreeja Kamishetty | f66553a | 2022-07-14 17:41:27 | [diff] [blame] | 14 | #include "content/browser/preloading/prefetch/prefetch_features.h" |
Hiroshige Hayashizaki | 583b496 | 2025-08-19 18:58:26 | [diff] [blame] | 15 | #include "content/browser/preloading/prefetch/prefetch_type.h" |
Taiyo Mizuhashi | 6b0a495 | 2024-03-18 22:40:37 | [diff] [blame] | 16 | #include "content/browser/preloading/preloading_trigger_type_impl.h" |
kenoss | 0a0181a | 2024-08-16 18:51:34 | [diff] [blame] | 17 | #include "content/browser/preloading/prerender/prerender_features.h" |
Adithya Srinivasan | e267795 | 2023-07-26 17:29:58 | [diff] [blame] | 18 | #include "content/public/common/content_features.h" |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [diff] [blame] | 19 | |
| 20 | namespace content { |
| 21 | |
Max Curran | ead64a6 | 2022-06-22 01:10:52 | [diff] [blame] | 22 | GURL PrefetchProxyHost(const GURL& default_proxy_url) { |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [diff] [blame] | 23 | // Command line overrides take priority. |
| 24 | std::string cmd_line_value = |
| 25 | base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 26 | "isolated-prerender-tunnel-proxy"); |
| 27 | if (!cmd_line_value.empty()) { |
| 28 | GURL cmd_line_url(cmd_line_value); |
| 29 | if (cmd_line_url.is_valid()) { |
| 30 | return cmd_line_url; |
| 31 | } |
| 32 | LOG(ERROR) << "--isolated-prerender-tunnel-proxy value is invalid"; |
| 33 | } |
| 34 | |
Max Curran | ead64a6 | 2022-06-22 01:10:52 | [diff] [blame] | 35 | return default_proxy_url; |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [diff] [blame] | 36 | } |
| 37 | |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [diff] [blame] | 38 | std::string PrefetchProxyServerExperimentGroup() { |
| 39 | return base::GetFieldTrialParamValueByFeature( |
| 40 | features::kPrefetchUseContentRefactor, "server_experiment_group"); |
| 41 | } |
| 42 | |
Max Curran | ead64a6 | 2022-06-22 01:10:52 | [diff] [blame] | 43 | bool PrefetchAllowAllDomains() { |
| 44 | return base::GetFieldTrialParamByFeatureAsBool( |
| 45 | features::kPrefetchUseContentRefactor, "allow_all_domains", |
| 46 | false) || |
| 47 | base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 48 | "isolated-prerender-allow-all-domains"); |
| 49 | } |
| 50 | |
| 51 | bool PrefetchAllowAllDomainsForExtendedPreloading() { |
| 52 | return base::GetFieldTrialParamByFeatureAsBool( |
| 53 | features::kPrefetchUseContentRefactor, |
Max Curran | 94511aa | 2022-08-10 20:28:26 | [diff] [blame] | 54 | "allow_all_domains_for_extended_preloading", true); |
Max Curran | ead64a6 | 2022-06-22 01:10:52 | [diff] [blame] | 55 | } |
| 56 | |
Max Curran | ead64a6 | 2022-06-22 01:10:52 | [diff] [blame] | 57 | bool PrefetchServiceSendDecoyRequestForIneligblePrefetch( |
| 58 | bool disabled_based_on_user_settings) { |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [diff] [blame] | 59 | if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 60 | "prefetch-proxy-never-send-decoy-requests-for-testing")) { |
| 61 | return false; |
| 62 | } |
| 63 | if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 64 | "prefetch-proxy-always-send-decoy-requests-for-testing")) { |
| 65 | return true; |
| 66 | } |
| 67 | |
Max Curran | ead64a6 | 2022-06-22 01:10:52 | [diff] [blame] | 68 | if (base::GetFieldTrialParamByFeatureAsBool( |
| 69 | features::kPrefetchUseContentRefactor, |
| 70 | "disable_decoys_based_on_user_settings", true) && |
| 71 | disabled_based_on_user_settings) { |
| 72 | return false; |
| 73 | } |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [diff] [blame] | 74 | |
| 75 | double probability = base::GetFieldTrialParamByFeatureAsDouble( |
| 76 | features::kPrefetchUseContentRefactor, |
| 77 | "ineligible_decoy_request_probability", 1.0); |
| 78 | |
| 79 | // Clamp to [0.0, 1.0]. |
| 80 | probability = std::max(0.0, probability); |
| 81 | probability = std::min(1.0, probability); |
| 82 | |
| 83 | // RandDouble returns [0.0, 1.0) so don't use <= here since that may return |
| 84 | // true when the probability is supposed to be 0 (i.e.: always false). |
| 85 | return base::RandDouble() < probability; |
| 86 | } |
| 87 | |
| 88 | base::TimeDelta PrefetchTimeoutDuration() { |
| 89 | return base::Milliseconds(base::GetFieldTrialParamByFeatureAsInt( |
| 90 | features::kPrefetchUseContentRefactor, "prefetch_timeout_ms", |
| 91 | 10 * 1000 /* 10 seconds */)); |
| 92 | } |
| 93 | |
| 94 | size_t PrefetchMainframeBodyLengthLimit() { |
| 95 | return 1024 * base::GetFieldTrialParamByFeatureAsInt( |
| 96 | features::kPrefetchUseContentRefactor, |
| 97 | "max_mainframe_body_length_kb", 5 * 1024); |
| 98 | } |
| 99 | |
| 100 | bool PrefetchCloseIdleSockets() { |
| 101 | return base::GetFieldTrialParamByFeatureAsBool( |
| 102 | features::kPrefetchUseContentRefactor, "close_idle_sockets", true); |
| 103 | } |
| 104 | |
Max Curran | 94511aa | 2022-08-10 20:28:26 | [diff] [blame] | 105 | bool PrefetchStartsSpareRenderer() { |
| 106 | return base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 107 | "isolated-prerender-start-spare-renderer") || |
| 108 | base::GetFieldTrialParamByFeatureAsBool( |
| 109 | features::kPrefetchUseContentRefactor, "start_spare_renderer", |
| 110 | true); |
| 111 | } |
| 112 | |
elabadysayed | f7d6b00f | 2025-02-05 11:27:00 | [diff] [blame] | 113 | base::TimeDelta PrefetchContainerDefaultTtlInPrefetchService() { |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [diff] [blame] | 114 | // A value of 0 or less, indicates that |PrefetchService| should keep the |
| 115 | // prefetch forever. |
| 116 | return base::Seconds(base::GetFieldTrialParamByFeatureAsInt( |
| 117 | features::kPrefetchUseContentRefactor, "prefetch_container_lifetime_s", |
| 118 | 10 * 60 /* 10 minutes */)); |
| 119 | } |
| 120 | |
Max Curran | 6b93426f | 2022-05-03 00:55:52 | [diff] [blame] | 121 | bool PrefetchServiceHTMLOnly() { |
| 122 | return base::GetFieldTrialParamByFeatureAsBool( |
| 123 | features::kPrefetchUseContentRefactor, "html_only", false); |
| 124 | } |
| 125 | |
Kouhei Ueno | 58165ea | 2023-11-13 03:41:07 | [diff] [blame] | 126 | bool ShouldPrefetchBypassProxyForTestHost(std::string_view host) { |
| 127 | static const base::NoDestructor<std::string> bypass( |
| 128 | base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 129 | "bypass-prefetch-proxy-for-host")); |
| 130 | if (bypass->empty()) { |
| 131 | return false; |
| 132 | } |
| 133 | return host == *bypass; |
Iman Saboori | d74fb3c | 2022-07-21 15:34:38 | [diff] [blame] | 134 | } |
| 135 | |
Max Curran | c4445fc | 2022-06-02 18:43:43 | [diff] [blame] | 136 | base::TimeDelta PrefetchCacheableDuration() { |
| 137 | return base::Seconds(base::GetFieldTrialParamByFeatureAsInt( |
| 138 | features::kPrefetchUseContentRefactor, "cacheable_duration", 300)); |
| 139 | } |
| 140 | |
Max Curran | 0146f85 | 2022-08-01 19:49:33 | [diff] [blame] | 141 | bool PrefetchProbingEnabled() { |
| 142 | return base::GetFieldTrialParamByFeatureAsBool( |
Taiyo Mizuhashi | 576a6297 | 2025-06-23 11:09:25 | [diff] [blame] | 143 | features::kPrefetchCanaryCheckerParams, "must_probe_origin", true); |
Max Curran | 0146f85 | 2022-08-01 19:49:33 | [diff] [blame] | 144 | } |
| 145 | |
| 146 | bool PrefetchCanaryCheckEnabled() { |
| 147 | return base::GetFieldTrialParamByFeatureAsBool( |
Taiyo Mizuhashi | 576a6297 | 2025-06-23 11:09:25 | [diff] [blame] | 148 | features::kPrefetchCanaryCheckerParams, "do_canary", true); |
Max Curran | 0146f85 | 2022-08-01 19:49:33 | [diff] [blame] | 149 | } |
| 150 | |
| 151 | bool PrefetchTLSCanaryCheckEnabled() { |
| 152 | return base::GetFieldTrialParamByFeatureAsBool( |
Taiyo Mizuhashi | 576a6297 | 2025-06-23 11:09:25 | [diff] [blame] | 153 | features::kPrefetchCanaryCheckerParams, "do_tls_canary", false); |
Max Curran | 0146f85 | 2022-08-01 19:49:33 | [diff] [blame] | 154 | } |
| 155 | |
| 156 | GURL PrefetchTLSCanaryCheckURL(const GURL& default_tls_canary_check_url) { |
| 157 | GURL url(base::GetFieldTrialParamValueByFeature( |
Taiyo Mizuhashi | 576a6297 | 2025-06-23 11:09:25 | [diff] [blame] | 158 | features::kPrefetchCanaryCheckerParams, "tls_canary_url")); |
Max Curran | 0146f85 | 2022-08-01 19:49:33 | [diff] [blame] | 159 | if (url.is_valid()) |
| 160 | return url; |
| 161 | |
| 162 | return default_tls_canary_check_url; |
| 163 | } |
| 164 | |
| 165 | GURL PrefetchDNSCanaryCheckURL(const GURL& default_dns_canary_check_url) { |
| 166 | GURL url(base::GetFieldTrialParamValueByFeature( |
Taiyo Mizuhashi | 576a6297 | 2025-06-23 11:09:25 | [diff] [blame] | 167 | features::kPrefetchCanaryCheckerParams, "dns_canary_url")); |
Max Curran | 0146f85 | 2022-08-01 19:49:33 | [diff] [blame] | 168 | if (url.is_valid()) |
| 169 | return url; |
| 170 | |
| 171 | return default_dns_canary_check_url; |
| 172 | } |
| 173 | |
| 174 | base::TimeDelta PrefetchCanaryCheckCacheLifetime() { |
| 175 | return base::Hours(base::GetFieldTrialParamByFeatureAsInt( |
Taiyo Mizuhashi | 576a6297 | 2025-06-23 11:09:25 | [diff] [blame] | 176 | features::kPrefetchCanaryCheckerParams, "canary_cache_hours", 24)); |
Max Curran | 0146f85 | 2022-08-01 19:49:33 | [diff] [blame] | 177 | } |
| 178 | |
| 179 | base::TimeDelta PrefetchCanaryCheckTimeout() { |
| 180 | return base::Milliseconds(base::GetFieldTrialParamByFeatureAsInt( |
Taiyo Mizuhashi | 576a6297 | 2025-06-23 11:09:25 | [diff] [blame] | 181 | features::kPrefetchCanaryCheckerParams, "canary_check_timeout_ms", |
Max Curran | 0146f85 | 2022-08-01 19:49:33 | [diff] [blame] | 182 | 5 * 1000 /* 5 seconds */)); |
| 183 | } |
| 184 | |
| 185 | int PrefetchCanaryCheckRetries() { |
| 186 | return base::GetFieldTrialParamByFeatureAsInt( |
Taiyo Mizuhashi | 576a6297 | 2025-06-23 11:09:25 | [diff] [blame] | 187 | features::kPrefetchCanaryCheckerParams, "canary_check_retries", 1); |
Max Curran | 0146f85 | 2022-08-01 19:49:33 | [diff] [blame] | 188 | } |
| 189 | |
Taiyo Mizuhashi | cd08a8f | 2025-06-10 17:27:32 | [diff] [blame] | 190 | base::TimeDelta PrefetchBlockUntilHeadTimeout( |
| 191 | const PrefetchType& prefetch_type, |
| 192 | bool should_disable_block_until_head_timeout, |
| 193 | bool is_nav_prerender) { |
| 194 | // If the caller of prefetches requests to disable the timeout, follow that. |
| 195 | if (should_disable_block_until_head_timeout) { |
| 196 | return base::Seconds(0); |
| 197 | } |
| 198 | |
kenoss | 5cc0bcf7 | 2025-03-26 04:04:33 | [diff] [blame] | 199 | // Don't set a timeout for prerender because |
| 200 | // |
| 201 | // - The intention of prefetch ahead of prerender is not sending additional |
| 202 | // fetch request. The options of the behavior of the timeout case are |
| 203 | // 1. (Current behavior) Making prerender fail, or 2. Falling back to |
| 204 | // network. |
| 205 | // - 1 reduces the prerender activation rate. |
| 206 | // |
| 207 | // For more details, see |
| 208 | // https://docs.google.com/document/d/1ZP7lYrtqZL9jC2xXieNY_UBMJL1sCrfmzTB8K6v4sD4/edit?resourcekey=0-fkbeQhkT3PhBb9FnnPgnZA&tab=t.wphan8fb23kr |
| 209 | if (!features::kPrerender2FallbackPrefetchUseBlockUntilHeadTimetout.Get() && |
| 210 | is_nav_prerender) { |
| 211 | return base::Seconds(0); |
| 212 | } |
| 213 | |
Max Curran | e6679ca | 2023-06-06 19:01:39 | [diff] [blame] | 214 | int timeout_in_milliseconds = 0; |
Taiyo Mizuhashi | 6b0a495 | 2024-03-18 22:40:37 | [diff] [blame] | 215 | if (IsSpeculationRuleType(prefetch_type.trigger_type())) { |
| 216 | switch (prefetch_type.GetEagerness()) { |
Takashi Nakayama | 978f0a15 | 2025-06-17 08:26:25 | [diff] [blame] | 217 | case blink::mojom::SpeculationEagerness::kImmediate: |
Taiyo Mizuhashi | 6b0a495 | 2024-03-18 22:40:37 | [diff] [blame] | 218 | timeout_in_milliseconds = base::GetFieldTrialParamByFeatureAsInt( |
| 219 | features::kPrefetchUseContentRefactor, |
Takashi Nakayama | c96a5de | 2025-06-24 04:07:43 | [diff] [blame] | 220 | "block_until_head_timeout_immediate_prefetch", 1000); |
Taiyo Mizuhashi | 6b0a495 | 2024-03-18 22:40:37 | [diff] [blame] | 221 | break; |
Takashi Nakayama | 8ec9dbf | 2025-06-27 04:03:15 | [diff] [blame] | 222 | case blink::mojom::SpeculationEagerness::kEager: |
| 223 | timeout_in_milliseconds = base::GetFieldTrialParamByFeatureAsInt( |
| 224 | features::kPrefetchUseContentRefactor, |
| 225 | "block_until_head_timeout_eager_prefetch", 1000); |
| 226 | break; |
Taiyo Mizuhashi | 6b0a495 | 2024-03-18 22:40:37 | [diff] [blame] | 227 | case blink::mojom::SpeculationEagerness::kModerate: |
| 228 | timeout_in_milliseconds = base::GetFieldTrialParamByFeatureAsInt( |
| 229 | features::kPrefetchUseContentRefactor, |
Kouhei Ueno | c3f69a5 | 2024-07-05 03:57:20 | [diff] [blame] | 230 | "block_until_head_timeout_moderate_prefetch", 0); |
Taiyo Mizuhashi | 6b0a495 | 2024-03-18 22:40:37 | [diff] [blame] | 231 | break; |
| 232 | case blink::mojom::SpeculationEagerness::kConservative: |
| 233 | timeout_in_milliseconds = base::GetFieldTrialParamByFeatureAsInt( |
| 234 | features::kPrefetchUseContentRefactor, |
Kouhei Ueno | c3f69a5 | 2024-07-05 03:57:20 | [diff] [blame] | 235 | "block_until_head_timeout_conservative_prefetch", 0); |
Taiyo Mizuhashi | 6b0a495 | 2024-03-18 22:40:37 | [diff] [blame] | 236 | break; |
| 237 | } |
| 238 | } else { |
| 239 | timeout_in_milliseconds = base::GetFieldTrialParamByFeatureAsInt( |
| 240 | features::kPrefetchUseContentRefactor, |
| 241 | "block_until_head_timeout_embedder_prefetch", 1000); |
Max Curran | e6679ca | 2023-06-06 19:01:39 | [diff] [blame] | 242 | } |
| 243 | return base::Milliseconds(timeout_in_milliseconds); |
| 244 | } |
| 245 | |
Taiyo Mizuhashi | 43066071f | 2025-04-25 23:40:22 | [diff] [blame] | 246 | // These strings (including `embedder_histogram_suffix`) are persisted to logs. |
Takashi Nakayama | c818350 | 2025-08-04 14:18:50 | [diff] [blame] | 247 | // LINT.IfChange(GetMetricsSuffixTriggerTypeAndEagerness) |
Taiyo Mizuhashi | 43066071f | 2025-04-25 23:40:22 | [diff] [blame] | 248 | std::string GetMetricsSuffixTriggerTypeAndEagerness( |
| 249 | const PrefetchType prefetch_type, |
| 250 | const std::optional<std::string>& embedder_histogram_suffix) { |
| 251 | switch (prefetch_type.trigger_type()) { |
| 252 | case PreloadingTriggerType::kSpeculationRule: |
| 253 | switch (prefetch_type.GetEagerness()) { |
Takashi Nakayama | 978f0a15 | 2025-06-17 08:26:25 | [diff] [blame] | 254 | case blink::mojom::SpeculationEagerness::kImmediate: |
Takashi Nakayama | c818350 | 2025-08-04 14:18:50 | [diff] [blame] | 255 | return "SpeculationRule_Immediate2"; |
Takashi Nakayama | 9eb7988f | 2025-06-25 06:14:00 | [diff] [blame] | 256 | case blink::mojom::SpeculationEagerness::kEager: |
Takashi Nakayama | c818350 | 2025-08-04 14:18:50 | [diff] [blame] | 257 | return "SpeculationRule_Eager2"; |
Taiyo Mizuhashi | 43066071f | 2025-04-25 23:40:22 | [diff] [blame] | 258 | case blink::mojom::SpeculationEagerness::kModerate: |
| 259 | return "SpeculationRule_Moderate"; |
| 260 | case blink::mojom::SpeculationEagerness::kConservative: |
| 261 | return "SpeculationRule_Conservative"; |
| 262 | } |
| 263 | case PreloadingTriggerType::kSpeculationRuleFromIsolatedWorld: |
| 264 | switch (prefetch_type.GetEagerness()) { |
Takashi Nakayama | 978f0a15 | 2025-06-17 08:26:25 | [diff] [blame] | 265 | case blink::mojom::SpeculationEagerness::kImmediate: |
Takashi Nakayama | c818350 | 2025-08-04 14:18:50 | [diff] [blame] | 266 | return "SpeculationRule_Immediate2"; |
Takashi Nakayama | 9eb7988f | 2025-06-25 06:14:00 | [diff] [blame] | 267 | case blink::mojom::SpeculationEagerness::kEager: |
Takashi Nakayama | c818350 | 2025-08-04 14:18:50 | [diff] [blame] | 268 | return "SpeculationRule_Eager2"; |
Taiyo Mizuhashi | 43066071f | 2025-04-25 23:40:22 | [diff] [blame] | 269 | case blink::mojom::SpeculationEagerness::kModerate: |
| 270 | return "SpeculationRuleFromIsolatedWorld_Moderate"; |
| 271 | case blink::mojom::SpeculationEagerness::kConservative: |
| 272 | return "SpeculationRuleFromIsolatedWorld_Conservative"; |
| 273 | } |
| 274 | case PreloadingTriggerType::kSpeculationRuleFromAutoSpeculationRules: |
| 275 | switch (prefetch_type.GetEagerness()) { |
Takashi Nakayama | 978f0a15 | 2025-06-17 08:26:25 | [diff] [blame] | 276 | case blink::mojom::SpeculationEagerness::kImmediate: |
Takashi Nakayama | c818350 | 2025-08-04 14:18:50 | [diff] [blame] | 277 | return "SpeculationRule_Immediate2"; |
Takashi Nakayama | 9eb7988f | 2025-06-25 06:14:00 | [diff] [blame] | 278 | case blink::mojom::SpeculationEagerness::kEager: |
Takashi Nakayama | c818350 | 2025-08-04 14:18:50 | [diff] [blame] | 279 | return "SpeculationRule_Eager2"; |
Taiyo Mizuhashi | 43066071f | 2025-04-25 23:40:22 | [diff] [blame] | 280 | case blink::mojom::SpeculationEagerness::kModerate: |
| 281 | return "SpeculationRuleFromAutoSpeculationRules_Moderate"; |
| 282 | case blink::mojom::SpeculationEagerness::kConservative: |
| 283 | return "SpeculationRuleFromAutoSpeculationRules_Conservative"; |
| 284 | } |
| 285 | case PreloadingTriggerType::kEmbedder: |
| 286 | CHECK(!embedder_histogram_suffix.value().empty()); |
| 287 | return base::StrCat({"Embedder_", embedder_histogram_suffix.value()}); |
Max Curran | d74e811f | 2023-06-01 19:40:04 | [diff] [blame] | 288 | } |
| 289 | } |
Taiyo Mizuhashi | 43066071f | 2025-04-25 23:40:22 | [diff] [blame] | 290 | // LINT.ThenChange(//tools/metrics/histograms/metadata/prefetch/histograms.xml:TriggerTypeAndEagerness) |
Max Curran | d74e811f | 2023-06-01 19:40:04 | [diff] [blame] | 291 | |
Kouhei Ueno | d47c0bbc | 2023-11-15 23:16:17 | [diff] [blame] | 292 | bool PrefetchNIKScopeEnabled() { |
| 293 | return base::FeatureList::IsEnabled(features::kPrefetchNIKScope); |
| 294 | } |
| 295 | |
kenoss | 420b465a | 2024-11-21 13:17:15 | [diff] [blame] | 296 | size_t GetPrefetchDataPipeTeeBodySizeLimit() { |
kenoss | 767341b | 2025-07-01 10:35:32 | [diff] [blame] | 297 | return static_cast<size_t>(features::kPrefetchReusableBodySizeLimit.Get()); |
kenoss | 420b465a | 2024-11-21 13:17:15 | [diff] [blame] | 298 | } |
| 299 | |
kenoss | 1b8ebc2 | 2025-04-04 00:11:35 | [diff] [blame] | 300 | bool UsePrefetchScheduler() { |
kenoss | 1eb925f | 2025-04-04 05:49:56 | [diff] [blame] | 301 | return base::FeatureList::IsEnabled(features::kPrefetchScheduler) || |
| 302 | features::kPrerender2FallbackPrefetchSchedulerPolicy.Get() != |
Taiyo Mizuhashi | d13f8ca | 2025-06-23 13:29:02 | [diff] [blame] | 303 | features::Prerender2FallbackPrefetchSchedulerPolicy::kNotUse || |
| 304 | base::FeatureList::IsEnabled( |
Taiyo Mizuhashi | 98e3dea | 2025-06-23 18:32:58 | [diff] [blame] | 305 | features::kWebViewPrefetchHighestPrefetchPriority) || |
| 306 | base::FeatureList::IsEnabled( |
| 307 | features::kPrefetchMultipleActiveSetSizeLimitForBase); |
kenoss | 1b8ebc2 | 2025-04-04 00:11:35 | [diff] [blame] | 308 | } |
| 309 | |
Max Curran | 18a6f2b | 2022-05-02 23:13:24 | [diff] [blame] | 310 | } // namespace content |