1{
2  // http://dev.chromium.org/blink/runtime-enabled-features
3  //
4  // This list is used to generate runtime_enabled_features.h/cc which contains
5  // a class that stores static enablers for all experimental features.
6
7  parameters: {
8    // Each feature can be assigned a "status". The "status" can be either
9    // one of the values in the |valid_values| list or a dictionary of
10    // the platforms listed in |valid_keys| to |valid_values|.
11    // Use "default" as the key if you want to specify the status of
12    // the platforms other than the ones declared in the dictionary.
13    // ** Omitting "default" means the feature is not enabled on
14    // the platforms not listed in the status dictionary
15    //
16    // Definition of each status:
17    // * status=stable: Enable this in all Blink configurations. We are
18    //   committed to these APIs indefinitely.
19    // * status=experimental: In-progress features, Web Developers might play
20    //   with, but are not on by default in stable.
21    // * status=test: Enabled in ContentShell for testing, otherwise off.
22    // Features without a status are not enabled anywhere by default.
23    //
24    // Example of the dictionary value use:
25    // {
26    //   name: "ExampleFeature",
27    //   status: {"Android": "stable", "ChromeOS": "experimental"},
28    // }
29    // "ExampleFeature" will be stable on Android, experimental on ChromeOS
30    // and not enabled on any other platform
31    //
32    // "stable" features listed here should be rare, as anything which we've
33    // shipped stable can have its runtime flag removed soon after.
34    status: {
35      valid_values: ["stable", "experimental", "test"],
36      valid_keys: ["Android", "Win", "ChromeOS", "Mac"]
37    },
38
39    // "implied_by" or "depends_on" specifies relationship to other features:
40    // * implied_by: ["feature1","feature2",...]
41    //   The feature is automatically enabled if any implied_by features is
42    //   enabled;
43    // * depends_on: ["feature1","feature2",...]
44    //   The feature is enabled only if all depends_on features are enabled.
45    // Only one of "implied_by" and "depends_on" can be specified.
46    implied_by: {
47      default: [],
48      valid_type: "list",
49    },
50
51    // *DO NOT* specify features that depend on origin trial features.
52    // It is NOT supported. As a workaround, you can either specify the same
53    // |origin_trial_feature_name| for the feature or add the OT feature to
54    // the |implied_by| list.
55    // TODO(https://crbug.com/954679): Add support for origin trial features in 'depends_on' list
56    depends_on: {
57      default: [],
58      valid_type: "list",
59    },
60
61    // origin_trial_feature_name: "FEATURE_NAME" is used to integrate the
62    // feature with the Origin Trials framework. The framework allows the
63    // feature to be enabled at runtime on a per-page basis through a signed
64    // token for the corresponding feature name. Declaring the
65    // origin_trial_feature_name will modify the generation of the static
66    // methods in runtime_enabled_features.h/cpp. The static method then allows
67    // the feature implementation to check if the trial is enabled for the
68    // current context.
69    origin_trial_feature_name: {
70    },
71    // origin_trial_os specifies the platforms where the trial is available.
72    // The default is empty, meaning all platforms.
73    origin_trial_os: {
74      default: [],
75      valid_type: "list",
76    },
77    // origin_trial_type specifies the unique type of the trial, when not the
78    // usual trial for a new experimental feature.
79    origin_trial_type: {
80      default: "",
81      valid_type: "str",
82      valid_values: ["deprecation", "intervention", ""],
83    },
84    // origin_trial_allows_insecure specifies whether the trial can be enabled
85    // in an insecure context, with default being false. This can only be set
86    // to true for a "deprecation" type trial.
87    origin_trial_allows_insecure: {
88      valid_type: "bool",
89    },
90
91    // origin_trial_allows_third_party specifies whether the trial can be enabled
92    // from third party origins, with default being false.
93    origin_trial_allows_third_party: {
94      valid_type: "bool",
95    },
96
97    // settable_from_internals specifies whether a feature can be set from
98    // internals.runtimeFlags, with the default being false.
99    settable_from_internals: {
100      valid_type: "bool",
101    },
102
103    // Feature policy IDL extended attribute (see crrev.com/2247923004).
104    feature_policy: {
105    },
106  },
107
108  data: [
109    {
110      name: "Accelerated2dCanvas",
111      settable_from_internals: true,
112      status: "stable",
113    },
114    {
115      name: "AcceleratedSmallCanvases",
116      status: "stable",
117    },
118    {
119      name: "AccessibilityExposeDisplayNone",
120      status: "test",
121    },
122    {
123      name: "AccessibilityExposeHTMLElement",
124    },
125    {
126      name: "AccessibilityExposeIgnoredNodes",
127    },
128    {
129      name: "AccessibilityObjectModel",
130      status: "experimental",
131    },
132    {
133      name: "AccessibilityUseAXPositionForDocumentMarkers",
134      status: "test",
135    },
136    {
137      name: "AddEventListenerAbortSignal",
138      status: "experimental",
139    },
140    {
141      name: "AddressSpace",
142      status: "experimental",
143      implied_by: ["CorsRFC1918"],
144    },
145    {
146      name: "AdTagging",
147      status: "test",
148    },
149    {
150      // Deprecated, see UserActivationPostMessageTransfer.
151      name: "AllowActivationDelegationAttr",
152    },
153    {
154      name: "AllowContentInitiatedDataUrlNavigations",
155    },
156    {
157      name: "AllowSyncXHRInPageDismissal",
158      origin_trial_feature_name: "AllowSyncXHRInPageDismissal",
159    },
160    {
161      name: "AndroidDownloadableFontsMatching",
162    },
163    {
164      name: "AnimationWorklet",
165      status: "experimental",
166    },
167    {
168      name: "AOMAriaProperties",
169      status: "stable",
170    },
171    {
172      name: "AOMAriaRelationshipProperties",
173      status: "experimental",
174    },
175    {
176      // Force disabled if blink::features::kAppCache is disabled, and this
177      // will override any origin trial setting.
178      // Disabled if blink::features::kAppCacheRequireOriginTrial is enabled,
179      // but can be turned back on by the origin trial.
180      // Otherwise, on by default.
181      name: "AppCache",
182      status: "stable",
183      origin_trial_feature_name: "AppCache",
184    },
185    {
186      name: "AudioOutputDevices",
187      // Android does not yet support switching of audio output devices
188      status: {"Android": "", "default": "stable"},
189    },
190    {
191      name: "AudioVideoTracks",
192      status: "experimental",
193    },
194    {
195      name: "AudioWorkletRealtimeThread",
196      status: "experimental",
197    },
198    {
199      name: "AutoLazyLoadOnReloads",
200      depends_on: ["LazyFrameLoading"],
201    },
202    {
203      name: "AutomaticLazyFrameLoading",
204      depends_on: ["LazyFrameLoading"],
205      status: "stable",
206    },
207    {
208      name: "AutomaticLazyImageLoading",
209      depends_on: ["LazyImageLoading"],
210      status: "stable",
211    },
212    {
213      name: "AutomationControlled",
214      settable_from_internals: true,
215    },
216    {
217      name: "AutoPictureInPicture",
218      depends_on: ["PictureInPictureAPI"],
219      origin_trial_feature_name: "AutoPictureInPicture",
220      status: "experimental",
221    },
222    {
223      // Flag set by the media::kAutoplayIgnoreWebAudio feature flag.
224      name: "AutoplayIgnoresWebAudio",
225      settable_from_internals: true,
226    },
227    {
228      name: "AzimuthAltitude",
229      status: "stable",
230    },
231    {
232      name: "BackForwardCache",
233    },
234    {
235      name: "BackForwardCacheExperimentHTTPHeader",
236      origin_trial_feature_name: "BackForwardCacheExperimentHTTPHeader",
237      status: "experimental",
238    },
239    {
240      name: "BackgroundFetch",
241      status: "stable",
242    },
243    {
244      name: "BackgroundVideoTrackOptimization",
245      status: "stable",
246    },
247    {
248      name: "Badging",
249      status: "stable",
250    },
251    {
252      name: "BarcodeDetector",
253      status: {
254        // Built-in barcode detection APIs are only available from some
255        // platforms. See //services/shape_detection.
256        "Android": "stable",
257        "ChromeOS": "stable",
258        "Mac": "stable",
259        "default": "test",
260      },
261    },
262    {
263      // https://github.com/chrishtr/battery-savings/blob/master/explainer.md
264      name: "BatterySavingsMeta",
265      origin_trial_feature_name: "BatterySavingsMeta",
266      status: "experimental",
267    },
268    {
269      // https://github.com/WICG/display-locking/blob/master/explainer-beforematch.md
270      name: "BeforeMatchEvent",
271      origin_trial_feature_name: "BeforeMatchEvent",
272      status: "experimental",
273    },
274    {
275      name: "BidiCaretAffinity",
276    },
277    {
278      name: "BlinkRuntimeCallStats",
279    },
280    {
281      name: "BlockCredentialedSubresources",
282      status: "stable",
283    },
284    {
285      name: "BlockHTMLParserOnStyleSheets",
286    },
287    {
288      name: "BlockingDownloadsInSandbox",
289      status: "stable",
290    },
291    {
292      name: "BlockingFocusWithoutUserActivation",
293      status: "experimental",
294    },
295    {
296      name: "BrowserVerifiedUserActivationKeyboard",
297    },
298    {
299      name: "BrowserVerifiedUserActivationMouse",
300    },
301    {
302      name: "CacheInlineScriptCode"
303    },
304    {
305      name: "CacheStorageCodeCacheHint",
306      origin_trial_feature_name: "CacheStorageCodeCacheHint",
307      status: "experimental",
308    },
309    {
310      name: "Canvas2dContextLostRestored",
311      status: "experimental",
312    },
313    {
314      name: "Canvas2dImageChromium",
315    },
316    {
317      name: "Canvas2dScrollPathIntoView",
318      status: "experimental",
319    },
320    {
321      name: "CanvasColorManagement",
322      status: "experimental",
323    },
324    {
325      name: "CanvasHitRegion",
326      status: "experimental",
327    },
328    {
329      name: "CanvasImageSmoothing",
330      status: "experimental",
331    },
332    {
333      name: "CaptureTimeInCsrc",
334      status: "stable",
335    },
336    {
337      name: "ClickPointerEvent",
338      status: "experimental",
339    },
340    {
341      name: "ClickRetargetting",
342      status: "experimental",
343    },
344    {
345      name: "ClipboardSvg",
346      status: "experimental",
347    },
348    {
349      name: "CompositeAfterPaint",
350    },
351    {
352      name: "CompositeBGColorAnimation",
353    },
354    {
355      name: "CompositedSelectionUpdate",
356      status: {"Android": "stable"},
357    },
358    {
359      name: "CompositeRelativeKeyframes",
360      status: "experimental",
361    },
362    {
363      name: "CompositeSVG",
364      status: "test"
365    },
366    {
367      name: "CompositingOptimizations",
368      status: "experimental"
369    },
370    {
371      name: "ComputedAccessibilityInfo",
372      status: "experimental",
373    },
374    {
375      name: "ConsolidatedMovementXY",
376    },
377    {
378      name: "ContactsManager",
379      status:  {"Android": "stable", "default": "test"},
380    },
381    {
382      name: "ContactsManagerExtraProperties",
383      status:  {"Android": "stable", "default": "test"},
384    },
385    {
386      name: "ContentIndex",
387      status:  {"Android": "stable", "default": "experimental"},
388    },
389    {
390      name: "ContextMenu",
391      status: "experimental",
392    },
393    {
394      name: "ConversionMeasurement",
395      origin_trial_feature_name: "ConversionMeasurement",
396      origin_trial_allows_third_party: true,
397      status: "experimental",
398      depends_on: ["ConversionMeasurementInfraSupport"],
399    },
400    {
401      // Feature to explicitly disable/enable the Conversion
402      // Measurement API when there is not browser process side infra.
403      name: "ConversionMeasurementInfraSupport",
404    },
405    {
406      name: "CookieDeprecationMessages",
407      status: "experimental",
408    },
409    {
410      name: "CookieStoreDocument",
411      status: "stable",
412    },
413    {
414      name: "CookieStoreWorker",
415      status: "stable",
416    },
417    {
418      name: "CookiesWithoutSameSiteMustBeSecure",
419      status: "test",
420    },
421    {
422      name: "CooperativeScheduling"
423    },
424    {
425      name: "CorsRFC1918",
426    },
427    {
428      name: "CrossOriginIsolation",
429      status: "stable",
430    },
431    {
432      name: "CrossOriginOpenerPolicyReporting",
433      origin_trial_feature_name: "CrossOriginOpenerPolicyReporting",
434      origin_trial_allows_third_party: true,
435      status: "experimental",
436    },
437    {
438      name: "CSS3Text",
439      status: "experimental",
440    },
441    {
442      name: "CSSAspectRatioProperty",
443      status: "stable",
444    },
445    {
446      // https://drafts.csswg.org/css-counter-styles-3
447      name: "CSSAtRuleCounterStyle",
448    },
449    {
450      name: "CSSCalcAsInt",
451      status: "test",
452    },
453    {
454      // When the color-scheme is supported via the CSS color-scheme property
455      // (CSSColorScheme) or the meta tag (MetaColorScheme), the only UA
456      // rendering change is for the canvas background and the :root element
457      // color property. Enabling this runtime flag will enable dark UA
458      // rendering for form controls, scrollbars, etc.
459      name: "CSSColorSchemeUARendering",
460    },
461    {
462      // The main content-visibility feature.
463      // https://drafts.csswg.org/css-contain/#content-visibility
464      name: "CSSContentVisibility",
465      status: "stable",
466    },
467    {
468      // The content-visibility: hidden-matchable feature. This is a planned
469      // follow-up to the main CSSContentVisibility feature, thus it is gated
470      // by a different flag.
471      // https://wicg.github.io/display-locking/
472      name: "CSSContentVisibilityHiddenMatchable",
473      origin_trial_feature_name: "BeforeMatchEvent",
474      status: "experimental"
475    },
476    {
477      name: "CSSFocusVisible",
478      status: "stable",
479    },
480    {
481      name: "CSSFoldables",
482      status: "experimental",
483    },
484    {
485      // Experimental @font-face descriptor advance-override.
486      // Not standardized yet, and subject to changes.
487      name: "CSSFontFaceAdvanceOverride",
488      status: "test",
489      depends_on: ["CSSFontMetricsOverride"],
490    },
491    {
492      // Experimental @font-face descriptor advance-proportional-override.
493      // Not standardized yet, and subject to changes.
494      name: "CSSFontFaceAdvanceProportionalOverride",
495      status: "test",
496      depends_on: ["CSSFontMetricsOverride"],
497    },
498    {
499      // @font-face descriptors ascent-override, descent-override and
500      // line-gap-override.
501      // https://drafts.csswg.org/css-fonts-4/#font-metrics-override-desc
502      name: "CSSFontMetricsOverride",
503      status: "stable",
504    },
505    {
506      name: "CSSFontSizeAdjust",
507      status: "experimental",
508    },
509    {
510      // This needs to be kept as a runtime flag as long as we need to forcibly
511      // disable it for WebView on Android versions older than P. See
512      // https://crrev.com/f311a84728272e30979432e8474089b3db3c67df
513      name: "CSSHexAlphaColor",
514      status: "stable",
515    },
516    {
517      name: "CSSIndependentTransformProperties",
518      status: "experimental",
519    },
520    {
521      // Change ScopedStyleResolve and StyleEngine to use the already stored
522      // StyleSheetCollection to find @keyframes rules instead of creating their
523      // own hashmaps, so that we can save memory when there are web components
524      // with @keyframes rules in their stylesheets.
525      name: "CSSKeyframesMemoryReduction",
526      status: "test",
527    },
528    {
529      name: "CSSLayoutAPI",
530      status: "experimental",
531    },
532    {
533      name: "CSSLogical",
534      status: "experimental",
535    },
536    {
537      name: "CSSLogicalOverflow",
538      status: "test",
539    },
540    {
541      name: "CSSMarkerNestedPseudoElement",
542      status: "experimental",
543    },
544    {
545      name: "CSSMarkerPseudoElement",
546      status: "stable",
547      implied_by: ["CSSMarkerNestedPseudoElement"],
548    },
549    // Enables dependency support for the MatchedPropertiesCache.
550    {
551      name: "CSSMatchedPropertiesCacheDependencies",
552    },
553    {
554      name: "CSSMathDepth",
555      status: "experimental",
556      implied_by: ["MathMLCore"],
557    },
558    {
559      name: "CSSMathShift",
560      status: "experimental",
561      implied_by: ["MathMLCore"],
562    },
563    {
564      name: "CSSMathStyle",
565      status: "experimental",
566      implied_by: ["MathMLCore"],
567    },
568    {
569      name: "CSSMathVariant",
570      status: "experimental",
571      implied_by: ["MathMLCore"],
572    },
573    {
574      name: "CSSModules",
575      status: "experimental",
576    },
577    {
578      name: "CSSOffsetPathRay",
579      status: "experimental",
580    },
581    {
582      name: "CSSOffsetPathRayContain",
583      status: "experimental",
584    },
585    {
586      name: "CSSOffsetPositionAnchor",
587      status: "experimental",
588    },
589    {
590      name: "CSSPaintAPIArguments",
591      status: "experimental",
592    },
593    {
594      name: "CSSPictureInPicture",
595      status: "experimental",
596      depends_on: ["PictureInPictureAPI"],
597    },
598    {
599      name: "CSSPseudoIs",
600      status: "stable",
601    },
602    {
603      name: "CSSPseudoWhere",
604      status: "stable",
605    },
606    {
607      // Perform partial layout invalidation on web font loading.
608      // See https://crbug.com/441925 and https://bit.ly/35JjPmq for details.
609      name: "CSSReducedFontLoadingLayoutInvalidations",
610      status: "stable",
611    },
612    // Scrollbar styling.
613    // https://drafts.csswg.org/css-scrollbars/
614    {
615      name: "CSSScrollbars",
616      status: "test",
617    },
618    // Support for declarative parts of scroll-animations-1, i.e.
619    // the animation-timeline property and the @scroll-timeline rule.
620    //
621    // https://drafts.csswg.org/scroll-animations-1/#animation-timeline
622    // https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-at-rule
623    {
624      name: "CSSScrollTimeline",
625      status: "experimental",
626    },
627    {
628      name: "CSSSnapSize",
629      status: "experimental",
630    },
631    // Make system color keywords compute to themselves.
632    // https://github.com/w3c/csswg-drafts/issues/3847
633    {
634      name: "CSSSystemColorComputeToSelf",
635      status: "experimental",
636    },
637    {
638      // Support for ::target-text pseudo element as specified in
639      // https://drafts.csswg.org/css-pseudo/#selectordef-target-text
640      name: "CSSTargetTextPseudoElement",
641      status: "test",
642    },
643    // Support for @property rules.
644    {
645      name: "CSSVariables2AtProperty",
646      status: "stable",
647    },
648    // Support for registered custom properties with <image> syntax.
649    {
650      name: "CSSVariables2ImageValues",
651      status: "test",
652    },
653    // Support for registered custom properties with <transform-list> and
654    // <transform-function> syntax.
655    {
656      name: "CSSVariables2TransformValues",
657      status: "test",
658    },
659    {
660      name: "CustomElementDefaultStyle",
661      status: "experimental",
662    },
663    // TODO(937746): Web Components v0 is disabled by default, and will be
664    // removed after M87.
665    {
666      name: "CustomElementsV0",
667      status: "test",
668    },
669    {
670      name: "CustomStatePseudoClass",
671      status: "experimental",
672    },
673    {
674      name: "Database",
675      status: "stable",
676    },
677    {
678      name: "DeclarativeShadowDOM",
679      origin_trial_feature_name: "DeclarativeShadowDOM",
680      status: "experimental",
681    },
682    {
683      name: "DecodeJpeg420ImagesToYUV",
684      status: "test",
685    },
686    {
687      name: "DecodeLossyWebPImagesToYUV",
688      status: "test",
689    },
690    {
691      name: "DelayAsyncScriptExecutionUntilFinishedParsing",
692    },
693    {
694      name: "DelayAsyncScriptExecutionUntilFirstPaintOrFinishedParsing",
695    },
696    {
697      name: "DelegatedInkTrails",
698      status: "experimental",
699    },
700    {
701      name: "DesktopCaptureDisableLocalEchoControl",
702      status: "experimental",
703    },
704    {
705      name: "DigitalGoods",
706      origin_trial_feature_name: "DigitalGoods",
707      origin_trial_os: ["android"],
708      status: {
709        "Android": "experimental",
710        "ChromeOS": "experimental",
711        // crbug.com/1143079: Web tests cannot differentiate ChromeOS and Linux,
712        // so enable the API on all platforms for testing.
713        "default": "test"
714      },
715    },
716    {
717      name: "DirectSockets",
718      status: "test",
719    },
720    {
721      name: "DisableHardwareNoiseSuppression",
722      origin_trial_feature_name: "DisableHardwareNoiseSuppression",
723      status: "experimental",
724    },
725    {
726      // Disable composited layer squashing in pre-CompositeAfterPaint for
727      // testing.
728      name: "DisableLayerSquashing",
729    },
730    {
731      name: "DisallowDocumentAccess",
732      status: "experimental",
733    },
734    {
735      name: "DisplayCutoutAPI",
736      settable_from_internals: true,
737    },
738    {
739      name: "DocumentCookie",
740    },
741    {
742      name: "DocumentDomain",
743    },
744    {
745      name: "DocumentPolicy",
746      origin_trial_feature_name: "DocumentPolicy",
747      status: "stable",
748    },
749    {
750      name: "DocumentPolicyNegotiation",
751      origin_trial_feature_name: "DocumentPolicyNegotiation",
752      status: "experimental",
753      depends_on: ['DocumentPolicy']
754    },
755    {
756      name: "DocumentWrite",
757    },
758    {
759      name: "EditContext",
760      settable_from_internals: true,
761      status: "test",
762    },
763    {
764      // http://crbug.com/707656 content editable in LayoutNG.
765      name: "EditingNG",
766      status: "experimental",
767    },
768    {
769      name: "EncryptedMediaEncryptionSchemeQuery",
770      status: "stable",
771    },
772    {
773      name: "EncryptedMediaHdcpPolicyCheck",
774      status: "stable",
775    },
776    {
777      name: "EncryptedMediaPersistentUsageRecordSession",
778      status: "stable",
779    },
780    {
781      name: "EnterKeyHintAttribute",
782      status: "stable",
783    },
784    {
785      name: "EventTiming",
786      status: "stable",
787    },
788    {
789      name: "ExecCommandInJavaScript",
790      status: "test",
791    },
792    {
793      name: "ExpensiveBackgroundTimerThrottling",
794      status: "stable",
795    },
796    {
797      name: "ExperimentalContentSecurityPolicyFeatures",
798      status: "experimental",
799    },
800    // Enables navigator.scheduling.isFramePending, allowing long-running JS to
801    // be able to yield itself when a display update is scheduled.
802    {
803      name: "ExperimentalIsFramePending",
804      status: "experimental"
805    },
806    // Enables navigator.scheduling.isInputPending, allowing long-running JS to
807    // be able to yield itself when user input is queued (crbug.com/910421).
808    {
809      name: "ExperimentalIsInputPending",
810      origin_trial_feature_name: "ExperimentalIsInputPending",
811      status: "stable"
812    },
813    // Enables a DOM-exposed interface to profile client JS.
814    // https://github.com/WICG/js-self-profiling
815    {
816      name: "ExperimentalJSProfiler",
817      origin_trial_feature_name: "ExperimentalJSProfiler",
818      status: "experimental"
819    },
820    // Enables a set of features intended to help improve web developer
821    // productivity, by restricting the use of potentially problematic web-
822    // platform behaviors, as well as adding new high-level APIs for common
823    // development patterns.
824    {
825      name: "ExperimentalProductivityFeatures",
826      status: "experimental"
827    },
828    {
829      name: "ExtendedTextMetrics",
830      status: "experimental",
831    },
832    {
833      name: "ExtraWebGLVideoTextureMetadata",
834    },
835    {
836      name: "FaceDetector",
837      status: "experimental",
838    },
839    {
840      name: "FeaturePolicyForClientHints",
841      status: "stable",
842    },
843    {
844      name: "FeaturePolicyForSandbox",
845      status: "experimental",
846    },
847    {
848      name: "FeaturePolicyReporting",
849      implied_by: ["ExperimentalProductivityFeatures"],
850      origin_trial_feature_name: "FeaturePolicyReporting",
851      status: "experimental"
852    },
853    {
854      name: "FeaturePolicyVibrateFeature"
855    },
856    {
857      name: "FetchUploadStreaming",
858      origin_trial_feature_name: "FetchUploadStreaming",
859      status: "experimental",
860    },
861    {
862      // Also enabled when blink::features::kFileHandlingAPI is overridden
863      // on the command line (or via chrome://flags).
864      name: "FileHandling",
865      depends_on: ["NativeFileSystem"],
866      status: {"Android": "test", "default": "experimental"},
867      origin_trial_feature_name: "FileHandling",
868      origin_trial_os: ["win", "mac", "linux", "chromeos"],
869    },
870    {
871      name: "FileSystem",
872      status: "stable",
873    },
874    {
875      name: "FlexAspectRatio",
876      status: "stable",
877    },
878    {
879      name: "FocuslessSpatialNavigation",
880      settable_from_internals: true,
881    },
882    {
883      name: "FontAccess",
884      origin_trial_feature_name: "FontAccess",
885      // No status because this blink runtime feature doesn't work by itself.
886      // It's controlled by the corresponding Chromium feature which needs to
887      // be enabled to make the whole feature work.
888    },
889    {
890      name: "FontAccessChooser",
891      // TODO(crbug.com/1000486): Add when the Origin Trial dependency bug is fixed.
892      // depends_on: ["FontAccess"],
893      status: "experimental",
894    },
895    {
896      name: "FontSrcLocalMatching",
897      // No status, as the web platform runtime enabled feature is controlled by
898      // a Chromium level feature.
899    },
900    // For simulating Android's overlay fullscreen video in web tests on Linux.
901    {
902      name: "ForcedColors",
903      // No status because this blink runtime feature doesn't work by itself.
904      // It's controlled by the corresponding Chromium feature which needs to
905      // be enabled to make the whole feature work.
906    },
907    {
908      name: "ForceDeferScriptIntervention",
909    },
910    {
911      // This is used in tests to perform memory measurement without
912      // waiting for GC.
913      name:"ForceEagerMeasureMemory",
914    },
915    {
916      name: "ForceLoadAtTop",
917      origin_trial_feature_name: "ForceLoadAtTop",
918    },
919    {
920      name: "ForceOverlayFullscreenVideo",
921    },
922    {
923      name: "ForceSynchronousHTMLParsing",
924    },
925    {
926      name: "ForceTallerSelectPopup",
927      status: {"ChromeOS": "stable"},
928    },
929    {
930      name: "FractionalScrollOffsets",
931    },
932    {
933      name: "FreezeFramesOnVisibility",
934      status: "experimental",
935    },
936    {
937      name: "GamepadButtonAxisEvents",
938      status: "experimental",
939    },
940    {
941      name: "GetCurrentBrowsingContextMedia",
942      depends_on: ["GetDisplayMedia"],
943      status: {"Android": "", "default": "test"},
944    },
945    {
946      name: "GetDisplayMedia",
947      status: {
948        "Android": "experimental",
949        "default": "stable",
950        },
951    },
952    {
953      name: "GroupEffect",
954      status: "test",
955    },
956    {
957      name: "HrefTranslate",
958      depends_on: ["TranslateService"],
959      origin_trial_feature_name: "HrefTranslate",
960      status: "stable",
961    },
962    // TODO(937746): Web Components v0 is disabled by default, and will be
963    // removed after M87.
964    {
965      name: "HTMLImports",
966      status: "test",
967    },
968    {
969      name: "IDBObserver",
970      status: "experimental",
971    },
972    {
973      name: "IDBPutAll",
974      status: "experimental",
975    },
976    {
977      name: "IDBRelaxedDurability",
978      status: "stable",
979    },
980    {
981      name: "IdleDetection",
982      origin_trial_feature_name: "IdleDetection",
983      status: "experimental",
984    },
985    {
986      name: "IgnoreCrossOriginWindowWhenNamedAccessOnWindow",
987      status: "experimental",
988    },
989    {
990      name: "ImageOrientation",
991      status: "stable",
992    },
993    {
994      name: "ImplicitRootScroller",
995      settable_from_internals: true,
996    },
997    {
998      name: "ImportMaps",
999      implied_by: ["ExperimentalProductivityFeatures"],
1000    },
1001    {
1002      name: "InertAttribute",
1003      status: "experimental",
1004    },
1005    {
1006      name: "InputMultipleFieldsUI",
1007      // No plan to support complex UI for date/time INPUT types on Android.
1008      status: {"Android": "test", "default": "stable"},
1009    },
1010    {
1011      name: "InstalledApp",
1012      status: "stable",
1013    },
1014    {
1015      name: "InterestCohortAPI",
1016      origin_trial_feature_name: "InterestCohortAPI",
1017    },
1018    {
1019      name: "IntersectionObserverDocumentScrollingElementRoot",
1020      status: "stable",
1021    },
1022    {
1023      // Launched by default. TODO(mythria): cleanup virtual tests and
1024      // other hooks in blink.
1025      name: "IsolatedCodeCache",
1026      status: "stable",
1027    },
1028    {
1029      name: "KeyboardFocusableScrollers",
1030      status: "experimental",
1031    },
1032    {
1033      name: "LangAttributeAwareFormControlUI",
1034    },
1035    {
1036      name: "LangClientHintHeader",
1037      status: "experimental",
1038    },
1039    {
1040      // LayoutNG has been enabled in M76, but we still keep this flag for
1041      // testing. See web_tests/FlagExpectations/disable-layout-ng for more
1042      // details about running web tests with LayoutNG disabled. This flag also
1043      // provides a convenient way for testing legacy layout code path in blink
1044      // unit tests.
1045      name: "LayoutNG",
1046      implied_by: ["LayoutNGGrid", "BidiCaretAffinity", "LayoutNGTable"],
1047      status: "stable",
1048    },
1049    {
1050      name: "LayoutNGBlockFragmentation",
1051      implied_by: ["LayoutNGPrinting"],
1052    },
1053    {
1054      name: "LayoutNGFieldset",
1055      depends_on: ["LayoutNG"],
1056      status: "stable",
1057    },
1058    {
1059      name: "LayoutNGForControls",
1060      depends_on: ["LayoutNG"],
1061      status: "stable",
1062    },
1063    {
1064      name: "LayoutNGFragmentItem",
1065      implied_by: ["LayoutNGBlockFragmentation", "LayoutNGFragmentTraversal", "EditingNG"],
1066      status: "stable",
1067    },
1068    {
1069      // Traverse the fragment tree when painting and hit-testing, instead of
1070      // the layout object tree.
1071      name: "LayoutNGFragmentTraversal",
1072      implied_by: ["LayoutNGBlockFragmentation"],
1073    },
1074    {
1075      name: "LayoutNGGrid",
1076    },
1077    {
1078      name: "LayoutNGLayoutOverflow",
1079      depends_on: ["LayoutNG", "LayoutNGFragmentItem"],
1080      status: "stable",
1081    },
1082    {
1083      name: "LayoutNGPrinting",
1084    },
1085    {
1086      name: "LayoutNGTable",
1087    },
1088    {
1089      name: "LayoutNGTextControl",
1090      depends_on: ["EditingNG"],
1091      status: "experimental",
1092    },
1093    {
1094      name: "LayoutNGWebkitBox",
1095      status: "stable",
1096    },
1097    {
1098      name: "LazyFrameLoading",
1099      status: "stable",
1100    },
1101    {
1102      name: "LazyFrameVisibleLoadTimeMetrics",
1103    },
1104    {
1105      name: "LazyImageLoading",
1106      status: "stable",
1107    },
1108    {
1109      name: "LazyImageVisibleLoadTimeMetrics",
1110    },
1111    {
1112      name: "LazyInitializeMediaControls",
1113      // This is enabled by features::kLazyInitializeMediaControls.
1114    },
1115    {
1116      name: "LegacyWindowsDWriteFontFallback",
1117      // Enabled by features::kLegacyWindowsDWriteFontFallback;
1118    },
1119    {
1120      // TODO(crbug.com/1087043): Remove this once the feature has
1121      // landed and no compat issues are reported.
1122      name: "LinkDisabledNewSpecBehavior",
1123      status: "stable",
1124    },
1125    {
1126      name:"ManualSlotting",
1127      status:"stable",
1128    },
1129    {
1130      name: "MathMLCore",
1131      status:"experimental",
1132      depends_on: ["LayoutNG"],
1133    },
1134    {
1135      name:"MeasureMemory",
1136      origin_trial_feature_name: "MeasureMemory",
1137      status:"experimental",
1138    },
1139    {
1140      name: "MediaCapabilitiesDynamicRange",
1141      status: "test",
1142    },
1143    {
1144      name: "MediaCapabilitiesEncodingInfo",
1145      status: "experimental",
1146    },
1147    {
1148      name: "MediaCapabilitiesEncryptedMedia",
1149      status: "stable",
1150    },
1151    {
1152      name: "MediaCapabilitiesSpatialAudio",
1153      status: "test",
1154    },
1155    {
1156      name: "MediaCapture",
1157      status: {"Android": "stable"},
1158    },
1159    {
1160      name: "MediaCaptureDepthVideoKind",
1161      status: "experimental",
1162    },
1163    {
1164      name: "MediaCapturePanTilt",
1165      status: "stable",
1166    },
1167    // Set to reflect the MediaCastOverlayButton feature.
1168    {
1169      name: "MediaCastOverlayButton",
1170    },
1171    {
1172      name: "MediaControlsExpandGesture"
1173    },
1174    {
1175      name: "MediaControlsOverlayPlayButton",
1176      settable_from_internals: true,
1177      status: {"Android": "stable"},
1178    },
1179    {
1180      name: "MediaControlsUseCutOutByDefault",
1181      status: "stable",
1182    },
1183    {
1184      name: "MediaDocumentDownloadButton",
1185    },
1186    {
1187      name: "MediaElementVolumeGreaterThanOne",
1188    },
1189    // Set to reflect the kMediaEngagementBypassAutoplayPolicies feature.
1190    {
1191      name: "MediaEngagementBypassAutoplayPolicies",
1192    },
1193    // Media Feeds: https://wicg.github.io/media-feeds/
1194    // Set to reflect the kMediaFeeds feature.
1195    {
1196      name: "MediaFeeds",
1197      status: "experimental",
1198    },
1199    {
1200      name: "MediaLatencyHint",
1201      status: "test",
1202    },
1203    {
1204      name: "MediaPreservesPitch",
1205      status: "stable",
1206    },
1207    {
1208      name: "MediaQueryNavigationControls",
1209    },
1210    {
1211      name: "MediaSession",
1212      status: "stable",
1213    },
1214    {
1215      name: "MediaSessionPosition",
1216      status: "stable",
1217    },
1218    {
1219      name: "MediaSourceExperimental",
1220      status: "experimental",
1221    },
1222    {
1223      name: "MediaSourceInWorkers",
1224      status: "experimental",
1225    },
1226    {
1227      name: "MediaSourceNewAbortAndDuration",
1228      status: "experimental",
1229    },
1230    {
1231      // This is used in cases of mixed specification of stable and
1232      // experimental MediaSource features, such as in the IDL for an interface
1233      // constructor where exposure of the constructor in Window vs other
1234      // contexts can vary in stable vs experimental.
1235      name: "MediaSourceStable",
1236      status: "stable",
1237    },
1238    {
1239      name: "MediaStreamInsertableStreams",
1240      status: "experimental",
1241    },
1242    // This is enabled by default on Windows only. The only part that's
1243    // "experimental" is the support on other platforms.
1244    {
1245      name: "MiddleClickAutoscroll",
1246      status: "test",
1247    },
1248    {
1249
1250      name: "MobileLayoutTheme",
1251    },
1252    {
1253      name: "ModuleServiceWorker",
1254      status: "test",
1255    },
1256    {
1257      name: "ModuleSharedWorker",
1258      status: "stable",
1259    },
1260    {
1261      name: "MojoJS",
1262      status: "test",
1263    },
1264    // MojoJSTest is used exclusively in testing environments, whereas MojoJS
1265    // may also be used elsewhere.
1266    {
1267      name: "MojoJSTest",
1268      status: "test",
1269    },
1270    {
1271      // When enabled, iframes are not capturing mouse events by default.
1272      name: "MouseSubframeNoImplicitCapture",
1273    },
1274    {
1275      // Named pages for pagination (the "page" CSS property).
1276      name: "NamedPages",
1277      status: "stable",
1278    },
1279    {
1280      // Also enabled when blink::features::kNativeFileSystemAPI is overridden
1281      // on the command line (or via chrome://flags).
1282      name: "NativeFileSystem",
1283      status: {"Android": "test", "default": "stable"},
1284      // TODO(mek): Remove origin trial integration.
1285      origin_trial_feature_name: "NativeFileSystem2",
1286      origin_trial_os: ["win", "mac", "linux", "chromeos"],
1287    },
1288    {
1289      name: "NativeIO",
1290      status: "experimental",
1291    },
1292    {
1293      name: "NavigatorContentUtils",
1294      // Android does not yet support NavigatorContentUtils.
1295      status: {"Android": "", "default": "stable"},
1296    },
1297    {
1298      // Allows the navigator.language and navigator.languages APIs in insecure
1299      // contexts, which https://github.com/WICG/lang-client-hint proposes that
1300      // we deprecate.
1301      name: "NavigatorLanguageInInsecureContext",
1302      settable_from_internals: true,
1303      status: "stable",
1304    },
1305    {
1306      name: "NetInfoDownlinkMax",
1307      // Only Android, ChromeOS support NetInfo downlinkMax, type and ontypechange now
1308      status: {"Android": "stable", "ChromeOS": "stable", "default": "experimental"},
1309    },
1310    {
1311      name: "NeverSlowMode",
1312    },
1313    {
1314      name: "NewCanvas2DAPI",
1315      status: "experimental",
1316    },
1317    // Not a web exposed feature, enabled from the command line.
1318    {
1319      name: "NewRemotePlaybackPipeline",
1320    },
1321    {
1322      name: "NoIdleEncodingForWebTests",
1323      status: "test",
1324    },
1325    {
1326      name: "NotificationConstructor",
1327      // Android won't be able to reliably support non-persistent notifications, the
1328      // intended behavior for which is in flux by itself.
1329      status: {"Android": "", "default": "stable"},
1330    },
1331    // NotificationContentImage is not available in all platforms
1332    // The Notification Center on Mac OS X does not support content images.
1333    {
1334      name: "NotificationContentImage",
1335      status: {"Mac": "test", "default": "stable"},
1336    },
1337    {
1338      name: "Notifications",
1339      status: "stable",
1340    },
1341    {
1342      name: "NotificationTriggers",
1343      origin_trial_feature_name: "NotificationTriggers",
1344      status: "experimental",
1345    },
1346    {
1347      name: "OffMainThreadCSSPaint",
1348      status: "stable",
1349    },
1350    {
1351      name: "OffscreenCanvasCommit",
1352      status: "experimental",
1353    },
1354    {
1355      name: "OnDeviceChange",
1356      // Android does not yet support SystemMonitor.
1357      status: {"Android": "", "default": "stable"},
1358    },
1359    {
1360      name: "OrientationEvent",
1361      status: {"Android": "stable"},
1362    },
1363    {
1364      name: "OriginIsolationHeader",
1365      origin_trial_feature_name: "OriginIsolationHeader",
1366      status: "experimental",
1367    },
1368    {
1369      name: "OriginPolicy",
1370      status: "experimental",
1371    },
1372
1373    // Define a sample API for testing integration with the Origin Trials
1374    // Framework. The sample API is used in both unit and web tests for the
1375    // Origin Trials Framework. Do not change this flag to stable, as it exists
1376    // solely to generate code used by the sample API implementation.
1377    {
1378      name: "OriginTrialsSampleAPI",
1379      origin_trial_feature_name: "Frobulate",
1380    },
1381    // As above. Do not change this flag to stable, as it exists solely to
1382    // generate code used by the origin trials sample API implementation.
1383    // TODO(yashard): Add tests for this feature.
1384    {
1385      name: "OriginTrialsSampleAPIDependent",
1386      depends_on: ["OriginTrialsSampleAPI"],
1387    },
1388    // As above. Do not change this flag to stable, as it exists solely to
1389    // generate code used by the origin trials sample API implementation.
1390    {
1391      name: "OriginTrialsSampleAPIDeprecation",
1392      origin_trial_feature_name: "FrobulateDeprecation",
1393      origin_trial_type: "deprecation",
1394      origin_trial_allows_insecure: true,
1395    },
1396    // As above. Do not change this flag to stable, as it exists solely to
1397    // generate code used by the origin trials sample API implementation.
1398    {
1399      name: "OriginTrialsSampleAPIImplied",
1400      origin_trial_feature_name: "FrobulateImplied",
1401      implied_by: ["OriginTrialsSampleAPI", "OriginTrialsSampleAPIInvalidOS"],
1402    },
1403    // As above. Do not change this flag to stable, as it exists solely to
1404    // generate code used by the origin trials sample API implementation.
1405    {
1406      name: "OriginTrialsSampleAPIInvalidOS",
1407      origin_trial_feature_name: "FrobulateInvalidOS",
1408      origin_trial_os: ["invalid"],
1409    },
1410    // As above. Do not change this flag to stable, as it exists solely to
1411    // generate code used by the origin trials sample API implementation.
1412    {
1413      name: "OriginTrialsSampleAPINavigation",
1414      origin_trial_feature_name: "FrobulateNavigation",
1415    },
1416    // As above. Do not change this flag to stable, as it exists solely to
1417    // generate code used by the origin trials sample API implementation.
1418    {
1419      name: "OriginTrialsSampleAPIThirdParty",
1420      origin_trial_feature_name: "FrobulateThirdParty",
1421      origin_trial_allows_third_party: true,
1422    },
1423    {
1424      name: "OverflowClip",
1425      status: "test",
1426    },
1427    {
1428      name: "OverscrollCustomization",
1429      settable_from_internals: true,
1430      status: "experimental",
1431    },
1432    // The following are developer opt-outs and opt-ins for page freezing. If
1433    // neither is specified then heuristics will be applied to determine whether
1434    // the page is eligible.
1435    {
1436      name: "PageFreezeOptIn",
1437      origin_trial_feature_name: "PageFreezeOptIn",
1438    },
1439    {
1440      name: "PageFreezeOptOut",
1441      origin_trial_feature_name: "PageFreezeOptOut",
1442    },
1443    {
1444      name: "PagePopup",
1445      // Android does not have support for PagePopup
1446      status: {"Android": "", "default": "stable"},
1447    },
1448    {
1449      name: "PaintUnderInvalidationChecking",
1450      settable_from_internals: true,
1451    },
1452    {
1453      name: "ParentNodeReplaceChildren",
1454      status: "stable",
1455    },
1456    {
1457      // This flag enables the Manifest parser to handle URL Protocols.
1458      name: "ParseUrlProtocolHandler",
1459      status: "test",
1460    },
1461    {
1462      name: "PassPaintVisualRectToCompositor",
1463    },
1464    // This is to add an option to enable the Reveal button on password inputs while waiting ::reveal gets standardized.
1465    {
1466      name: "PasswordReveal",
1467    },
1468    {
1469      name: "PaymentApp",
1470      status: "experimental",
1471    },
1472    {
1473      name: "PaymentHandlerChangePaymentMethod",
1474      status: "stable",
1475    },
1476    {
1477      name: "PaymentHandlerHandlesShippingAndContact",
1478      status: "stable",
1479    },
1480    {
1481      name: "PaymentHandlerMinimalUI",
1482      status: "experimental",
1483    },
1484    {
1485      name: "PaymentMethodChangeEvent",
1486      status: "stable",
1487    },
1488    // PaymentRequest is enabled by default on Android
1489    {
1490      name: "PaymentRequest",
1491      status: "experimental",
1492    },
1493    {
1494      name: "PaymentRequestMerchantValidationEvent",
1495      status: "experimental",
1496    },
1497    {
1498      name: "PaymentRetry",
1499      status: "stable",
1500    },
1501    {
1502      name: "PercentBasedScrolling",
1503      settable_from_internals: true,
1504    },
1505    {
1506      name: "PerformanceManagerInstrumentation",
1507    },
1508    {
1509      name: "PeriodicBackgroundSync",
1510      status: "stable",
1511    },
1512    {
1513      name: "PerMethodCanMakePaymentQuota",
1514      origin_trial_feature_name: "PerMethodCanMakePaymentQuota",
1515      status: "experimental",
1516    },
1517    {
1518      name: "PermissionDelegation",
1519      status: "test",
1520    },
1521    {
1522      name: "Permissions",
1523      status: "stable",
1524    },
1525    {
1526      name: "PermissionsPolicyHeader",
1527      status: "stable"
1528    },
1529    {
1530      name: "PermissionsRequestRevoke",
1531      status: "experimental",
1532    },
1533    {
1534      name: "PictureInPicture",
1535      settable_from_internals: true,
1536    },
1537    // Picture-in-Picture API is disabled by default on Android.
1538    {
1539      name: "PictureInPictureAPI",
1540      status: {"Android": "", "default": "stable"},
1541    },
1542    {
1543      name: "PictureInPictureV2",
1544      depends_on: ["PictureInPictureAPI"],
1545      settable_from_internals: true,
1546    },
1547    // This is a reverse OT used for a phased deprecation.
1548    // https://crbug.com/918374
1549    {
1550      name: "PNaCl",
1551      origin_trial_feature_name: "PNaCl",
1552    },
1553    {
1554      name: "PointerLockOptions",
1555      origin_trial_feature_name: "PointerLockOptions",
1556      status: 'experimental',
1557    },
1558    {
1559      name: "PointerRawUpdate",
1560      status: "stable",
1561    },
1562    {
1563      name: "Portals",
1564      // Portals must be enabled by blink::features::kPortals as we require the
1565      // support of the browser process to enable the feature. Enabling this
1566      // feature specifically within blink has no effect. An experimental/test
1567      // status can only be set here if the default of blink::features::kPortals
1568      // allows for it.
1569      status: {"Android": "experimental"},
1570      origin_trial_feature_name: "Portals",
1571      origin_trial_os: ["android"],
1572    },
1573    {
1574      name: "PreciseMemoryInfo",
1575    },
1576    // Prefer not using composited scrolling. Composited scrolling will still
1577    // be used if there are other reasons forcing compositing. For consistency,
1578    // any code calling Settings::GetPreferCompositingToLCDTextEnabled() should
1579    // ensure that this flag overrides the setting.
1580    {
1581      name: "PreferNonCompositedScrolling",
1582      settable_from_internals: true,
1583    },
1584    {
1585      name: "PrefersContrast",
1586      depends_on: ["ForcedColors"],
1587    },
1588    {
1589      name: 'PrefersReducedData',
1590      status: 'experimental',
1591    },
1592    // This feature is deprecated and we are evangelizing affected sites.
1593    // See https://crbug.com/346236 for current status.
1594    {
1595      name: "PrefixedVideoFullscreen",
1596      status: "stable",
1597    },
1598    {
1599      name: "Presentation",
1600      status: "stable",
1601    },
1602    {
1603      name: "PriorityHints",
1604      origin_trial_feature_name: "PriorityHints",
1605      status: "experimental",
1606    },
1607    {
1608      name: "PushMessaging",
1609      status: "stable",
1610    },
1611    {
1612      name: "PushMessagingSubscriptionChange",
1613      status: "experimental",
1614    },
1615    {
1616      name: "QuicTransport",
1617      origin_trial_feature_name: "QuicTransport",
1618      status: "experimental",
1619    },
1620    {
1621      name: "QuotaChange",
1622      status: "experimental",
1623    },
1624    {
1625      // Enabled when blink::features::kRawClipboard is enabled.
1626      name: "RawClipboard",
1627    },
1628    {
1629      name: "ReadableByteStream",
1630    },
1631    {
1632      name: "RemotePlayback",
1633      status: "stable",
1634    },
1635    {
1636      name: "RemotePlaybackBackend",
1637      settable_from_internals: true,
1638      // Tracking bug for the implementation: https://crbug.com/728609
1639      status: {"Android": "stable", "default": ""},
1640    },
1641    {
1642      // See https://crbug.com/1012063
1643      name: "RequestVideoFrameCallback",
1644      status: "stable",
1645    },
1646    {
1647      name: "ResizeObserverUpdates",
1648      status: "stable",
1649    },
1650    {
1651      name: "RestrictAutomaticLazyFrameLoadingToDataSaver",
1652      depends_on: ["AutomaticLazyFrameLoading"],
1653      status: "stable",
1654    },
1655    {
1656      name: "RestrictAutomaticLazyImageLoadingToDataSaver",
1657      depends_on: ["AutomaticLazyImageLoading"],
1658      status: "stable",
1659    },
1660    {
1661      name: "RestrictGamepadAccess",
1662      status: "experimental",
1663    },
1664    {
1665      name: "RTCAdaptivePtime",
1666      origin_trial_feature_name: "RTCAdaptivePtime",
1667      status: "experimental",
1668    },
1669    {
1670      name: "RtcAudioJitterBufferMaxPackets",
1671      origin_trial_feature_name: "RtcAudioJitterBufferMaxPackets",
1672      status: "experimental",
1673    },
1674    {
1675      name: "RtcAudioJitterBufferRtxHandling",
1676      origin_trial_feature_name: "RtcAudioJitterBufferRtxHandling",
1677      status: "experimental",
1678    },
1679    // Enables the use of the RTCIceTransport with extensions.
1680    {
1681      name: "RTCIceTransportExtension",
1682      origin_trial_feature_name: "RTCQuicTransport",
1683      status: "experimental",
1684    },
1685    // Enables the use of the Insertable Streams legacy API.
1686    // TODO(https://crbug.com/1119801): Remove when the origin trial ends.
1687    {
1688      name: "RTCInsertableStreams",
1689      origin_trial_feature_name: "RTCInsertableStreams",
1690      status: "experimental",
1691    },
1692    // Enables the use of the RTCQuicTransport object.
1693    {
1694      name: "RTCQuicTransport",
1695      origin_trial_feature_name: "RTCQuicTransport",
1696      status: "experimental",
1697    },
1698    // Enables the use of |RTCRtpTransceiver::stop()|
1699    {
1700      name: "RTCRtpTransceiverStop",
1701      status: "stable",
1702    },
1703    {
1704      name: "RTCStatsRelativePacketArrivalDelay",
1705      origin_trial_feature_name: "RTCStatsRelativePacketArrivalDelay",
1706      status: "experimental",
1707    },
1708    // Enables the use of SVC scalability mode in WebRTC.
1709    // Spec: https://w3c.github.io/webrtc-svc/
1710    {
1711      name: "RTCSvcScalabilityMode",
1712      status: "experimental",
1713    },
1714    // Enables the use of |RTCConfiguration::sdpSemantics| to override the
1715    // default SDP semantics at RTCPeerConnection construction.
1716    {
1717      name: "RTCUnifiedPlan",
1718      status: "stable",
1719    },
1720    // Overrides the default SDP semantics to be Unified Plan at
1721    // RTCPeerConnection construction (unless otherwise specified).
1722    {
1723      name: "RTCUnifiedPlanByDefault",
1724    },
1725    {
1726      name: "SameSiteByDefaultCookies",
1727      status: "test",
1728    },
1729    {
1730      name: "SanitizerAPI",
1731      status: "test",
1732    },
1733    {
1734      name: "ScreenWakeLock",
1735      status: "stable",
1736    },
1737    // WebSpeech API with both speech recognition and synthesis functionality
1738    // is not fully enabled on all platforms.
1739    {
1740      name: "ScriptedSpeechRecognition",
1741      status: "stable",
1742    },
1743    {
1744      name: "ScriptedSpeechSynthesis",
1745      status: "stable",
1746    },
1747    {
1748      name: "ScrollbarGutter",
1749      status: "experimental",
1750    },
1751    {
1752      name: "ScrollbarWidth",
1753      status: "test",
1754    },
1755    {
1756      name: "ScrollCustomization",
1757    },
1758    {
1759      name: "ScrollSnapAfterLayout",
1760      status: "stable",
1761    },
1762    {
1763      name: "ScrollTimeline",
1764      status: "experimental",
1765      implied_by: ['AnimationWorklet', 'CSSScrollTimeline']
1766    },
1767    // Implements documentElement.scrollTop/Left and bodyElement.scrollTop/Left
1768    // as per the spec, matching other Web engines.
1769    {
1770      name: "ScrollTopLeftInterop",
1771      status: "stable",
1772    },
1773    {
1774      name: "ScrollUnification",
1775    },
1776    {
1777      name: "SecurePaymentConfirmation",
1778      origin_trial_feature_name: "SecurePaymentConfirmation",
1779      origin_trial_os: ["mac"],
1780      status: "experimental",
1781    },
1782    {
1783      name: "SecurePaymentConfirmationDebug",
1784    },
1785    {
1786      name: "SendBeaconThrowForBlobWithNonSimpleType",
1787      status: "stable",
1788    },
1789    {
1790      name: "SendMouseEventsDisabledFormControls",
1791      status: "experimental",
1792    },
1793    {
1794      name: "SensorExtraClasses",
1795      status: "experimental",
1796    },
1797    {
1798      name: "Serial",
1799      origin_trial_feature_name: "Serial",
1800      status: {"Android": "", "default": "experimental"},
1801    },
1802    {
1803      name: "ServiceWorkerClientLifecycleState",
1804      status: "experimental",
1805    },
1806    {
1807      name: "ServiceWorkerFetchEventWorkerTiming",
1808      status: "experimental",
1809    },
1810    // TODO(937746): Web Components v0 is disabled by default, and will be
1811    // removed after M87.
1812    {
1813      name: "ShadowDOMV0",
1814      status: "test",
1815    },
1816      {
1817      name: "SharedArrayBuffer",
1818      status: "stable",
1819    },
1820    {
1821      name: "SharedWorker",
1822      // Android does not yet support SharedWorker. crbug.com/154571
1823      status: {"Android": "", "default": "stable"},
1824    },
1825    {
1826      name: "SignatureBasedIntegrity",
1827      origin_trial_feature_name: "SignatureBasedIntegrity",
1828      status: "experimental",
1829    },
1830    {
1831      name: "SignedExchangePrefetchCacheForNavigations",
1832      status: "experimental",
1833    },
1834    {
1835      name: "SignedExchangeSubresourcePrefetch",
1836      origin_trial_feature_name: "SignedExchangeSubresourcePrefetch",
1837      status: "experimental",
1838    },
1839    {
1840      name: "SkipAd",
1841      depends_on: ["MediaSession"],
1842      origin_trial_feature_name: "SkipAd",
1843      status: "experimental",
1844    },
1845    {
1846      name: "SkipTouchEventFilter",
1847      settable_from_internals: true,
1848    },
1849    {
1850      name: "SrcsetMaxDensity",
1851    },
1852    // Used as argument in attribute of stable-release functions/interfaces
1853    // where a runtime-enabled feature name is required for correct IDL syntax.
1854    // This is a global flag; do not change its status.
1855    {
1856      name: "StableBlinkFeatures",
1857      status: "stable",
1858    },
1859    {
1860      // Enabled when blink::features::kStorageAccessAPI is enabled.
1861      name: "StorageAccessAPI",
1862      status: "test",
1863    },
1864    {
1865      name: "StrictMimeTypesForWorkers",
1866      status: "experimental"
1867    },
1868    {
1869      name: "SubresourceWebBundles",
1870      origin_trial_feature_name: "SubresourceWebBundles",
1871      origin_trial_allows_third_party: true,
1872      status: "test"
1873    },
1874    {
1875      name: "SurfaceEmbeddingFeatures",
1876      status: "stable",
1877    },
1878    {
1879      name: "SystemWakeLock",
1880      status: "experimental",
1881    },
1882    {
1883      name: "TableCellNewPercents",
1884      depends_on: ["LayoutNG"],
1885      status: "stable",
1886    },
1887    {
1888      // TODO(crbug.com/898942): Remove this in Chrome 95.
1889      name: "TargetBlankImpliesNoOpener",
1890      status: "stable",
1891    },
1892    // For unit tests.
1893    {
1894      name: "TestFeature",
1895    },
1896    // For unit tests.
1897    {
1898      name: "TestFeatureDependent",
1899      depends_on: ["TestFeatureImplied"],
1900    },
1901    // For unit tests.
1902    {
1903      name: "TestFeatureImplied",
1904      implied_by: ["TestFeature"],
1905    },
1906    {
1907      name: "TextDetector",
1908      status: "experimental",
1909    },
1910    {
1911      name: "TextFragmentIdentifiers",
1912      origin_trial_feature_name: "TextFragmentIdentifiers",
1913      status: "stable",
1914    },
1915    {
1916      name: "ThirdPartyOriginTrials",
1917      status: "stable",
1918    },
1919    {
1920      name: "TimerThrottlingForBackgroundTabs",
1921      status: "stable",
1922    },
1923    {
1924      name: "TimerThrottlingForHiddenFrames",
1925      status: "stable",
1926    },
1927    {
1928      name: "TimeZoneChangeEvent",
1929      status: "experimental",
1930    },
1931    // Many websites disable mouse support when touch APIs are available.  We'd
1932    // like to enable this always but can't until more websites fix this bug.
1933    // Chromium sets this conditionally (eg. based on the presence of a
1934    // touchscreen) in ApplyWebPreferences. "Touch events" themselves are always
1935    // enabled since they're a feature always supported by Chrome.
1936    {
1937      name: "TouchEventFeatureDetection",
1938      origin_trial_feature_name: "ForceTouchEventFeatureDetectionForInspector",
1939      status: "stable",
1940    },
1941    {
1942      name: "TransferableStreams",
1943      status: "stable",
1944      origin_trial_feature_name: "RTCInsertableStreams",
1945      implied_by: ["RTCInsertableStreams"],
1946    },
1947    // When enabled, enforces new interoperable semantics for 3D transforms.
1948    // See crbug.com/1008483.
1949    {
1950      name: "TransformInterop",
1951    },
1952    // This is conditionally set if the platform supports translation.
1953    {
1954      name: "TranslateService"
1955    },
1956    {
1957      name: "TrustedDOMTypes",
1958      status: "stable",
1959    },
1960    {
1961      name: "TrustedTypeBeforePolicyCreationEvent",
1962      status: "experimental",
1963    },
1964    {
1965      name: "TrustedTypesUseCodeLike",
1966      status: "experimental",
1967    },
1968    {
1969      name: "TrustTokens",
1970      origin_trial_feature_name: "TrustTokens",
1971      origin_trial_allows_third_party: true,
1972      status: "test",
1973    },
1974    {
1975      // Always allow trust token issuance (so long as the base::Feature
1976      // is enabled). Used for testing; circumvents a runtime check that,
1977      // if this RuntimeEnabledFeature is not present, guarantees the origin
1978      // trial is enabled.
1979      name: "TrustTokensAlwaysAllowIssuance",
1980      status: "test",
1981    },
1982    {
1983      name: "UnclosedFormControlIsInvalid",
1984      status: "experimental",
1985    },
1986    {
1987      name: "UnderlineOffsetThickness",
1988      status: "stable",
1989    },
1990    {
1991      name: "UnoptimizedImagePolicies",
1992      status: "experimental",
1993      origin_trial_feature_name: "UnoptimizedImagePolicies",
1994      implied_by: ["ExperimentalProductivityFeatures"]
1995    },
1996    {
1997      name: "UnsizedMediaPolicy",
1998      status: "experimental",
1999      origin_trial_feature_name: "UnsizedMediaPolicy",
2000      implied_by: ["ExperimentalProductivityFeatures"]
2001    },
2002    {
2003      name: "UserActivationSameOriginVisibility",
2004    },
2005    {
2006      name: "UserAgentClientHint",
2007      status: "experimental",
2008    },
2009    {
2010      name: "V8IdleTasks",
2011    },
2012    {
2013      // Whether a video element should automatically play fullscreen unless
2014      // 'playsinline' is set.
2015      name: "VideoAutoFullscreen",
2016      settable_from_internals: true,
2017    },
2018    {
2019      name: "VideoFullscreenOrientationLock",
2020    },
2021    {
2022      name: "VideoPlaybackQuality",
2023      status: "stable",
2024    },
2025    {
2026      name: "VideoRotateToFullscreen",
2027    },
2028    {
2029      name: "VideoWakeLockOptimisationHiddenMuted",
2030      status: "stable",
2031    },
2032    {
2033      name: "VirtualKeyboard",
2034      status: "test",
2035    },
2036    {
2037      name: "VisibilityCollapseColumn",
2038    },
2039    {
2040      name: "VisibilityStateEntry",
2041      status: "experimental",
2042    },
2043    {
2044      name: "WakeLock",
2045      origin_trial_feature_name: "WakeLock",
2046      implied_by: ['ScreenWakeLock', 'SystemWakeLock'],
2047    },
2048    {
2049      name: "WebAnimationsAPI",
2050      status: "stable",
2051      implied_by: ['AnimationWorklet']
2052    },
2053    {
2054      name: "WebAnimationsSVG",
2055      status: "experimental",
2056    },
2057    {
2058      name: "WebAppManifestDisplayOverride",
2059    },
2060    {
2061      name: "WebAppWindowControlsOverlay",
2062    },
2063    {
2064      name: "WebAssemblySimd",
2065      origin_trial_feature_name: "WebAssemblySimd",
2066      status: "experimental",
2067    },
2068    {
2069      name: "WebAssemblyThreads",
2070      origin_trial_feature_name: "WebAssemblyThreads",
2071      status: "experimental",
2072    },
2073    // WebAuth is disabled on Android versions prior to N (7.0) due to lack of
2074    // supporting APIs, see runtime_features.cc.
2075    {
2076      name: "WebAuth",
2077      status: "stable",
2078    },
2079    {
2080      name: "WebAuthenticationGetAssertionFeaturePolicy",
2081      status: "experimental",
2082    },
2083    {
2084      name: "WebAuthenticationLargeBlobExtension",
2085      status: "experimental",
2086    },
2087    {
2088      name: "WebAuthenticationResidentKeyRequirement",
2089      status: "experimental",
2090    },
2091    // WebBluetooth is enabled by default on Android, ChromeOS and Mac.
2092    // It is also supported in Windows 10 which is handled in runtime_features.cc
2093    {
2094      name: "WebBluetooth",
2095      status: {
2096        "Android": "stable",
2097        "ChromeOS": "stable",
2098        "Mac": "stable",
2099        "default": "experimental",
2100      },
2101    },
2102    {
2103      name: "WebBluetoothGetDevices",
2104      status: "experimental",
2105    },
2106    {
2107      name: "WebBluetoothRemoteCharacteristicNewWriteValue",
2108      status: {
2109        "Android": "stable",
2110        "ChromeOS": "stable",
2111        "Mac": "stable",
2112        "default": "experimental",
2113      },
2114    },
2115    {
2116      name: "WebBluetoothScanning",
2117      status: "experimental",
2118    },
2119    {
2120      name: "WebBluetoothWatchAdvertisements",
2121      status: "experimental",
2122    },
2123    {
2124      name: "WebCodecs",
2125      status: "experimental",
2126      origin_trial_feature_name: "WebCodecs"
2127    },
2128    {
2129      name: "WebCryptoCurve25519",
2130      status: "experimental",
2131    },
2132    {
2133      name: "WebGLDraftExtensions",
2134      status: "experimental",
2135    },
2136    {
2137      name: "WebGLImageChromium",
2138    },
2139    // WebGPU adds a large attack surface area to the GPU process and allows
2140    // running arbitrary programs on the GPU (compute shaders), which may
2141    // perform arbitrary read/writes of GPU memory if not properly sandboxed.
2142    // That's why it is not enabled as part of the
2143    // --enable-experimental-web-platform-features flag.
2144    {
2145      name: "WebGPU",
2146    },
2147    {
2148      name: "WebHID",
2149      origin_trial_feature_name: "WebHID",
2150      status: {"Android": "", "default": "experimental"},
2151    },
2152    {
2153      name: "WebID",
2154    },
2155    {
2156      name: "WebNFC",
2157      origin_trial_feature_name: "WebNFC",
2158      origin_trial_os: ["android"],
2159      status: "experimental",
2160    },
2161    {
2162      name: "WebOTP",
2163      status: {"default": "experimental", "Android": "stable"},
2164    },
2165    {
2166      name: "WebScheduler",
2167      origin_trial_feature_name: "WebScheduler",
2168      status: "experimental",
2169    },
2170    // WebShare is enabled by default on Android.
2171    {
2172      name: "WebShare",
2173      status: "test",
2174    },
2175    {
2176      name: "WebSocketStream",
2177      status: "experimental",
2178    },
2179    {
2180      name: "WebUSB",
2181      status: "stable",
2182    },
2183    {
2184      name: "WebUSBOnDedicatedWorkers",
2185      status: "stable",
2186      depends_on: ["WebUSB"],
2187    },
2188    {
2189      name: "WebVTTRegions",
2190      status: "experimental",
2191    },
2192    {
2193      name: "WebXR",
2194      status: "stable",
2195    },
2196    {
2197      name: "WebXRAnchors",
2198      depends_on: ["WebXRARModule", "WebXRHitTest"],
2199      status: "stable"
2200    },
2201    {
2202      name: "WebXRARModule",
2203      depends_on: ["WebXR"],
2204      status: "stable",
2205    },
2206    {
2207      name: "WebXRCameraAccess",
2208      depends_on: ["WebXRARModule"],
2209      status: "experimental",
2210    },
2211    {
2212      name: "WebXRDepth",
2213      origin_trial_feature_name: "WebXRDepth",
2214      depends_on: ["WebXRARModule"],
2215      status: "experimental",
2216    },
2217    {
2218      name: "WebXRHitTest",
2219      depends_on: ["WebXRARModule"],
2220      status: "stable",
2221    },
2222    {
2223      name: "WebXRHitTestEntityTypes",
2224      depends_on: ["WebXRHitTest"],
2225      status: "experimental"
2226    },
2227    {
2228      name: "WebXRImageTracking",
2229      depends_on: ["WebXRARModule"],
2230      status: "experimental",
2231    },
2232    {
2233      name: "WebXRLightEstimation",
2234      origin_trial_feature_name: "WebXRLightEstimation",
2235      depends_on: ["WebXRARModule"],
2236      status: "experimental",
2237    },
2238    {
2239      name: "WebXRMultiGpu",
2240      depends_on: ["WebXR"],
2241      // Enabled when blink::features::kWebXrMultiGpu is enabled.
2242      status: "stable",
2243    },
2244    {
2245      name: "WebXRPlaneDetection",
2246      depends_on: ["WebXRARModule"],
2247      status: "experimental",
2248    },
2249    {
2250      name: "WebXRViewportScale",
2251      depends_on: ["WebXRARModule"],
2252      status: "experimental",
2253    },
2254    {
2255      name: "WheelEventRegions",
2256    },
2257    // Extends window placement functionality for multi-screen devices. Also
2258    // exposes requisite information about displays connected to the device.
2259    {
2260      name: "WindowPlacement",
2261      origin_trial_feature_name: "WindowPlacement",
2262      status: "experimental",
2263    },
2264    {
2265      name: "WindowSegments",
2266      status: "experimental",
2267    },
2268    {
2269      name: "XSLT",
2270      status: "stable",
2271    },
2272  ],
2273}
2274