blob: acd2c3a1697ad0025ef5698ff57e5f58264b84ed [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/public/common/features.h"
#include "base/command_line.h"
#include "base/feature_list.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "services/network/public/cpp/features.h"
#include "third_party/blink/public/common/forcedark/forcedark_switches.h"
#include "third_party/blink/public/common/switches.h"
namespace blink {
namespace features {
// Apply lazy-loading to ad frames which have embeds likely impacting Core Web
// Vitals.
const base::Feature kAutomaticLazyFrameLoadingToAds{
"AutomaticLazyFrameLoadingToAds", base::FEATURE_DISABLED_BY_DEFAULT};
// Apply lazy-loading to frames which have embeds likely impacting Core Web
// Vitals.
const base::Feature kAutomaticLazyFrameLoadingToEmbeds{
"AutomaticLazyFrameLoadingToEmbeds", base::FEATURE_DISABLED_BY_DEFAULT};
// Define the allowed websites to use LazyEmbeds. The allowed websites need to
// be defined separately from kAutomaticLazyFrameLoadingToEmbeds because we want
// to gather Blink.AutomaticLazyLoadFrame.LazyEmbedFrameCount UKM data even when
// kAutomaticLazyFrameLoadingToEmbeds is disabled.
const base::Feature kAutomaticLazyFrameLoadingToEmbedUrls{
"AutomaticLazyFrameLoadingToEmbedUrls", base::FEATURE_DISABLED_BY_DEFAULT};
// Allows pages with DedicatedWorker to stay eligible for the back/forward
// cache.
const base::Feature kBackForwardCacheDedicatedWorker{
"BackForwardCacheDedicatedWorker", base::FEATURE_DISABLED_BY_DEFAULT};
// Enable intervention for download that was initiated from or occurred in an ad
// frame without user activation.
const base::Feature kBlockingDownloadsInAdFrameWithoutUserActivation{
"BlockingDownloadsInAdFrameWithoutUserActivation",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enable CSS Container Queries. Also implies LayoutNGGrid and CSSContainSize1D.
const base::Feature kCSSContainerQueries{"CSSContainerQueries",
base::FEATURE_DISABLED_BY_DEFAULT};
// Controls whether the Conversion Measurement API infrastructure is enabled.
const base::Feature kConversionMeasurement{"ConversionMeasurement",
base::FEATURE_ENABLED_BY_DEFAULT};
// Controls whether LCP calculations should exclude low-entropy images. If
// enabled, then the associated parameter sets the cutoff, expressed as the
// minimum number of bits of encoded image data used to encode each rendered
// pixel. Note that this is not just pixels of decoded image data; the rendered
// size includes any scaling applied by the rendering engine to display the
// content.
const base::Feature kExcludeLowEntropyImagesFromLCP{
"ExcludeLowEntropyImagesFromLCP", base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<double> kMinimumEntropyForLCP{
&kExcludeLowEntropyImagesFromLCP, "min_bpp", 2};
const base::Feature kGMSCoreEmoji{"GMSCoreEmoji",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enable defer commits to avoid flash of unstyled content, for same origin
// navigation only.
const base::Feature kPaintHolding{"PaintHolding",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enable defer commits to avoid flash of unstyled content, for all navigation.
const base::Feature kPaintHoldingCrossOrigin{"PaintHoldingCrossOrigin",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enable eagerly setting up a CacheStorage interface pointer and
// passing it to service workers on startup as an optimization.
// TODO(crbug/1077916): Re-enable once the issue with COOP/COEP is fixed.
const base::Feature kEagerCacheStorageSetupForServiceWorkers{
"EagerCacheStorageSetupForServiceWorkers",
base::FEATURE_DISABLED_BY_DEFAULT};
// Controls script streaming.
const base::Feature kScriptStreaming{"ScriptStreaming",
base::FEATURE_ENABLED_BY_DEFAULT};
// Allow streaming small (<30kB) scripts.
const base::Feature kSmallScriptStreaming{"SmallScriptStreaming",
base::FEATURE_ENABLED_BY_DEFAULT};
// Controls off-thread code cache consumption.
const base::Feature kConsumeCodeCacheOffThread{
"ConsumeCodeCacheOffThread", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables user level memory pressure signal generation on Android.
const base::Feature kUserLevelMemoryPressureSignal{
"UserLevelMemoryPressureSignal", base::FEATURE_DISABLED_BY_DEFAULT};
// Perform memory purges after freezing only if all pages are frozen.
const base::Feature kFreezePurgeMemoryAllPagesFrozen{
"FreezePurgeMemoryAllPagesFrozen", base::FEATURE_DISABLED_BY_DEFAULT};
// Freezes the user-agent as part of https://github.com/WICG/ua-client-hints.
const base::Feature kReduceUserAgent{"ReduceUserAgent",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enables the `sec-ch-ua-full` client hint to be sent along with the full user
// agent string in the HTTP request headers, as well as surfacing the full user
// agent string in the JS APIs (navigator.userAgent, etc).
const base::Feature kFullUserAgent{"FullUserAgent",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enables the frequency capping for detecting overlay popups. Overlay-popups
// are the interstitials that pop up and block the main content of the page.
const base::Feature kFrequencyCappingForOverlayPopupDetection{
"FrequencyCappingForOverlayPopupDetection",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enables the frequency capping for detecting large sticky ads.
// Large-sticky-ads are those ads that stick to the bottom of the page
// regardless of a user’s efforts to scroll, and take up more than 30% of the
// screen’s real estate.
const base::Feature kFrequencyCappingForLargeStickyAdDetection{
"FrequencyCappingForLargeStickyAdDetection",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enable Display Locking JavaScript APIs.
const base::Feature kDisplayLocking{"DisplayLocking",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kJSONModules{"JSONModules",
base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kDeferredFontShaping{"DeferredShaping",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enable LayoutNG.
const base::Feature kLayoutNG{"LayoutNG", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables the use of the PaintCache for Path2D objects that are rasterized
// out of process. Has no effect when kCanvasOopRasterization is disabled.
const base::Feature kPath2DPaintCache{"Path2DPaintCache",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enable by default. This feature is for a kill switch.
const base::Feature kLayoutNGBlockInInline{"LayoutNGBlockInInline",
base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kPrivacySandboxAdsAPIs{"PrivacySandboxAdsAPIs",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kMixedContentAutoupgrade{"AutoupgradeMixedContent",
base::FEATURE_ENABLED_BY_DEFAULT};
// An experimental replacement for the `User-Agent` header, defined in
// https://tools.ietf.org/html/draft-west-ua-client-hints.
const base::Feature kUserAgentClientHint{"UserAgentClientHint",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enable `sec-ch-ua-full-version-list` client hint.
const base::Feature kUserAgentClientHintFullVersionList{
"UserAgentClientHintFullVersionList", base::FEATURE_ENABLED_BY_DEFAULT};
// Handle prefers-color-scheme user preference media feature via client hints.
const base::Feature kPrefersColorSchemeClientHintHeader{
"PrefersColorSchemeClientHintHeader", base::FEATURE_ENABLED_BY_DEFAULT};
// Controls whether the Viewport Height client hint can be added to request
// headers.
const base::Feature kViewportHeightClientHintHeader{
"ViewportHeightClientHintHeader", base::FEATURE_DISABLED_BY_DEFAULT};
// Used to control the collection of anchor element metrics (crbug.com/856683).
// If kNavigationPredictor is enabled, then metrics of anchor elements
// in the first viewport after the page load and the metrics of the clicked
// anchor element will be extracted and recorded. Additionally, navigation
// predictor may preconnect/prefetch to resources/origins to make the
// future navigations faster.
const base::Feature kNavigationPredictor {
"NavigationPredictor",
#if BUILDFLAG(IS_ANDROID)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
};
// Anchor Element Interaction
const base::Feature kAnchorElementInteraction{
"AnchorElementInteraction", base::FEATURE_DISABLED_BY_DEFAULT};
// Enable browser-initiated dedicated worker script loading
// (PlzDedicatedWorker). https://crbug.com/906991
const base::Feature kPlzDedicatedWorker{"PlzDedicatedWorker",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enable Portals. https://crbug.com/865123.
// Note that default enabling this does not expose the portal
// element on its own, but does allow its use with an origin trial. This was the
// case for the M85 Android only origin trial (https://crbug.com/1040212).
const base::Feature kPortals{"Portals", base::FEATURE_DISABLED_BY_DEFAULT};
// When kPortals is enabled, allow portals to load content that is third-party
// (cross-origin) to the hosting page. Otherwise has no effect.
//
// https://crbug.com/1013389
const base::Feature kPortalsCrossOrigin{"PortalsCrossOrigin",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enable the <fencedframe> element; see crbug.com/1123606. Note that enabling
// this feature does not automatically expose this element to the web, it only
// allows the element to be enabled by the runtime enabled feature, for origin
// trials.
const base::Feature kFencedFrames{"FencedFrames",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<FencedFramesImplementationType>::Option
fenced_frame_implementation_types[] = {
{FencedFramesImplementationType::kShadowDOM, "shadow_dom"},
{FencedFramesImplementationType::kMPArch, "mparch"}};
const base::FeatureParam<FencedFramesImplementationType>
kFencedFramesImplementationTypeParam{
&kFencedFrames, "implementation_type",
FencedFramesImplementationType::kShadowDOM,
&fenced_frame_implementation_types};
// Enable the shared storage API. This base::Feature directly controls the
// corresponding runtime enabled feature.
// https://github.com/pythagoraskitty/shared-storage/blob/main/README.md
const base::Feature kSharedStorageAPI{"SharedStorageAPI",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<int>
kSharedStorageURLSelectionOperationInputURLSizeLimit{
&kSharedStorageAPI, "url_selection_operation_input_url_size_limit", 8};
const base::FeatureParam<int> kMaxSharedStorageStringLength = {
&kSharedStorageAPI, "MaxSharedStorageStringLength", 1024};
const base::FeatureParam<int> kMaxSharedStorageEntriesPerOrigin = {
&kSharedStorageAPI, "MaxSharedStorageEntriesPerOrigin", 10000};
const base::FeatureParam<int> kMaxSharedStoragePageSize = {
&kSharedStorageAPI, "MaxSharedStoragePageSize", 4096};
const base::FeatureParam<int> kMaxSharedStorageCacheSize = {
&kSharedStorageAPI, "MaxSharedStorageCacheSize", 1024};
const base::FeatureParam<int> kMaxSharedStorageInitTries = {
&kSharedStorageAPI, "MaxSharedStorageInitTries", 2};
const base::FeatureParam<int> kMaxSharedStorageIteratorBatchSize = {
&kSharedStorageAPI, "MaxSharedStorageIteratorBatchSize", 100};
const base::FeatureParam<base::TimeDelta>
kSharedStorageStaleOriginPurgeInitialInterval = {
&kSharedStorageAPI, "SharedStorageStaleOriginPurgeInitialInterval",
base::Minutes(15)};
const base::FeatureParam<base::TimeDelta>
kSharedStorageStaleOriginPurgeRecurringInterval = {
&kSharedStorageAPI, "SharedStorageStaleOriginPurgeRecurringInterval",
base::Hours(2)};
const base::FeatureParam<base::TimeDelta>
kSharedStorageOriginStalenessThreshold = {
&kSharedStorageAPI, "SharedStorageOriginStalenessThreshold",
base::Days(60)};
// Enables the Prerender2 feature: https://crbug.com/1126305
// Note that default enabling this does not enable the Prerender2 features
// because kSetOnlyIfOverridden is used for setting WebRuntimeFeatures'
// Prerender2. To enable this feature, we need to force-enable this feature
// using chrome://flags/#enable-prerender2 or --enable-features=Prerender2
// command line or a valid Origin Trial token in the page.
const base::Feature kPrerender2 {
"Prerender2",
#if BUILDFLAG(IS_ANDROID)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
};
const base::Feature kPrerender2MemoryControls{"Prerender2MemoryControls",
base::FEATURE_ENABLED_BY_DEFAULT};
const char kPrerender2MemoryThresholdParamName[] = "memory_threshold_in_mb";
bool IsPrerender2Enabled() {
return base::FeatureList::IsEnabled(blink::features::kPrerender2);
}
bool IsFencedFramesEnabled() {
return base::FeatureList::IsEnabled(blink::features::kFencedFrames);
}
bool IsFencedFramesMPArchBased() {
return blink::features::kFencedFramesImplementationTypeParam.Get() ==
blink::features::FencedFramesImplementationType::kMPArch;
}
bool IsFencedFramesShadowDOMBased() {
return blink::features::kFencedFramesImplementationTypeParam.Get() ==
blink::features::FencedFramesImplementationType::kShadowDOM;
}
const base::Feature kInitialNavigationEntry{"InitialNavigationEntry",
base::FEATURE_DISABLED_BY_DEFAULT};
bool IsInitialNavigationEntryEnabled() {
return base::FeatureList::IsEnabled(blink::features::kInitialNavigationEntry);
}
// Enable limiting previews loading hints to specific resource types.
const base::Feature kPreviewsResourceLoadingHintsSpecificResourceTypes{
"PreviewsResourceLoadingHintsSpecificResourceTypes",
base::FEATURE_DISABLED_BY_DEFAULT};
// Perform a memory purge after a renderer is backgrounded. Formerly labelled as
// the "PurgeAndSuspend" experiment.
//
// TODO(https://crbug.com/926186): Disabled by default on Android for historical
// reasons. Consider enabling by default if experiment results are positive.
const base::Feature kPurgeRendererMemoryWhenBackgrounded {
"PurgeRendererMemoryWhenBackgrounded",
#if BUILDFLAG(IS_ANDROID)
base::FEATURE_DISABLED_BY_DEFAULT
#else
base::FEATURE_ENABLED_BY_DEFAULT
#endif
};
// Enables new behavior for window.open() and BarProp properties.
const base::Feature kWindowOpenNewPopupBehavior{
"WindowOpenNewPopupBehavior", base::FEATURE_ENABLED_BY_DEFAULT};
// Changes the default RTCPeerConnection constructor behavior to use Unified
// Plan as the SDP semantics. When the feature is enabled, Unified Plan is used
// unless the default is overridden (by passing {sdpSemantics:'plan-b'} as the
// argument). This was shipped in M72.
// The feature is still used by virtual test suites exercising Plan B.
const base::Feature kRTCUnifiedPlanByDefault{"RTCUnifiedPlanByDefault",
base::FEATURE_ENABLED_BY_DEFAULT};
// Determines if the SDP attrbute extmap-allow-mixed should be offered by
// default or not. The default value can be overridden by passing
// {offerExtmapAllowMixed:false} as an argument to the RTCPeerConnection
// constructor.
const base::Feature kRTCOfferExtmapAllowMixed{"RTCOfferExtmapAllowMixed",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enables waiting for codec support status notification from GPU factory in RTC
// codec factories.
const base::Feature kRTCGpuCodecSupportWaiter{"kRTCGpuCodecSupportWaiter",
base::FEATURE_ENABLED_BY_DEFAULT};
const base::FeatureParam<int> kRTCGpuCodecSupportWaiterTimeoutParam{
&kRTCGpuCodecSupportWaiter, "timeout_ms", 3000};
// Prevents workers from sending IsolateInBackgroundNotification to V8
// and thus instructs V8 to favor performance over memory on workers.
const base::Feature kV8OptimizeWorkersForPerformance{
"V8OptimizeWorkersForPerformance", base::FEATURE_ENABLED_BY_DEFAULT};
// Controls whether the implementation of the performance.measureMemory
// web API uses PerformanceManager or not.
const base::Feature kWebMeasureMemoryViaPerformanceManager{
"WebMeasureMemoryViaPerformanceManager", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables negotiation of experimental multiplex codec in SDP.
const base::Feature kWebRtcMultiplexCodec{"WebRTC-MultiplexCodec",
base::FEATURE_DISABLED_BY_DEFAULT};
// Causes WebRTC to replace host ICE candidate IP addresses with generated
// names ending in ".local" and resolve them using mDNS.
// http://crbug.com/878465
const base::Feature kWebRtcHideLocalIpsWithMdns{
"WebRtcHideLocalIpsWithMdns", base::FEATURE_ENABLED_BY_DEFAULT};
// Causes WebRTC to not set the color space of video frames on the receive side
// in case it's unspecified. Otherwise we will guess that the color space is
// BT709. http://crbug.com/1129243
const base::Feature kWebRtcIgnoreUnspecifiedColorSpace{
"WebRtcIgnoreUnspecifiedColorSpace", base::FEATURE_DISABLED_BY_DEFAULT};
// When enabled, wake ups from throttleable TaskQueues are limited to 1 per
// minute in a page that has been backgrounded for 5 minutes.
//
// Intensive wake up throttling is enforced in addition to other throttling
// mechanisms:
// - 1 wake up per second in a background page or hidden cross-origin frame
// - 1% CPU time in a page that has been backgrounded for 10 seconds
//
// Feature tracking bug: https://crbug.com/1075553
//
// The base::Feature should not be read from; rather the provided accessors
// should be used, which also take into account the managed policy override of
// the feature.
//
// The base::Feature is enabled by default on all platforms. However, on
// Android, it has no effect because page freezing kicks in at the same time. It
// would have an effect if the grace period ("grace_period_seconds" param) was
// reduced.
const base::Feature kIntensiveWakeUpThrottling{
"IntensiveWakeUpThrottling", base::FEATURE_ENABLED_BY_DEFAULT};
// Name of the parameter that controls the grace period during which there is no
// intensive wake up throttling after a page is hidden. Defined here to allow
// access from about_flags.cc. The FeatureParam is defined in
// third_party/blink/renderer/platform/scheduler/common/features.cc.
const char kIntensiveWakeUpThrottling_GracePeriodSeconds_Name[] =
"grace_period_seconds";
// Throttles Javascript timer wake ups on foreground pages.
const base::Feature kThrottleForegroundTimers{
"ThrottleForegroundTimers", base::FEATURE_DISABLED_BY_DEFAULT};
#if BUILDFLAG(RTC_USE_H264) && BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
// Run-time feature for the |rtc_use_h264| encoder/decoder.
const base::Feature kWebRtcH264WithOpenH264FFmpeg{
"WebRTC-H264WithOpenH264FFmpeg", base::FEATURE_ENABLED_BY_DEFAULT};
#endif // BUILDFLAG(RTC_USE_H264) && BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
// Experiment of the delay from navigation to starting an update of a service
// worker's script.
const base::Feature kServiceWorkerUpdateDelay{
"ServiceWorkerUpdateDelay", base::FEATURE_DISABLED_BY_DEFAULT};
// Enable the use of Speculation Rules in access the private prefetch proxy
// (chrome/browser/prefetch/prefetch_proxy/).
// https://crbug.com/1190167
const base::Feature kSpeculationRulesPrefetchProxy {
"SpeculationRulesPrefetchProxy",
#if BUILDFLAG(IS_ANDROID)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
};
// Freeze scheduler task queues in background after allowed grace time.
// "stop" is a legacy name.
const base::Feature kStopInBackground {
"stop-in-background",
#if BUILDFLAG(IS_ANDROID)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
};
// Freeze scheduler task queues in background on network idle.
// This feature only works if stop-in-background is enabled.
const base::Feature kFreezeBackgroundTabOnNetworkIdle{
"freeze-background-tab-on-network-idle", base::FEATURE_DISABLED_BY_DEFAULT};
// Enable the Storage Access API. https://crbug.com/989663.
const base::Feature kStorageAccessAPI{"StorageAccessAPI",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enable text snippets in URL fragments. https://crbug.com/919204.
const base::Feature kTextFragmentAnchor{"TextFragmentAnchor",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enables CSS selector fragment anchors. https://crbug.com/1252460
const base::Feature kCssSelectorFragmentAnchor{
"CssSelectorFragmentAnchor", base::FEATURE_DISABLED_BY_DEFAULT};
// File handling integration. https://crbug.com/829689
const base::Feature kFileHandlingAPI{"FileHandlingAPI",
base::FEATURE_DISABLED_BY_DEFAULT};
// File handling icons. https://crbug.com/1218213
const base::Feature kFileHandlingIcons{"FileHandlingIcons",
base::FEATURE_DISABLED_BY_DEFAULT};
// Allows for synchronous XHR requests during page dismissal
const base::Feature kAllowSyncXHRInPageDismissal{
"AllowSyncXHRInPageDismissal", base::FEATURE_DISABLED_BY_DEFAULT};
// Font enumeration and data access. https://crbug.com/535764
const base::Feature kFontAccess{"FontAccess",
base::FEATURE_DISABLED_BY_DEFAULT};
// Kill switch for the Compute Pressure API. https://crbug.com/1067627
const base::Feature kComputePressure{"ComputePressure",
base::FEATURE_ENABLED_BY_DEFAULT};
// Prefetch request properties are updated to be privacy-preserving. See
// crbug.com/988956.
const base::Feature kPrefetchPrivacyChanges{"PrefetchPrivacyChanges",
base::FEATURE_DISABLED_BY_DEFAULT};
// Decodes jpeg 4:2:0 formatted images to YUV instead of RGBX and stores in this
// format in the image decode cache. See crbug.com/919627 for details on the
// feature.
const base::Feature kDecodeJpeg420ImagesToYUV{"DecodeJpeg420ImagesToYUV",
base::FEATURE_ENABLED_BY_DEFAULT};
// Decodes lossy WebP images to YUV instead of RGBX and stores in this format
// in the image decode cache. See crbug.com/900264 for details on the feature.
const base::Feature kDecodeLossyWebPImagesToYUV{
"DecodeLossyWebPImagesToYUV", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables cache-aware WebFonts loading. See https://crbug.com/570205.
// The feature is disabled on Android for WebView API issue discussed at
// https://crbug.com/942440.
const base::Feature kWebFontsCacheAwareTimeoutAdaption {
"WebFontsCacheAwareTimeoutAdaption",
#if BUILDFLAG(IS_ANDROID)
base::FEATURE_DISABLED_BY_DEFAULT
#else
base::FEATURE_ENABLED_BY_DEFAULT
#endif
};
// Enabled to block programmatic focus in subframes when not triggered by user
// activation (see htpps://crbug.com/954349).
const base::Feature kBlockingFocusWithoutUserActivation{
"BlockingFocusWithoutUserActivation", base::FEATURE_DISABLED_BY_DEFAULT};
// A server-side switch for the REALTIME_AUDIO thread priority of
// RealtimeAudioWorkletThread object. This can be controlled by a field trial,
// it will use the NORMAL priority thread when disabled.
const base::Feature kAudioWorkletThreadRealtimePriority{
"AudioWorkletThreadRealtimePriority", base::FEATURE_ENABLED_BY_DEFAULT};
// A feature to reduce the set of resources fetched by No-State Prefetch.
const base::Feature kLightweightNoStatePrefetch {
"LightweightNoStatePrefetch",
#if BUILDFLAG(IS_ANDROID)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
};
// Automatically convert light-themed pages to use a Blink-generated dark theme
const base::Feature kForceWebContentsDarkMode{
"WebContentsForceDark", base::FEATURE_DISABLED_BY_DEFAULT};
// A feature to enable using the smallest image specified within image srcset
// for users with Save Data enabled.
const base::Feature kSaveDataImgSrcset{"SaveDataImgSrcset",
base::FEATURE_DISABLED_BY_DEFAULT};
// Which algorithm should be used for color inversion?
const base::FeatureParam<ForceDarkInversionMethod>::Option
forcedark_inversion_method_options[] = {
{ForceDarkInversionMethod::kUseBlinkSettings,
"use_blink_settings_for_method"},
{ForceDarkInversionMethod::kHslBased, "hsl_based"},
{ForceDarkInversionMethod::kCielabBased, "cielab_based"},
{ForceDarkInversionMethod::kRgbBased, "rgb_based"}};
const base::FeatureParam<ForceDarkInversionMethod>
kForceDarkInversionMethodParam{&kForceWebContentsDarkMode,
"inversion_method",
ForceDarkInversionMethod::kUseBlinkSettings,
&forcedark_inversion_method_options};
// Should images be inverted?
const base::FeatureParam<ForceDarkImageBehavior>::Option
forcedark_image_behavior_options[] = {
{ForceDarkImageBehavior::kUseBlinkSettings,
"use_blink_settings_for_images"},
{ForceDarkImageBehavior::kInvertNone, "none"},
{ForceDarkImageBehavior::kInvertSelectively, "selective"}};
const base::FeatureParam<ForceDarkImageBehavior> kForceDarkImageBehaviorParam{
&kForceWebContentsDarkMode, "image_behavior",
ForceDarkImageBehavior::kUseBlinkSettings,
&forcedark_image_behavior_options};
// Do not invert text lighter than this.
// Range: 0 (do not invert any text) to 255 (invert all text)
// Can also set to -1 to let Blink's internal settings control the value
const base::FeatureParam<int> kForceDarkForegroundLightnessThresholdParam{
&kForceWebContentsDarkMode, "foreground_lightness_threshold", -1};
// Do not invert backgrounds darker than this.
// Range: 0 (invert all backgrounds) to 255 (invert no backgrounds)
// Can also set to -1 to let Blink's internal settings control the value
const base::FeatureParam<int> kForceDarkBackgroundLightnessThresholdParam{
&kForceWebContentsDarkMode, "background_lightness_threshold", -1};
const base::FeatureParam<ForceDarkIncreaseTextContrast>::Option
forcedark_increase_text_contrast_options[] = {
{ForceDarkIncreaseTextContrast::kUseBlinkSettings,
"use_blink_settings_for_method"},
{ForceDarkIncreaseTextContrast::kFalse, "false"},
{ForceDarkIncreaseTextContrast::kTrue, "true"}};
// Should text contrast be increased.
const base::FeatureParam<ForceDarkIncreaseTextContrast>
kForceDarkIncreaseTextContrastParam{
&kForceWebContentsDarkMode, "increase_text_contrast",
ForceDarkIncreaseTextContrast::kUseBlinkSettings,
&forcedark_increase_text_contrast_options};
// Instructs WebRTC to honor the Min/Max Video Encode Accelerator dimensions.
const base::Feature kWebRtcUseMinMaxVEADimensions {
"WebRtcUseMinMaxVEADimensions",
// TODO(crbug.com/1008491): enable other platforms.
#if BUILDFLAG(IS_CHROMEOS_ASH)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
};
// Blink garbage collection.
// Enables compaction of backing stores on Blink's heap.
const base::Feature kBlinkHeapCompaction{"BlinkHeapCompaction",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enables concurrently marking Blink's heap.
const base::Feature kBlinkHeapConcurrentMarking{
"BlinkHeapConcurrentMarking", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables concurrently sweeping Blink's heap.
const base::Feature kBlinkHeapConcurrentSweeping{
"BlinkHeapConcurrentSweeping", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables incrementally marking Blink's heap.
const base::Feature kBlinkHeapIncrementalMarking{
"BlinkHeapIncrementalMarking", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables a marking stress mode that schedules more garbage collections and
// also adds additional verification passes.
const base::Feature kBlinkHeapIncrementalMarkingStress{
"BlinkHeapIncrementalMarkingStress", base::FEATURE_DISABLED_BY_DEFAULT};
// Controls whether we use ThreadPriority::DISPLAY for renderer
// compositor & IO threads.
const base::Feature kBlinkCompositorUseDisplayThreadPriority {
"BlinkCompositorUseDisplayThreadPriority",
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
};
// When enabled, enforces new interoperable semantics for 3D transforms.
// See crbug.com/1008483.
const base::Feature kBackfaceVisibilityInterop{
"BackfaceVisibilityInterop", base::FEATURE_DISABLED_BY_DEFAULT};
// When enabled, beacons (and friends) have ResourceLoadPriority::kLow,
// not ResourceLoadPriority::kVeryLow.
const base::Feature kSetLowPriorityForBeacon{"SetLowPriorityForBeacon",
base::FEATURE_DISABLED_BY_DEFAULT};
// When enabled allows the header name used in the blink
// CacheStorageCodeCacheHint runtime feature to be modified. This runtime
// feature disables generating full code cache for responses stored in
// cache_storage during a service worker install event. The runtime feature
// must be enabled via the blink runtime feature mechanism, however.
const base::Feature kCacheStorageCodeCacheHintHeader{
"CacheStorageCodeCacheHintHeader", base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<std::string> kCacheStorageCodeCacheHintHeaderName{
&kCacheStorageCodeCacheHintHeader, "name", "x-CacheStorageCodeCacheHint"};
// When enabled, the beforeunload handler is dispatched when a frame is frozen.
// This allows the browser to know whether discarding the frame could result in
// lost user data, at the cost of extra CPU usage. The feature will be removed
// once we have determine whether the CPU cost is acceptable.
const base::Feature kDispatchBeforeUnloadOnFreeze{
"DispatchBeforeUnloadOnFreeze", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables the use of GpuMemoryBuffer images for low latency 2d canvas.
// TODO(khushalsagar): Enable this if we're using SurfaceControl and GMBs allow
// us to overlay these resources.
const base::Feature kLowLatencyCanvas2dImageChromium {
"LowLatencyCanvas2dImageChromium",
#if BUILDFLAG(IS_CHROMEOS_ASH)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif // BUILDFLAG(IS_CHROMEOS)
};
// Enables the use of shared image swap chains for low latency 2d canvas.
const base::Feature kLowLatencyCanvas2dSwapChain{
"LowLatencyCanvas2dSwapChain", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables the use of shared image swap chains for low latency webgl canvas.
const base::Feature kLowLatencyWebGLSwapChain{"LowLatencyWebGLSwapChain",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enables Dawn-accelerated 2D canvas.
const base::Feature kDawn2dCanvas{"Dawn2dCanvas",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enables small accelerated canvases for webview (crbug.com/1004304)
const base::Feature kWebviewAccelerateSmallCanvases{
"WebviewAccelerateSmallCanvases", base::FEATURE_DISABLED_BY_DEFAULT};
// Let accelerated canvases remain accelerated after readback
// (crbug.com/1288118)
const base::Feature kCanvas2dStaysGPUOnReadback{
"Canvas2dStaysGPUOnReadback", base::FEATURE_DISABLED_BY_DEFAULT};
// When enabled, frees up CachedMetadata after consumption by script resources
// and modules. Needed for the experiment in http://crbug.com/1045052.
const base::Feature kDiscardCodeCacheAfterFirstUse{
"DiscardCodeCacheAfterFirstUse", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kCacheCodeOnIdle{"CacheCodeOnIdle",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<int> kCacheCodeOnIdleDelayParam{&kCacheCodeOnIdle,
"delay-in-ms", 0};
// Kill switch for the new element.offsetParent behavior.
// TODO(crbug.com/920069): Remove this once the feature has
// landed and no compat issues are reported.
const base::Feature kOffsetParentNewSpecBehavior{
"OffsetParentNewSpecBehavior", base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kKeepScriptResourceAlive{"KeepScriptResourceAlive",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enables the JPEG XL Image File Format (JXL).
const base::Feature kJXL{"JXL", base::FEATURE_DISABLED_BY_DEFAULT};
// Make all pending 'display: auto' web fonts enter the swap or failure period
// immediately before reaching the LCP time limit (~2500ms), so that web fonts
// do not become a source of bad LCP.
const base::Feature kAlignFontDisplayAutoTimeoutWithLCPGoal{
"AlignFontDisplayAutoTimeoutWithLCPGoal", base::FEATURE_ENABLED_BY_DEFAULT};
// The amount of time allowed for 'display: auto' web fonts to load without
// intervention, counted from navigation start.
const base::FeatureParam<int>
kAlignFontDisplayAutoTimeoutWithLCPGoalTimeoutParam{
&kAlignFontDisplayAutoTimeoutWithLCPGoal, "lcp-limit-in-ms", 2000};
const base::FeatureParam<AlignFontDisplayAutoTimeoutWithLCPGoalMode>::Option
align_font_display_auto_timeout_with_lcp_goal_modes[] = {
{AlignFontDisplayAutoTimeoutWithLCPGoalMode::kToFailurePeriod,
"failure"},
{AlignFontDisplayAutoTimeoutWithLCPGoalMode::kToSwapPeriod, "swap"}};
const base::FeatureParam<AlignFontDisplayAutoTimeoutWithLCPGoalMode>
kAlignFontDisplayAutoTimeoutWithLCPGoalModeParam{
&kAlignFontDisplayAutoTimeoutWithLCPGoal, "intervention-mode",
AlignFontDisplayAutoTimeoutWithLCPGoalMode::kToSwapPeriod,
&align_font_display_auto_timeout_with_lcp_goal_modes};
// Enable throttling of fetch() requests from service workers in the
// installing state. The limit of 3 was chosen to match the limit
// in background main frames. In addition, trials showed that this
// did not cause excessive timeouts and resulted in a net improvement
// in successful install rate on some platforms.
const base::Feature kThrottleInstallingServiceWorker{
"ThrottleInstallingServiceWorker", base::FEATURE_ENABLED_BY_DEFAULT};
const base::FeatureParam<int> kInstallingServiceWorkerOutstandingThrottledLimit{
&kThrottleInstallingServiceWorker, "limit", 3};
const base::Feature kInputPredictorTypeChoice{
"InputPredictorTypeChoice", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kResamplingInputEvents{"ResamplingInputEvents",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kInputTargetClientHighPriority{
"InputTargetClientHighPriority", base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kResamplingScrollEvents{"ResamplingScrollEvents",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enables the device-memory, resource-width, viewport-width and DPR client
// hints to be sent to third-party origins if the first-party has opted in to
// receiving client hints, regardless of Permissions Policy.
const base::Feature kAllowClientHintsToThirdParty {
"AllowClientHintsToThirdParty",
#if BUILDFLAG(IS_ANDROID)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
};
const base::Feature kFilteringScrollPrediction{
"FilteringScrollPrediction", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kKalmanHeuristics{"KalmanHeuristics",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kKalmanDirectionCutOff{"KalmanDirectionCutOff",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kSkipTouchEventFilter{"SkipTouchEventFilter",
base::FEATURE_ENABLED_BY_DEFAULT};
const char kSkipTouchEventFilterTypeParamName[] = "type";
const char kSkipTouchEventFilterTypeParamValueDiscrete[] = "discrete";
const char kSkipTouchEventFilterTypeParamValueAll[] = "all";
const char kSkipTouchEventFilterFilteringProcessParamName[] =
"skip_filtering_process";
const char kSkipTouchEventFilterFilteringProcessParamValueBrowser[] = "browser";
const char kSkipTouchEventFilterFilteringProcessParamValueBrowserAndRenderer[] =
"browser_and_renderer";
// Disabling this will cause parkable strings to never be compressed.
// This is useful for headless mode + virtual time. Since virtual time advances
// quickly, strings may be parked too eagerly in that mode.
const base::Feature kCompressParkableStrings{"CompressParkableStrings",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enabling this will cause parkable strings to use Snappy for compression iff
// kCompressParkableStrings is enabled.
const base::Feature kUseSnappyForParkableStrings{
"UseSnappyForParkableStrings", base::FEATURE_DISABLED_BY_DEFAULT};
// Enabling this will delay the first aging of strings by 60 seconds instead of
// the default. See comment around the use of the feature for the logic behind
// the delay.
const base::Feature kDelayFirstParkingOfStrings{
"DelayFirstParkingOfStrings", base::FEATURE_DISABLED_BY_DEFAULT};
bool ParkableStringsUseSnappy() {
return base::FeatureList::IsEnabled(kUseSnappyForParkableStrings);
}
bool IsParkableStringsToDiskEnabled() {
// Always enabled as soon as compression is enabled.
return base::FeatureList::IsEnabled(kCompressParkableStrings);
}
const base::Feature kCLSScrollAnchoring{"CLSScrollAnchoring",
base::FEATURE_ENABLED_BY_DEFAULT};
// Reduce the amount of information in the default 'referer' header for
// cross-origin requests.
const base::Feature kReducedReferrerGranularity{
"ReducedReferrerGranularity", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables the constant streaming in the ContentCapture task.
const base::Feature kContentCaptureConstantStreaming = {
"ContentCaptureConstantStreaming", base::FEATURE_ENABLED_BY_DEFAULT};
// Dispatches a fake fetch event to a service worker to check the offline
// capability of the site before promoting installation.
// See https://crbug.com/965802 for more details.
const base::Feature kCheckOfflineCapability{"CheckOfflineCapability",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<CheckOfflineCapabilityMode>::Option
check_offline_capability_types[] = {
{CheckOfflineCapabilityMode::kWarnOnly, "warn_only"},
{CheckOfflineCapabilityMode::kEnforce, "enforce"}};
const base::FeatureParam<CheckOfflineCapabilityMode>
kCheckOfflineCapabilityParam{&kCheckOfflineCapability, "check_mode",
CheckOfflineCapabilityMode::kWarnOnly,
&check_offline_capability_types};
// The "BackForwardCacheABExperimentControl" feature indicates the state of the
// same-site BackForwardCache experiment. This information is used when sending
// the "Sec-bfcache-experiment" HTTP Header on resource requests. The header
// value is determined by the value of the "experiment_group_for_http_header"
// feature parameter.
const base::Feature kBackForwardCacheABExperimentControl{
"BackForwardCacheABExperimentControl", base::FEATURE_DISABLED_BY_DEFAULT};
const char kBackForwardCacheABExperimentGroup[] =
"experiment_group_for_http_header";
// Whether we should composite a PLSA (paint layer scrollable area) even if it
// means losing lcd text.
const base::Feature kPreferCompositingToLCDText = {
"PreferCompositingToLCDText", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kLogUnexpectedIPCPostedToBackForwardCachedDocuments{
"LogUnexpectedIPCPostedToBackForwardCachedDocuments",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enables web apps to provide theme color and background color overrides for
// dark mode.
const base::Feature kWebAppEnableDarkMode{"WebAppEnableDarkMode",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enables the "handle_links" manifest field for web apps.
// Explainer:
// https://github.com/WICG/pwa-url-handler/blob/main/handle_links/explainer.md
const base::Feature kWebAppEnableHandleLinks{"WebAppEnableHandleLinks",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enables the "launch_handler" manifest field for web apps.
// Explainer: https://github.com/WICG/sw-launch/blob/main/launch_handler.md
const base::Feature kWebAppEnableLaunchHandler{
"WebAppEnableLaunchHandler", base::FEATURE_DISABLED_BY_DEFAULT};
// Enables the deprecated syntax for the above "launch_handler": {
// "route_to": "existing-client",
// "navigate_existing_client: "always" | "never"
// }
const base::Feature kWebAppEnableLaunchHandlerV1API{
"WebAppEnableLaunchHandlerV1API", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables Unique ID feature in web apps. Controls parsing of "id" field in web
// app manifests. See explainer for more information:
// https://github.com/philloooo/pwa-unique-id
const base::Feature kWebAppEnableManifestId{"WebAppEnableManifestId",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enables the "translations" manifest field for web apps.
const base::Feature kWebAppEnableTranslations{
"WebAppEnableTranslations", base::FEATURE_DISABLED_BY_DEFAULT};
// Controls URL handling feature in web apps. Controls parsing of "url_handlers"
// field in web app manifests. See explainer for more information:
// https://github.com/WICG/pwa-url-handler/blob/main/explainer.md
const base::Feature kWebAppEnableUrlHandlers{"WebAppEnableUrlHandlers",
base::FEATURE_DISABLED_BY_DEFAULT};
// Makes network loading tasks unfreezable so that they can be processed while
// the page is frozen.
const base::Feature kLoadingTasksUnfreezable{"LoadingTasksUnfreezable",
base::FEATURE_ENABLED_BY_DEFAULT};
// Controls how max frame rates are enforced in MediaStreamTracks.
// TODO(crbug.com/1152307): Remove in M91.
const base::Feature kMediaStreamTrackUseConfigMaxFrameRate{
"MediaStreamTrackUseConfigMaxFrameRate", base::FEATURE_DISABLED_BY_DEFAULT};
// When enabled, the SubresourceFilter receives calls from the ResourceLoader
// to perform additional checks against any aliases found from DNS CNAME records
// for the requested URL.
const base::Feature kSendCnameAliasesToSubresourceFilterFromRenderer{
"SendCnameAliasesToSubresourceFilterFromRenderer",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kDisableDocumentDomainByDefault{
"DisableDocumentDomainByDefault", base::FEATURE_DISABLED_BY_DEFAULT};
// Scopes the memory cache to a fetcher i.e. document/frame. Any resource cached
// in the blink cache will only be reused if the most recent fetcher that
// fetched it was the same as the current document.
const base::Feature kScopeMemoryCachePerContext{
"ScopeMemoryCachePerContext", base::FEATURE_DISABLED_BY_DEFAULT};
// Allow image context menu selections to penetrate through transparent
// elements.
const base::Feature kEnablePenetratingImageSelection{
"EnablePenetratingImageSelection", base::FEATURE_ENABLED_BY_DEFAULT};
// When enabled, permits shared/root element transitions. See
// https://github.com/WICG/shared-element-transitions.
const base::Feature kDocumentTransition{"DocumentTransition",
base::FEATURE_DISABLED_BY_DEFAULT};
// Used to configure a per-origin allowlist of performance.mark events that are
// permitted to be included in slow reports traces. See crbug.com/1181774.
const base::Feature kBackgroundTracingPerformanceMark{
"BackgroundTracingPerformanceMark", base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<std::string>
kBackgroundTracingPerformanceMark_AllowList{
&kBackgroundTracingPerformanceMark, "allow_list", ""};
// Controls whether the Sanitizer API is available.
const base::Feature kSanitizerAPI{"SanitizerAPI",
base::FEATURE_DISABLED_BY_DEFAULT};
// Controls whether the Sanitizer API allows namespaced content (SVG + MathML).
//
// This feature is unlikely to be launched as-is. The primary purpose is to
// allow testing of different non-standard configurations.
const base::Feature kSanitizerAPINamespaces{"SanitizerAPINamespacesForTesting",
base::FEATURE_DISABLED_BY_DEFAULT};
// Kill switch for the blocking of the navigation of top from a cross origin
// iframe to a different protocol. TODO(https://crbug.com/1151507): Remove in
// M92.
const base::Feature kBlockCrossOriginTopNavigationToDiffentScheme{
"BlockCrossOriginTopNavigationToDiffentScheme",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enables a Web API for websites to access admin-provided configuration.
const base::Feature kManagedConfiguration{"ManagedConfiguration",
base::FEATURE_ENABLED_BY_DEFAULT};
// Causes all cross-origin iframes, both same-process and out-of-process, to
// have their rendering throttled on display:none or zero-area.
const base::Feature kThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes{
"ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes",
base::FEATURE_ENABLED_BY_DEFAULT};
// Kill switch for the Interest Group API, i.e. if disabled, the
// API exposure will be disabled regardless of the OT config.
const base::Feature kInterestGroupStorage{"InterestGroupStorage",
base::FEATURE_DISABLED_BY_DEFAULT};
// TODO(crbug.com/1197209): Adjust these limits in response to usage.
const base::FeatureParam<int> kInterestGroupStorageMaxOwners{
&kInterestGroupStorage, "max_owners", 1000};
const base::FeatureParam<int> kInterestGroupStorageMaxGroupsPerOwner{
&kInterestGroupStorage, "max_groups_per_owner", 1000};
const base::FeatureParam<int> kInterestGroupStorageMaxOpsBeforeMaintenance{
&kInterestGroupStorage, "max_ops_before_maintenance", 1000000};
// Enable the availability of the ad interest group API as part of the
// origin trial for FLEDGE or PARAKEET.
const base::Feature kAdInterestGroupAPI{"AdInterestGroupAPI",
base::FEATURE_DISABLED_BY_DEFAULT};
// Feature flag to enable PARAKEET implementation (See
// https://github.com/WICG/privacy-preserving-ads/blob/main/Parakeet.md).
// See also https://crbug.com/1249186.
const base::Feature kParakeet{"Parakeet", base::FEATURE_DISABLED_BY_DEFAULT};
// See https://github.com/WICG/turtledove/blob/main/FLEDGE.md
// Enables FLEDGE implementation. See https://crbug.com/1186444.
const base::Feature kFledge{"Fledge", base::FEATURE_DISABLED_BY_DEFAULT};
// See https://github.com/WICG/turtledove/blob/main/FLEDGE.md
// Changes default Permissions Policy for features join-ad-interest-group and
// run-ad-auction to a more restricted EnableForSelf.
const base::Feature kAdInterestGroupAPIRestrictedPolicyByDefault{
"AdInterestGroupAPIRestrictedPolicyByDefault",
base::FEATURE_DISABLED_BY_DEFAULT};
// See https://github.com/WICG/turtledove/blob/main/FLEDGE.md
// Feature flag to enable debug reporting APIs.
const base::Feature kBiddingAndScoringDebugReportingAPI{
"BiddingAndScoringDebugReportingAPI", base::FEATURE_DISABLED_BY_DEFAULT};
// Enables URN URLs like those produced by FLEDGE auctions to be displayed by
// iframes (instead of requiring fenced frames). This is only intended to be
// enabled as part of the FLEDGE origin trial.
const base::Feature kAllowURNsInIframes{"AllowURNsInIframes",
base::FEATURE_DISABLED_BY_DEFAULT};
BLINK_COMMON_EXPORT bool IsAllowURNsInIframeEnabled() {
return base::FeatureList::IsEnabled(blink::features::kAllowURNsInIframes);
}
// https://github.com/jkarlin/topics
// Kill switch for the Topics API.
const base::Feature kBrowsingTopics{"BrowsingTopics",
base::FEATURE_DISABLED_BY_DEFAULT};
// The number of epochs from where to calculate the topics to give to a
// requesting contexts.
const base::FeatureParam<int> kBrowsingTopicsNumberOfEpochsToExpose{
&kBrowsingTopics, "number_of_epochs_to_expose", 3};
// The periodic topics calculation interval.
const base::FeatureParam<base::TimeDelta> kBrowsingTopicsTimePeriodPerEpoch{
&kBrowsingTopics, "time_period_per_epoch", base::Days(7)};
// The number of top topics to derive and to keep for each epoch (week).
const base::FeatureParam<int> kBrowsingTopicsNumberOfTopTopicsPerEpoch{
&kBrowsingTopics, "number_of_top_topics_per_epoch", 5};
// The probability (in percent number) to return the random topic to a site. The
// "random topic" is per-site, and is selected from the full taxonomy uniformly
// at random, and each site has a
// `kBrowsingTopicsUseRandomTopicProbabilityPercent`% chance to see their random
// topic instead of one of the top topics.
const base::FeatureParam<int> kBrowsingTopicsUseRandomTopicProbabilityPercent{
&kBrowsingTopics, "use_random_topic_probability_percent", 5};
// How many epochs (weeks) of API usage data (i.e. topics observations) will be
// based off for the filtering of topics for a calling context.
const base::FeatureParam<int>
kBrowsingTopicsNumberOfEpochsOfObservationDataToUseForFiltering{
&kBrowsingTopics,
"number_of_epochs_of_observation_data_to_use_for_filtering", 3};
// The max number of observed-by context domains to keep for each top topic.
// The intent is to cap the in-use memory.
const base::FeatureParam<int>
kBrowsingTopicsMaxNumberOfApiUsageContextDomainsToKeepPerTopic{
&kBrowsingTopics,
"max_number_of_api_usage_context_domains_to_keep_per_topic", 1000};
// The max number of entries allowed to be retrieved from the
// `BrowsingTopicsSiteDataStorage` database for each query for the API usage
// contexts. The query will occur once per epoch (week) at topics calculation
// time. The intent is to cap the peak memory usage.
const base::FeatureParam<int>
kBrowsingTopicsMaxNumberOfApiUsageContextEntriesToLoadPerEpoch{
&kBrowsingTopics,
"max_number_of_api_usage_context_entries_to_load_per_epoch", 100000};
// The max number of API usage context domains allowed to be stored per page
// load.
const base::FeatureParam<int>
kBrowsingTopicsMaxNumberOfApiUsageContextDomainsToStorePerPageLoad{
&kBrowsingTopics,
"max_number_of_api_usage_context_domains_to_store_per_page_load", 30};
// Encodes the configuration parameters above. Each version number should only
// be mapped to one configuration set. In practice, this can be guaranteed by
// always bumping up the version number whenever parameters are updated.
const base::FeatureParam<int> kBrowsingTopicsConfigVersion{&kBrowsingTopics,
"config_version", 1};
// The taxonomy version. This only affects the topics classification that occurs
// during this browser session, and doesn't affect the pre-existing epochs.
const base::FeatureParam<int> kBrowsingTopicsTaxonomyVersion{
&kBrowsingTopics, "taxonomy_version", 1};
// If enabled, the check for whether the IP address is publicly routable will be
// bypassed when determining the eligibility for a page to be included in topics
// calculation. This is useful for developers to test in local environment.
const base::Feature kBrowsingTopicsBypassIPIsPubliclyRoutableCheck{
"BrowsingTopicsBypassIPIsPubliclyRoutableCheck",
base::FEATURE_DISABLED_BY_DEFAULT};
// When <dialog>s are closed, this focuses the "previously focused" element
// which had focus when the <dialog> was first opened.
// TODO(crbug.com/649162): Remove DialogFocusNewSpecBehavior after
// the feature is in stable with no issues.
const base::Feature kDialogFocusNewSpecBehavior{
"DialogFocusNewSpecBehavior", base::FEATURE_ENABLED_BY_DEFAULT};
// Makes autofill look across shadow boundaries when collecting form controls to
// fill.
const base::Feature kAutofillShadowDOM{"AutofillShadowDOM",
base::FEATURE_DISABLED_BY_DEFAULT};
// Allows read/write of custom formats with unsanitized clipboard content. See
// crbug.com/106449.
const base::Feature kClipboardCustomFormats{"ClipboardCustomFormats",
base::FEATURE_DISABLED_BY_DEFAULT};
// Uses page viewport instead of frame viewport in the Largest Contentful Paint
// heuristic where images occupying the full viewport are ignored.
const base::Feature kUsePageViewportInLCP{"UsePageViewportInLCP",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enable `Sec-CH-UA-Platform` client hint and request header to be sent by
// default
const base::Feature kUACHPlatformEnabledByDefault{
"UACHPlatformEnabledByDefault", base::FEATURE_ENABLED_BY_DEFAULT};
// When enabled, allow dropping alpha on media streams for rendering sinks if
// other sinks connected do not use alpha.
const base::Feature kAllowDropAlphaForMediaStream{
"AllowDropAlphaForMediaStream", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables partitioning of third party storage (IndexedDB, CacheStorage, etc.)
// by the top level site to reduce fingerprinting.
const base::Feature kThirdPartyStoragePartitioning{
"ThirdPartyStoragePartitioning", base::FEATURE_DISABLED_BY_DEFAULT};
// API that allows installed PWAs to add additional shortcuts by means of
// installing sub app components.
const base::Feature kDesktopPWAsSubApps{"DesktopPWAsSubApps",
base::FEATURE_DISABLED_BY_DEFAULT};
// Suppresses console errors for CORS problems which report an associated
// inspector issue anyway.
const base::Feature kCORSErrorsIssueOnly{"CORSErrorsIssueOnly",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kPersistentQuotaIsTemporaryQuota{
"PersistentQuotaIsTemporaryQuota", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kDelayLowPriorityRequestsAccordingToNetworkState{
"DelayLowPriorityRequestsAccordingToNetworkState",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kIncludeInitiallyInvisibleImagesInLCP{
"IncludeInitiallyInvisibleImagesInLCP", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kIncludeBackgroundSVGInLCP{
"IncludeBackgroundSVGInLCP", base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<int> kMaxNumOfThrottleableRequestsInTightMode{
&kDelayLowPriorityRequestsAccordingToNetworkState,
"MaxNumOfThrottleableRequestsInTightMode", 5};
const base::Feature kHTMLParamElementUrlSupport{
"HTMLParamElementUrlSupport", base::FEATURE_ENABLED_BY_DEFAULT};
const base::FeatureParam<base::TimeDelta> kHttpRttThreshold{
&kDelayLowPriorityRequestsAccordingToNetworkState, "HttpRttThreshold",
base::Milliseconds(450)};
const base::FeatureParam<double> kCostReductionOfMultiplexedRequests{
&kDelayLowPriorityRequestsAccordingToNetworkState,
"CostReductionOfMultiplexedRequests", 0.5};
const base::Feature kForceMajorVersionInMinorPositionInUserAgent{
"ForceMajorVersionInMinorPositionInUserAgent",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enable `sec-ch-device-memory` client hint.
const base::Feature kClientHintsDeviceMemory{"ClientHintsDeviceMemory",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enable `sec-ch-dpr` client hint.
const base::Feature kClientHintsDPR{"ClientHintsDPR",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enable `sec-ch-width` client hint.
const base::Feature kClientHintsResourceWidth{"ClientHintsResourceWidth",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enable `sec-ch-viewport-width` client hint.
const base::Feature kClientHintsViewportWidth{"ClientHintsViewportWidth",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enable legacy `device-memory` client hint.
const base::Feature kClientHintsDeviceMemory_DEPRECATED{
"ClientHintsDeviceMemory_DEPRECATED", base::FEATURE_ENABLED_BY_DEFAULT};
// Enable legacy `dpr` client hint.
const base::Feature kClientHintsDPR_DEPRECATED{
"ClientHintsDPR_DEPRECATED", base::FEATURE_ENABLED_BY_DEFAULT};
// Enable legacy `width` client hint.
const base::Feature kClientHintsResourceWidth_DEPRECATED{
"ClientHintsResourceWidth_DEPRECATED", base::FEATURE_ENABLED_BY_DEFAULT};
// Enable legacy `viewport-width` client hint.
const base::Feature kClientHintsViewportWidth_DEPRECATED{
"ClientHintsViewportWidth_DEPRECATED", base::FEATURE_ENABLED_BY_DEFAULT};
// If enabled, the setTimeout(..., 0) will not clamp to 1ms.
// Tracking bug: https://crbug.com/402694.
const base::Feature kSetTimeoutWithoutClamp{"SetTimeoutWithoutClamp",
base::FEATURE_DISABLED_BY_DEFAULT};
namespace {
enum class SetTimeoutWithout1MsClampPolicyOverride {
kNoOverride,
kForceDisable,
kForceEnable
};
bool g_set_timeout_without_1m_clamp_policy_override_cached = false;
// Returns the SetTimeoutWithout1MsClamp policy settings. This is calculated
// once on first access and cached.
SetTimeoutWithout1MsClampPolicyOverride
GetSetTimeoutWithout1MsClampPolicyOverride() {
static SetTimeoutWithout1MsClampPolicyOverride policy =
SetTimeoutWithout1MsClampPolicyOverride::kNoOverride;
if (g_set_timeout_without_1m_clamp_policy_override_cached)
return policy;
// Otherwise, check the command-line for the renderer. Only values of "0"
// and "1" are valid, anything else is ignored (and allows the base::Feature
// to control the feature). This slow path will only be hit once per renderer
// process.
std::string value =
base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
switches::kSetTimeoutWithout1MsClampPolicy);
if (value == switches::kSetTimeoutWithout1MsClampPolicy_ForceEnable) {
policy = SetTimeoutWithout1MsClampPolicyOverride::kForceEnable;
} else if (value == switches::kSetTimeoutWithout1MsClampPolicy_ForceDisable) {
policy = SetTimeoutWithout1MsClampPolicyOverride::kForceDisable;
} else {
policy = SetTimeoutWithout1MsClampPolicyOverride::kNoOverride;
}
g_set_timeout_without_1m_clamp_policy_override_cached = true;
return policy;
}
} // namespace
void ClearSetTimeoutWithout1MsClampPolicyOverrideCacheForTesting() {
// Tests may want to force recalculation of the cached policy value when
// exercising different configs.
g_set_timeout_without_1m_clamp_policy_override_cached = false;
}
bool IsSetTimeoutWithoutClampEnabled() {
// If policy is present then respect it.
auto policy = GetSetTimeoutWithout1MsClampPolicyOverride();
if (policy != SetTimeoutWithout1MsClampPolicyOverride::kNoOverride)
return policy == SetTimeoutWithout1MsClampPolicyOverride::kForceEnable;
// Otherwise respect the base::Feature.
return base::FeatureList::IsEnabled(features::kSetTimeoutWithoutClamp);
}
// If enabled, the setTimeout(..., 0) will clamp to 4ms after a custom `nesting`
// level.
// Tracking bug: https://crbug.com/1108877.
const base::Feature kMaxUnthrottledTimeoutNestingLevel{
"MaxUnthrottledTimeoutNestingLevel", base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<int> kMaxUnthrottledTimeoutNestingLevelParam{
&kMaxUnthrottledTimeoutNestingLevel, "nesting", 10};
bool IsMaxUnthrottledTimeoutNestingLevelEnabled() {
return base::FeatureList::IsEnabled(
blink::features::kMaxUnthrottledTimeoutNestingLevel);
}
int GetMaxUnthrottledTimeoutNestingLevel() {
return kMaxUnthrottledTimeoutNestingLevelParam.Get();
}
const base::Feature kTabSwitchMetrics2{"TabSwitchMetrics2",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enables reporting and web-exposure (respectively) of the time the first frame
// of an animated image was painted.
const base::Feature kLCPAnimatedImagesReporting{
"LCPAnimatedImagesReporting", base::FEATURE_DISABLED_BY_DEFAULT};
// TODO(crbug.com/1185950): Remove this flag when the feature is fully launched
// and released to stable with no issues.
const base::Feature kAutoExpandDetailsElement{"AutoExpandDetailsElement",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enables loading the response body earlier in navigation.
const base::Feature kEarlyBodyLoad{"EarlyBodyLoad",
base::FEATURE_ENABLED_BY_DEFAULT};
// Enables fetching the code cache earlier in navigation.
const base::Feature kEarlyCodeCache{"EarlyCodeCache",
base::FEATURE_ENABLED_BY_DEFAULT};
// Allow use of an http-equiv meta tag to set client hints.
const base::Feature kClientHintsMetaHTTPEquivAcceptCH{
"ClientHintsMetaHTTPEquivAcceptCH", base::FEATURE_ENABLED_BY_DEFAULT};
// Allow use of a named meta tag to set client hints.
const base::Feature kClientHintsMetaNameAcceptCH{
"ClientHintsMetaNameAcceptCH", base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kOriginAgentClusterDefaultEnabled{
"OriginAgentClusterDefaultEnable", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kOriginAgentClusterDefaultWarning{
"OriginAgentClusterDefaultWarning", base::FEATURE_ENABLED_BY_DEFAULT};
// Allow third-party delegation of client hint information.
const base::Feature kClientHintThirdPartyDelegation{
"ClientHintThirdPartyDelegation", base::FEATURE_ENABLED_BY_DEFAULT};
#if BUILDFLAG(IS_ANDROID)
// Enables prefetching Android fonts on renderer startup.
const base::Feature kPrefetchAndroidFonts{"PrefetchAndroidFonts",
base::FEATURE_ENABLED_BY_DEFAULT};
#endif
const base::Feature kCompositedCaret{"CompositedCaret",
base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kBackForwardCacheAppBanner{
"BackForwardCacheAppBanner", base::FEATURE_DISABLED_BY_DEFAULT};
// Initialize CSSDefaultStyleSheets early in renderer startup.
const base::Feature kDefaultStyleSheetsEarlyInit{
"DefaultStyleSheetsEarlyInit", base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kSystemColorChooser{"SystemColorChooser",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kNoForcedFrameUpdatesForWebTests{
"NoForcedFrameUpdatesForWebTests", base::FEATURE_DISABLED_BY_DEFAULT};
// This flag makes ElementRareData lazily initialize infrequently used fields as
// another class called ElementSuperRareData to improve memory usage.
const base::Feature kElementSuperRareData{"ElementSuperRareData",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kClientHintsPartitionedCookies{
"ClientHintsPartitionedCookies", base::FEATURE_DISABLED_BY_DEFAULT};
// If enabled, the memory limit used for tiles is scaled by
// `kScaleTileMemoryLimitFactor`.
const base::Feature kScaleTileMemoryLimit{"ScaleTileMemoryLimit",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<double> kScaleTileMemoryLimitFactor{
&kScaleTileMemoryLimit, "Factor", 1.0};
const base::Feature kDurableClientHintsCache{"DurableClientHintsCache",
base::FEATURE_DISABLED_BY_DEFAULT};
// If enabled, allows web pages to use the experimental EditContext API to
// better control text input. See crbug.com/999184.
const base::Feature kEditContext{"EditContext",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enables basic Multi-Screen Window Placement functionality.
const base::Feature kWindowPlacement{"WindowPlacement",
base::FEATURE_ENABLED_BY_DEFAULT};
// Allows sites to request fullscreen and open a popup from a single gesture.
const base::Feature kWindowPlacementFullscreenCompanionWindow{
"WindowPlacementFullscreenCompanionWindow",
base::FEATURE_DISABLED_BY_DEFAULT};
// Allows sites to request fullscreen when the set of screens change.
const base::Feature kWindowPlacementFullscreenOnScreensChange{
"WindowPlacementFullscreenOnScreensChange",
base::FEATURE_DISABLED_BY_DEFAULT};
// TODO(crbug.com/1277431): This flag should be eventually disabled.
const base::Feature kEventPath{"EventPath", base::FEATURE_ENABLED_BY_DEFAULT};
// Removes a paint invalidation of viewport constrained objects (sticky or
// fixed) after scrolling.
const base::Feature kOptimizeViewportConstrainedPaintInvalidation{
"OptimizeViewportConstrainedPaintInvalidation",
base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kReduceUserAgentMinorVersion{
"ReduceUserAgentMinorVersion", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kReportFCPOnlyOnSuccessfulCommit{
"ReportFCPOnlyOnSuccessfulCommit", base::FEATURE_DISABLED_BY_DEFAULT};
// Enables correctly computing whether dedicated workers are secure contexts.
// TODO(https://crbug.com/780031): Remove this once fully shipped.
const base::Feature kSecureContextFixForWorkers{
"SecureContextFixForWorkers", base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kZeroCopyTabCapture{"ZeroCopyTabCapture",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kUserAgentOverrideExperiment{
"UserAgentOverrideExperiment", base::FEATURE_DISABLED_BY_DEFAULT};
// Allow access to WebSQL APIs.
const base::Feature kWebSQLAccess{"kWebSQLAccess",
base::FEATURE_ENABLED_BY_DEFAULT};
// Changes behavior of User-Agent Client Hints to send blank headers when the
// User-Agent string is overridden, instead of disabling the headers altogether.
const base::Feature kUACHOverrideBlank{"UACHOverrideBlank",
base::FEATURE_DISABLED_BY_DEFAULT};
#if BUILDFLAG(IS_WIN)
const base::Feature kPrewarmDefaultFontFamilies{
"PrewarmDefaultFontFamilies", base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<bool> kPrewarmStandard = {&kPrewarmDefaultFontFamilies,
"prewarm_standard", true};
const base::FeatureParam<bool> kPrewarmFixed = {&kPrewarmDefaultFontFamilies,
"prewarm_fixed", true};
const base::FeatureParam<bool> kPrewarmSerif = {&kPrewarmDefaultFontFamilies,
"prewarm_serif", true};
const base::FeatureParam<bool> kPrewarmSansSerif = {
&kPrewarmDefaultFontFamilies, "prewarm_sans_serif", true};
const base::FeatureParam<bool> kPrewarmCursive = {&kPrewarmDefaultFontFamilies,
"prewarm_cursive", true};
const base::FeatureParam<bool> kPrewarmFantasy = {&kPrewarmDefaultFontFamilies,
"prewarm_fantasy", true};
#endif
// Enable `save-data` client hint.
const base::Feature kClientHintsSaveData{"ClientHintsSaveData",
base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kEstablishGpuChannelAsync{
"EstablishGpuChannelAsync", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kDeferBeginMainFrameDuringLoading{
"DeferBeginMainFrameDuringLoading", base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<base::TimeDelta> kRecentBeginMainFrameCutoff = {
&kDeferBeginMainFrameDuringLoading, "recent_begin_main_frame_cutoff",
base::Milliseconds(150)};
} // namespace features
} // namespace blink