// Copyright 2024 The Chromium Authors
// 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/use_counter/webdx_feature_maps.h"

#include "base/no_destructor.h"

namespace blink {

using WebFeature = blink::mojom::WebFeature;
using WebDXFeature = blink::mojom::WebDXFeature;
using CSSSampleId = blink::mojom::CSSSampleId;

const base::flat_map<WebFeature, WebDXFeature>&
GetWebFeatureToWebDXFeatureMap() {
  static const base::NoDestructor<
      const base::flat_map<WebFeature, WebDXFeature>>
      kMap{{
          {WebFeature::kViewTransition, WebDXFeature::kViewTransitions},
          {WebFeature::kValidPopoverAttribute, WebDXFeature::kPopover},
          {WebFeature::kCSSSubgridLayout, WebDXFeature::kSubgrid},
          {WebFeature::kCSSCascadeLayers, WebDXFeature::kCascadeLayers},
          // If the compression or decompression stream constructors were
          // invoked, WebDXFeature::count that as the CompressionStreams WebDX
          // feature being used.
          {WebFeature::kCompressionStreamConstructor,
           WebDXFeature::kCompressionStreams},
          {WebFeature::kDecompressionStreamConstructor,
           WebDXFeature::kCompressionStreams},
          {WebFeature::kAVIFImage, WebDXFeature::kAvif},
          {WebFeature::kBlockingAttributeRenderToken,
           WebDXFeature::kBlockingRender},
          {WebFeature::kV8BroadcastChannel_Constructor,
           WebDXFeature::kBroadcastChannel},
          {WebFeature::kCanvasRenderingContext2DContextLostEvent,
           WebDXFeature::kCanvasContextLost},
          {WebFeature::kCSSCascadeLayers, WebDXFeature::kCascadeLayers},
          {WebFeature::kPressureObserver_Constructor,
           WebDXFeature::kComputePressure},
          {WebFeature::kAdoptedStyleSheets,
           WebDXFeature::kConstructedStylesheets},
          {WebFeature::kCSSAtRuleContainer, WebDXFeature::kContainerQueries},
          {WebFeature::kCSSStyleContainerQuery,
           WebDXFeature::kContainerStyleQueries},
          {WebFeature::kCSSAtRuleCounterStyle, WebDXFeature::kCounterStyle},
          {WebFeature::kCreateCSSModuleScript, WebDXFeature::kCssModules},
          {WebFeature::kCreateTextModuleScript, WebDXFeature::kTextModules},
          {WebFeature::kStreamingDeclarativeShadowDOM,
           WebDXFeature::kDeclarativeShadowDom},
          {WebFeature::kHTMLPositionalSetters,
           WebDXFeature::kDRAFT_HTMLSetterMethods},
          {WebFeature::kHTMLStreaming, WebDXFeature::kDRAFT_HTMLStreamMethods},
          {WebFeature::kShowPickerSelect, WebDXFeature::kShowPickerSelect},
          {WebFeature::kHTMLDetailsElementNameAttribute,
           WebDXFeature::kDetailsName},
          {WebFeature::kHTMLFencedFrameElement, WebDXFeature::kFencedframe},
          {WebFeature::kHTMLUnsafeMethods, WebDXFeature::kParseHtmlUnsafe},
          {WebFeature::kCloseWatcherScriptConstructor,
           WebDXFeature::kClosewatcher},
          {WebFeature::kHTMLSearchElement, WebDXFeature::kSearch},
          {WebFeature::kDialogElement, WebDXFeature::kDialog},
          {WebFeature::kV8DocumentPictureInPicture_RequestWindow_Method,
           WebDXFeature::kDocumentPictureInPicture},
          {WebFeature::kFlexGapSpecified, WebDXFeature::kFlexboxGap},
          {WebFeature::kCSSFlexibleBox, WebDXFeature::kFlexbox},
          {WebFeature::kCSSSelectorPseudoFocusVisible,
           WebDXFeature::kFocusVisible},
          {WebFeature::kCSSGridLayout, WebDXFeature::kGrid},
          {WebFeature::kCSSSelectorPseudoHas, WebDXFeature::kHas},
          {WebFeature::kCSSSelectorPseudoHasSlotted, WebDXFeature::kHasSlotted},
          {WebFeature::kIdleDetectionStart, WebDXFeature::kIdleDetection},
          {WebFeature::kImportMap, WebDXFeature::kImportMaps},
          {WebFeature::kIntersectionObserverV2,
           WebDXFeature::kIntersectionObserverV2},
          {WebFeature::kIntersectionObserver_Constructor,
           WebDXFeature::kIntersectionObserver},
          {WebFeature::kCSSSelectorPseudoIs, WebDXFeature::kIs},
          {WebFeature::kPrepareModuleScript, WebDXFeature::kJsModules},
          {WebFeature::kInstantiateModuleScript, WebDXFeature::kJsModules},
          {WebFeature::kV8MediaSession_Metadata_AttributeSetter,
           WebDXFeature::kMediaSession},
          {WebFeature::kOffscreenCanvas, WebDXFeature::kOffscreenCanvas},
          {WebFeature::kV8StorageManager_GetDirectory_Method,
           WebDXFeature::kOriginPrivateFileSystem},
          {WebFeature::kV8Window_FetchLater_Method, WebDXFeature::kFetchlater},
          {WebFeature::kV8Window_ShowOpenFilePicker_Method,
           WebDXFeature::kFileSystemAccess},
          {WebFeature::kV8Window_ShowSaveFilePicker_Method,
           WebDXFeature::kFileSystemAccess},
          {WebFeature::kV8Window_ShowDirectoryPicker_Method,
           WebDXFeature::kFileSystemAccess},
          {WebFeature::kV8HTMLVideoElement_RequestPictureInPicture_Method,
           WebDXFeature::kPictureInPicture},
          {WebFeature::kV8HTMLVideoElement_GetVideoPlaybackQuality_Method,
           WebDXFeature::kMediaPlaybackQuality},
          {WebFeature::kV8Window_QueryLocalFonts_Method,
           WebDXFeature::kLocalFonts},
          {WebFeature::kElementRequestPointerLock, WebDXFeature::kPointerLock},
          {WebFeature::kCSSRelativeColor, WebDXFeature::kRelativeColor},
          {WebFeature::kCSSAtRuleScope, WebDXFeature::kScope},
          {WebFeature::kScrollend, WebDXFeature::kScrollend},
          {WebFeature::kTextFragmentAnchor,
           WebDXFeature::kScrollToTextFragment},
          {WebFeature::kV8HTMLInputElement_ShowPicker_Method,
           WebDXFeature::kShowPickerInput},
          {WebFeature::kHTMLSlotElement, WebDXFeature::kSlot},
          {WebFeature::kV8SpeechRecognition_Start_Method,
           WebDXFeature::kSpeechRecognition},
          {WebFeature::kV8SpeechSynthesis_Speak_Method,
           WebDXFeature::kSpeechSynthesis},
          {WebFeature::kStorageAccessAPI_HasStorageAccess_Method,
           WebDXFeature::kStorageAccess},
          {WebFeature::kStorageAccessAPI_requestStorageAccess_Method,
           WebDXFeature::kStorageAccess},
          {WebFeature::kStorageAccessAPI_requestStorageAccessFor_Method,
           WebDXFeature::kStorageAccess},
          {WebFeature::kStorageAccessAPI_requestStorageAccess_BeyondCookies,
           WebDXFeature::kNonCookieStorageAccess},
          {WebFeature::kStorageAccessAPI_hasUnpartitionedCookieAccess,
           WebDXFeature::kNonCookieStorageAccess},
          {WebFeature::kStorageBucketsOpen, WebDXFeature::kStorageBuckets},
          {WebFeature::kCSSSelectorTargetText, WebDXFeature::kTargetText},
          {WebFeature::kHTMLTemplateElement, WebDXFeature::kTemplate},
          {WebFeature::kHTMLPatching, WebDXFeature::kTemplateFor},
          {WebFeature::kTextWrapBalance, WebDXFeature::kTextWrapBalance},
          {WebFeature::kTextWrapPretty, WebDXFeature::kTextWrapPretty},
          {WebFeature::kCSSSelectorUserValid, WebDXFeature::kUserPseudos},
          {WebFeature::kCSSSelectorUserInvalid, WebDXFeature::kUserPseudos},
          {WebFeature::kWebCodecs, WebDXFeature::kWebcodecs},
          {WebFeature::kHidDeviceOpen, WebDXFeature::kWebhid},
          {WebFeature::kV8LockManager_Request_Method, WebDXFeature::kWebLocks},
          {WebFeature::kWebPImage, WebDXFeature::kWebp},
          {WebFeature::kWebTransport, WebDXFeature::kWebtransport},
          {WebFeature::kUsbDeviceOpen, WebDXFeature::kWebusb},
          {WebFeature::kVTTCue, WebDXFeature::kWebvtt},
          {WebFeature::kCSSSelectorPseudoWhere, WebDXFeature::kWhere},
          {WebFeature::kDataListElement, WebDXFeature::kDatalist},
          {WebFeature::kCSSSelectorPseudoDir, WebDXFeature::kDirPseudo},
          {WebFeature::kHiddenUntilFoundAttribute,
           WebDXFeature::kHiddenUntilFound},
          {WebFeature::kAbortSignalAny, WebDXFeature::kAbortsignalAny},
          {WebFeature::kAttributionReportingAPIAll,
           WebDXFeature::kAttributionReporting},
          {WebFeature::kNavigationAPI, WebDXFeature::kNavigation},
          {WebFeature::kMathMLMathElement, WebDXFeature::kMathml},
          {WebFeature::kCanvasRenderingContext2DConicGradient,
           WebDXFeature::kCanvasCreateconicgradient},
          {WebFeature::kCanvasRenderingContext2DReset,
           WebDXFeature::kCanvasReset},
          {WebFeature::kCanvasRenderingContext2DRoundRect,
           WebDXFeature::kCanvasRoundrect},
          {WebFeature::kCookieStoreAPI, WebDXFeature::kCookieStore},
          {WebFeature::kCSSColorMixFunction, WebDXFeature::kColorMix},
          {WebFeature::kImageSet, WebDXFeature::kImageSet},
          {WebFeature::kStructuredCloneMethod, WebDXFeature::kStructuredClone},
          {WebFeature::kSlotAssignNode, WebDXFeature::kSlotAssign},
          {WebFeature::kDeviceMotionSecureOrigin,
           WebDXFeature::kDeviceOrientationEvents},
          {WebFeature::kDeviceOrientationAbsoluteSecureOrigin,
           WebDXFeature::kDeviceOrientationEvents},
          {WebFeature::kDeviceOrientationSecureOrigin,
           WebDXFeature::kDeviceOrientationEvents},
          {WebFeature::kGamepadButtons, WebDXFeature::kGamepad},
          {WebFeature::kWakeLockAcquireScreenLock,
           WebDXFeature::kScreenWakeLock},
          {WebFeature::kWakeLockAcquireSystemLock,
           WebDXFeature::kScreenWakeLock},
          {WebFeature::kWebBluetoothRemoteServerConnect,
           WebDXFeature::kWebBluetooth},
          {WebFeature::kWebNfcNdefReaderScan, WebDXFeature::kWebNfc},
          {WebFeature::kWebNfcNdefWriterWrite, WebDXFeature::kWebNfc},
          {WebFeature::kWebNfcNdefMakeReadOnly, WebDXFeature::kWebNfc},
          {WebFeature::kWebGPURequestAdapter, WebDXFeature::kWebgpu},
          {WebFeature::kSerialPortOpen, WebDXFeature::kSerial},
          {WebFeature::kModuleDedicatedWorker, WebDXFeature::kJsModulesWorkers},
          {WebFeature::kModuleSharedWorker,
           WebDXFeature::kJsModulesSharedWorkers},
          {WebFeature::kCssDisplayPropertyMultipleValues,
           WebDXFeature::kTwoValueDisplay},
          {WebFeature::kTwoValuedOverflow, WebDXFeature::kOverflowShorthand},
          {WebFeature::kKeyboardApiGetLayoutMap, WebDXFeature::kKeyboardMap},
          {WebFeature::kSchedulerPostTask, WebDXFeature::kScheduler},
          {WebFeature::kSchedulerYield, WebDXFeature::kScheduler},
          {WebFeature::kTaskControllerConstructor, WebDXFeature::kScheduler},
          {WebFeature::kTaskControllerSetPriority, WebDXFeature::kScheduler},
          {WebFeature::kTaskSignalPriority, WebDXFeature::kScheduler},
          {WebFeature::kKeyboardApiLock, WebDXFeature::kKeyboardLock},
          {WebFeature::kAsyncClipboardAPIRead, WebDXFeature::kAsyncClipboard},
          {WebFeature::kAsyncClipboardAPIWrite, WebDXFeature::kAsyncClipboard},
          {WebFeature::kAsyncClipboardAPIReadText,
           WebDXFeature::kAsyncClipboard},
          {WebFeature::kAsyncClipboardAPIWriteText,
           WebDXFeature::kAsyncClipboard},
          {WebFeature::kHtmlClipboardApiUnsanitizedRead,
           WebDXFeature::kClipboardUnsanitizedFormats},
          {WebFeature::kClipboardCustomFormatRead,
           WebDXFeature::kClipboardCustomFormat},
          {WebFeature::kClipboardCustomFormatWrite,
           WebDXFeature::kClipboardCustomFormat},
          {WebFeature::kClipboardSvgRead, WebDXFeature::kClipboardSvg},
          {WebFeature::kClipboardSvgWrite, WebDXFeature::kClipboardSvg},
          {WebFeature::kV8ClipboardItem_Supports_Method,
           WebDXFeature::kClipboardSupports},
          {WebFeature::kV8AbortController_Constructor, WebDXFeature::kAborting},
          {WebFeature::kV8AbortSignal_Abort_Method, WebDXFeature::kAborting},
          {WebFeature::kAbortSignalTimeout, WebDXFeature::kAborting},
          {WebFeature::kEditContext, WebDXFeature::kEditContext},
          {WebFeature::kInertAttribute, WebDXFeature::kInert},
          {WebFeature::kSegmenter, WebDXFeature::kIntlSegmenter},
          {WebFeature::kEyeDropperOpen, WebDXFeature::kEyedropper},
          {WebFeature::kElementCheckVisibility, WebDXFeature::kCheckVisibility},
          {WebFeature::kElementGetHTML, WebDXFeature::kGethtml},
          {WebFeature::kHTMLCanvasElement, WebDXFeature::kCanvas},
          {WebFeature::kCanvasUseColorSpace,
           WebDXFeature::kCanvas_2dColorManagement},
          {WebFeature::kCSSAtRuleStartingStyle, WebDXFeature::kStartingStyle},
          {WebFeature::kCaretPositionFromPoint,
           WebDXFeature::kDocumentCaretpositionfrompoint},
          {WebFeature::kMeasureMemory, WebDXFeature::kMeasureMemory},
          {WebFeature::kMediaQueryRangeSyntax,
           WebDXFeature::kMediaQueryRangeSyntax},
          {WebFeature::kCSSRegisterProperty,
           WebDXFeature::kRegisteredCustomProperties},
          {WebFeature::kCSSAtRuleProperty,
           WebDXFeature::kRegisteredCustomProperties},
          {WebFeature::kAccelerometerConstructor, WebDXFeature::kAccelerometer},
          {WebFeature::kLinearAccelerationSensorConstructor,
           WebDXFeature::kAccelerometer},
          {WebFeature::kGravitySensorConstructor, WebDXFeature::kAccelerometer},
          {WebFeature::kV8AudioContext_Constructor, WebDXFeature::kWebAudio},
          {WebFeature::kV8OfflineAudioContext_Constructor,
           WebDXFeature::kOfflineAudioContext},
          {WebFeature::kAudioWorkletNodeConstructor,
           WebDXFeature::kAudioWorklet},
          {WebFeature::kMIDIPortOpen, WebDXFeature::kWebMidi},
          {WebFeature::kV8HTMLVideoElement_RequestVideoFrameCallback_Method,
           WebDXFeature::kRequestVideoFrameCallback},
          {WebFeature::kSvgContextFillOrStroke,
           WebDXFeature::kContextFillStroke},
          {WebFeature::kHasCapUnits, WebDXFeature::kCap},
          {WebFeature::kHasRcapUnits, WebDXFeature::kRcap},
          {WebFeature::kHasIcUnits, WebDXFeature::kIc},
          {WebFeature::kHasRicUnits, WebDXFeature::kRic},
          {WebFeature::kHasLhUnits, WebDXFeature::kLh},
          {WebFeature::kHasRlhUnits, WebDXFeature::kRlh},
          {WebFeature::kCSSNesting, WebDXFeature::kNesting},
          {WebFeature::kCSSSelectorNthChildOfSelector,
           WebDXFeature::kNthChildOf},
          {WebFeature::kForcedColorsMediaFeature, WebDXFeature::kForcedColors},
          {WebFeature::kCSSTrigFunctions, WebDXFeature::kTrigFunctions},
          {WebFeature::kCSSColorGradientColorSpace,
           WebDXFeature::kGradientInterpolation},
          {WebFeature::kCSSCalcConstants, WebDXFeature::kCalcConstants},
          {WebFeature::kHasChUnits, WebDXFeature::kCh},
          {WebFeature::kHasRchUnits, WebDXFeature::kRch},
          {WebFeature::kHasRexUnits, WebDXFeature::kRex},
          {WebFeature::kCSSColorFunction, WebDXFeature::kColorFunction},
          {WebFeature::kCSSColor_SpaceOkLxx, WebDXFeature::kOklab},
          {WebFeature::kCSSColor_SpaceLxx, WebDXFeature::kLab},
          {WebFeature::kCSSColor_SpaceHwb, WebDXFeature::kHwb},
          {WebFeature::kCSSKeywordRevert, WebDXFeature::kRevertValue},
          {WebFeature::kPrefersContrastMediaFeature,
           WebDXFeature::kPrefersContrast},
          {WebFeature::kPrefersReducedTransparencyMediaFeature,
           WebDXFeature::kPrefersReducedTransparency},
          {WebFeature::kCSSRoundModRemFunctions, WebDXFeature::kRoundModRem},
          {WebFeature::kCSSExponentialFunctions, WebDXFeature::kExpFunctions},
          {WebFeature::kCSSLinearEasing, WebDXFeature::kLinearEasing},
          {WebFeature::kOverflowMediaQuery, WebDXFeature::kOverflow},
          {WebFeature::kHasSpellingOrGrammarErrorPseudoElement,
           WebDXFeature::kSpellingGrammarError},
          {WebFeature::kDynamicRangeMediaQuery, WebDXFeature::kDynamicRange},
          {WebFeature::kHasMarkerPseudoElement, WebDXFeature::kMarker},
          {WebFeature::kDisplayModeMediaQuery, WebDXFeature::kDisplayMode},
          {WebFeature::kCSSWordBreakAutoPhrase,
           WebDXFeature::kWordBreakAutoPhrase},
          {WebFeature::kCSSSelectorPseudoModal, WebDXFeature::kModal},
          {WebFeature::kUpdateMediaQuery, WebDXFeature::kUpdate},
          {WebFeature::kCSSSelectorPseudoFileSelectorButton,
           WebDXFeature::kFileSelectorButton},
          {WebFeature::kClipPathGeometryBox, WebDXFeature::kClipPathBoxes},
          {WebFeature::kActiveViewTransitionPseudo,
           WebDXFeature::kActiveViewTransition},
          {WebFeature::kSnapEvent, WebDXFeature::kScrollSnapEvents},
          {WebFeature::kScrollTimelineConstructor,
           WebDXFeature::kScrollDrivenAnimations},
          {WebFeature::kViewTimelineConstructor,
           WebDXFeature::kScrollDrivenAnimations},
          {WebFeature::kScrollFunctionTimeline,
           WebDXFeature::kScrollDrivenAnimations},
          {WebFeature::kViewFunctionTimeline,
           WebDXFeature::kScrollDrivenAnimations},
          {WebFeature::kHighlightAPIRegisterHighlight,
           WebDXFeature::kHighlight},
          {WebFeature::kV8Element_Animate_Method, WebDXFeature::kWebAnimations},
          {WebFeature::kV8Document_GetAnimations_Method,
           WebDXFeature::kWebAnimations},
          {WebFeature::kV8ShadowRoot_GetAnimations_Method,
           WebDXFeature::kWebAnimations},
          {WebFeature::kV8Element_GetAnimations_Method,
           WebDXFeature::kWebAnimations},
          {WebFeature::kV8Animation_Constructor, WebDXFeature::kWebAnimations},
          {WebFeature::kCSSAtRuleViewTransition,
           WebDXFeature::kCrossDocumentViewTransitions},
          {WebFeature::kCSSCalcSizeFunction, WebDXFeature::kCalcSize},
          {WebFeature::kLongAnimationFrameObserver,
           WebDXFeature::kLongAnimationFrames},
          {WebFeature::kLongAnimationFrameRequested,
           WebDXFeature::kLongAnimationFrames},
          {WebFeature::kVisibilityStateObserver,
           WebDXFeature::kPageVisibilityState},
          {WebFeature::kFedCm, WebDXFeature::kFedcm},
          {WebFeature::kWebOTP, WebDXFeature::kWebOtp},
          {WebFeature::kPreservesPitch, WebDXFeature::kPreservesPitch},
          {WebFeature::kV8HTMLMediaElement_Remote_AttributeGetter,
           WebDXFeature::kRemotePlayback},
          {WebFeature::kVerticalFormControls,
           WebDXFeature::kVerticalFormControls},
          {WebFeature::kNavigatorPdfViewerEnabled, WebDXFeature::kPdfViewer},
          {WebFeature::kReferrerPolicyHeader, WebDXFeature::kReferrerPolicy},
          {WebFeature::kHTMLAnchorElementReferrerPolicyAttribute,
           WebDXFeature::kReferrerPolicy},
          {WebFeature::kHTMLElementWritingSuggestions,
           WebDXFeature::kWritingsuggestions},
          {WebFeature::kHTMLIFrameElementReferrerPolicyAttribute,
           WebDXFeature::kReferrerPolicy},
          {WebFeature::kHTMLImageElementReferrerPolicyAttribute,
           WebDXFeature::kReferrerPolicy},
          {WebFeature::kHTMLLinkElementReferrerPolicyAttribute,
           WebDXFeature::kReferrerPolicy},
          {WebFeature::kV8Ink_RequestPresenter_Method, WebDXFeature::kInk},
          {WebFeature::kVirtualKeyboardHide, WebDXFeature::kVirtualKeyboard},
          {WebFeature::kVirtualKeyboardOverlayPolicy,
           WebDXFeature::kVirtualKeyboard},
          {WebFeature::kVirtualKeyboardShow, WebDXFeature::kVirtualKeyboard},
          {WebFeature::kDurationFormat, WebDXFeature::kIntlDurationFormat},
          {WebFeature::kWebAppWindowControlsOverlay,
           WebDXFeature::kWindowControlsOverlay},
          {WebFeature::kPriorityHints, WebDXFeature::kFetchPriority},
          {WebFeature::kBarPropLocationbar, WebDXFeature::kBarprop},
          {WebFeature::kBarPropMenubar, WebDXFeature::kBarprop},
          {WebFeature::kBarPropPersonalbar, WebDXFeature::kBarprop},
          {WebFeature::kBarPropScrollbars, WebDXFeature::kBarprop},
          {WebFeature::kBarPropStatusbar, WebDXFeature::kBarprop},
          {WebFeature::kBarPropToolbar, WebDXFeature::kBarprop},
          {WebFeature::kDocumentBeforeUnloadRegistered,
           WebDXFeature::kBeforeunload},
          {WebFeature::kLayoutShiftExplicitlyRequested,
           WebDXFeature::kLayoutInstability},
          {WebFeature::kJSSelfProfiling, WebDXFeature::kProfiler},
          {WebFeature::kZstdContentEncoding, WebDXFeature::kZstd},
          {WebFeature::kColumnPseudoElement, WebDXFeature::kColumnPseudo},
          {WebFeature::kScrollButtonPseudoElement,
           WebDXFeature::kScrollButtons},
          {WebFeature::kScrollMarkerPseudoElement,
           WebDXFeature::kScrollMarkers},
          {WebFeature::kPopoverTypeHint, WebDXFeature::kPopoverHint},
          {WebFeature::kFileHandlingLaunch, WebDXFeature::kAppFileHandlers},
          {WebFeature::kWebAppManifestProtocolHandlers,
           WebDXFeature::kAppProtocolHandlers},
          {WebFeature::kBadgeSetWithoutNotificationPermissionInBrowserWindow,
           WebDXFeature::kBadging},
          {WebFeature::kBadgeSetWithoutNotificationPermissionInAppWindow,
           WebDXFeature::kBadging},
          {WebFeature::kBadgeSetWithoutNotificationPermissionInWorker,
           WebDXFeature::kBadging},
          {WebFeature::kBeforeInstallPromptEvent,
           WebDXFeature::kBeforeinstallprompt},
          {WebFeature::kBeforeInstallPromptEventUserChoice,
           WebDXFeature::kBeforeinstallprompt},
          {WebFeature::kBeforeInstallPromptEventPreventDefault,
           WebDXFeature::kBeforeinstallprompt},
          {WebFeature::kBeforeInstallPromptEventPrompt,
           WebDXFeature::kBeforeinstallprompt},
          {WebFeature::kV8BeforeInstallPromptEvent_Platforms_AttributeGetter,
           WebDXFeature::kBeforeinstallprompt},
          {WebFeature::kWebAppManifestLaunchHandler,
           WebDXFeature::kAppLaunchHandler},
          {WebFeature::kCSSFunctions, WebDXFeature::kFunction},
          {WebFeature::kSelectionGetComposedRanges,
           WebDXFeature::kComposedRanges},
          {WebFeature::kSharedDictionaryUsed,
           WebDXFeature::kCompressionDictionaryTransport},
          {WebFeature::kHttp3, WebDXFeature::kHttp3},
          {WebFeature::kSpeculationRules, WebDXFeature::kSpeculationRules},
          {WebFeature::kElementCapture, WebDXFeature::kElementCapture},
          {WebFeature::kRegionCapture, WebDXFeature::kRegionCapture},
          {WebFeature::kUnprefixedRequestAnimationFrame,
           WebDXFeature::kRequestAnimationFrame},
          {WebFeature::kAnonymousIframe, WebDXFeature::kIframeCredentialless},
          {WebFeature::kV8URLPattern_Constructor, WebDXFeature::kUrlpattern},
          {WebFeature::kV8URLPattern_Test_Method, WebDXFeature::kUrlpattern},
          {WebFeature::kV8URLPattern_Exec_Method, WebDXFeature::kUrlpattern},
          {WebFeature::kV8URLPattern_CompareComponent_Method,
           WebDXFeature::kUrlpattern},
          {WebFeature::kV8AuthenticatorAttestationResponse_GetPublicKey_Method,
           WebDXFeature::kWebauthnPublicKeyEasy},
          {WebFeature::kDisplayNames, WebDXFeature::kIntlDisplayNames},
          {WebFeature::kCSSSelectorPseudoState, WebDXFeature::kState},
          {WebFeature::kV8Window_GetScreenDetails_Method,
           WebDXFeature::kWindowManagement},
          {WebFeature::kCSSLightDark, WebDXFeature::kLightDark},
          {WebFeature::kV8Window_RequestIdleCallback_Method,
           WebDXFeature::kRequestidlecallback},
          {WebFeature::kClearSiteData, WebDXFeature::kClearSiteData},
          {WebFeature::kClientHintsUA, WebDXFeature::kUaClientHints},
          {WebFeature::kClientHintsUABitness, WebDXFeature::kUaClientHints},
          {WebFeature::kClientHintsUAFormFactors, WebDXFeature::kUaClientHints},
          {WebFeature::kClientHintsUAFullVersion, WebDXFeature::kUaClientHints},
          {WebFeature::kClientHintsUAFullVersionList,
           WebDXFeature::kUaClientHints},
          {WebFeature::kClientHintsUAMobile, WebDXFeature::kUaClientHints},
          {WebFeature::kClientHintsUAModel, WebDXFeature::kUaClientHints},
          {WebFeature::kClientHintsUAPlatform, WebDXFeature::kUaClientHints},
          {WebFeature::kClientHintsUAPlatformVersion,
           WebDXFeature::kUaClientHints},
          {WebFeature::kClientHintsUAWoW64, WebDXFeature::kUaClientHints},
          {WebFeature::kNavigatorUAData_GetHighEntropyValues,
           WebDXFeature::kUaClientHints},
          {WebFeature::kNavigatorUAData_Mobile, WebDXFeature::kUaClientHints},
          {WebFeature::kNavigatorUAData_Platform, WebDXFeature::kUaClientHints},
          {WebFeature::kNavigatorUAData_Brands, WebDXFeature::kUaClientHints},
          {WebFeature::kNavigatorUAData_toJSON, WebDXFeature::kUaClientHints},
          {WebFeature::kSelectElementAppearanceBaseSelect,
           WebDXFeature::kCustomizableSelect},
          {WebFeature::kCSSSelectorPseudoNot, WebDXFeature::kNot},
          {WebFeature::kScriptingMediaFeature, WebDXFeature::kScripting},
          {WebFeature::kEffectiveAlignContentForBlock,
           WebDXFeature::kAlignContentBlock},
          {WebFeature::kAutoSizesLazy, WebDXFeature::kSizesAuto},
          {WebFeature::kV8WasmSimdOpcodes, WebDXFeature::kWasmSimd},
          {WebFeature::kObservableConstructor, WebDXFeature::kObservable},
          {WebFeature::kEventTargetOnObservable, WebDXFeature::kObservable},
          {WebFeature::kWebAppTitle, WebDXFeature::kMetaApplicationTitle},
          {WebFeature::kV8WasmExceptionHandling,
           WebDXFeature::kWasmExceptionHandling},
          {WebFeature::kV8WasmExtendedConst,
           WebDXFeature::kWasmExtendedConstantExpressions},
          {WebFeature::kV8WasmGC, WebDXFeature::kWasmGarbageCollection},
          {WebFeature::kV8WasmMultiMemory, WebDXFeature::kWasmMultiMemory},
          {WebFeature::kV8WasmRefTypes, WebDXFeature::kWasmReferenceTypes},
          {WebFeature::kV8WasmRelaxedSimd, WebDXFeature::kWasmSimdRelaxed},
          {WebFeature::kV8WasmReturnCall,
           WebDXFeature::kWasmTailCallOptimization},
          {WebFeature::kV8WasmThreadOpcodes, WebDXFeature::kWasmThreads},
          {WebFeature::kV8WebAssemblyJSStringBuiltins,
           WebDXFeature::kWasmStringBuiltins},
          {WebFeature::kV8WasmTypedFuncRef, WebDXFeature::kWasmTypedFunRefs},
          {WebFeature::kV8WasmMemory64, WebDXFeature::kWasmMemory64},
          {WebFeature::kV8WasmExnRef, WebDXFeature::kWasmExnrefExceptions},
          {WebFeature::kCreateJSONModuleScript, WebDXFeature::kJsonModules},
          {WebFeature::kV8WasmCustomDescriptors,
           WebDXFeature::kDRAFT_WasmCustomDescriptors},
          {WebFeature::kFetchUploadStreaming,
           WebDXFeature::kFetchRequestStreams},
          {WebFeature::kReadableStreamWithByteSource,
           WebDXFeature::kReadableByteStreams},
          {WebFeature::kDevicePostureMediaFeature,
           WebDXFeature::kDevicePosture},
          {WebFeature::kDevicePosture, WebDXFeature::kDevicePosture},
          {WebFeature::kXRDepthSensing, WebDXFeature::kWebxrDepthSensing},
          {WebFeature::kXRDOMOverlay, WebDXFeature::kWebxrDomOverlays},
          {WebFeature::kReportingObserver, WebDXFeature::kReporting},
          {WebFeature::kReportingEndpointsHeader, WebDXFeature::kReporting},
          {WebFeature::kV8MLContext_Dispatch_Method, WebDXFeature::kWebnn},
          {WebFeature::kTextDetectorDetect, WebDXFeature::kTextDetection},
          {WebFeature::kSummarizer_Summarize, WebDXFeature::kSummarizer},
          {WebFeature::kSummarizer_SummarizeStreaming,
           WebDXFeature::kSummarizer},
          {WebFeature::kTranslator_Translate, WebDXFeature::kTranslator},
          {WebFeature::kTranslator_TranslateStreaming,
           WebDXFeature::kTranslator},
          {WebFeature::kLanguageDetector_Detect,
           WebDXFeature::kLanguageDetector},
          {WebFeature::kPartitionedCookies, WebDXFeature::kPartitionedCookies},
          {WebFeature::kLanguageModel_Prompt, WebDXFeature::kLanguageModel},
          {WebFeature::kLanguageModel_PromptStreaming,
           WebDXFeature::kLanguageModel},
          {WebFeature::kProofreader_Proofread, WebDXFeature::kProofreader},
          {WebFeature::kRewriter_Rewrite, WebDXFeature::kRewriter},
          {WebFeature::kRewriter_RewriteStreaming, WebDXFeature::kRewriter},
          {WebFeature::kWriter_Write, WebDXFeature::kWriter},
          {WebFeature::kWriter_WriteStreaming, WebDXFeature::kWriter},
          {WebFeature::kModelContextRegisterTool,
           WebDXFeature::kDocumentModelcontext},
          {WebFeature::kModelContextGetTools,
           WebDXFeature::kDocumentModelcontext},
          {WebFeature::kModelContextExecuteTool,
           WebDXFeature::kDocumentModelcontext},
          {WebFeature::kModelContextRegisterDeclarativeTool,
           WebDXFeature::kDeclarativeWebmcp},
          {WebFeature::kIdentityDigitalCredentials,
           WebDXFeature::kDigitalCredentials},
          {WebFeature::kIdentityDigitalCredentialsCreation,
           WebDXFeature::kDigitalCredentials},
          {WebFeature::kHTMLInCanvas, WebDXFeature::kCanvasHtml},
          // Add new features above this line.
      }};

  return *kMap;
}

const base::flat_map<CSSSampleId, WebDXFeature>&
GetCSSPropertiesToWebDXFeatureMap() {
  static constexpr WebDXFeature logical_properties =
      WebDXFeature::kLogicalProperties;
  static const base::NoDestructor<
      const base::flat_map<CSSSampleId, WebDXFeature>>
      kMap{{
          {CSSSampleId::kAccentColor, WebDXFeature::kAccentColor},
          {CSSSampleId::kAnchorName, WebDXFeature::kAnchorPositioning},
          {CSSSampleId::kAnimationComposition,
           WebDXFeature::kAnimationComposition},
          {CSSSampleId::kAppearance, WebDXFeature::kAppearance},
          {CSSSampleId::kAspectRatio, WebDXFeature::kAspectRatio},
          {CSSSampleId::kBackdropFilter, WebDXFeature::kBackdropFilter},
          {CSSSampleId::kBorderImage, WebDXFeature::kBorderImage},
          {CSSSampleId::kColorScheme, WebDXFeature::kColorScheme},
          {CSSSampleId::kContainIntrinsicSize,
           WebDXFeature::kContainIntrinsicSize},
          {CSSSampleId::kFieldSizing, WebDXFeature::kFieldSizing},
          {CSSSampleId::kFontOpticalSizing, WebDXFeature::kFontOpticalSizing},
          {CSSSampleId::kFontPalette, WebDXFeature::kFontPalette},
          {CSSSampleId::kFontSizeAdjust, WebDXFeature::kFontSizeAdjust},
          {CSSSampleId::kFontSynthesisSmallCaps,
           WebDXFeature::kFontSynthesisSmallCaps},
          {CSSSampleId::kFontSynthesisStyle, WebDXFeature::kFontSynthesisStyle},
          {CSSSampleId::kFontSynthesisWeight,
           WebDXFeature::kFontSynthesisWeight},
          {CSSSampleId::kFontSynthesis, WebDXFeature::kFontSynthesis},
          {CSSSampleId::kFontVariantAlternates,
           WebDXFeature::kFontVariantAlternates},
          {CSSSampleId::kFontVariantEmoji, WebDXFeature::kFontVariantEmoji},
          {CSSSampleId::kHyphens, WebDXFeature::kHyphens},
          {CSSSampleId::kScrollbarColor, WebDXFeature::kScrollbarColor},
          {CSSSampleId::kScrollbarGutter, WebDXFeature::kScrollbarGutter},
          {CSSSampleId::kScrollbarWidth, WebDXFeature::kScrollbarWidth},
          {CSSSampleId::kScrollSnapType, WebDXFeature::kScrollSnap},
          {CSSSampleId::kScrollInitialTarget,
           WebDXFeature::kScrollInitialTarget},
          {CSSSampleId::kTextBox, WebDXFeature::kTextBox},
          {CSSSampleId::kTextBoxEdge, WebDXFeature::kTextBox},
          {CSSSampleId::kTextBoxTrim, WebDXFeature::kTextBox},
          {CSSSampleId::kTextFit, WebDXFeature::kTextFit},
          {CSSSampleId::kTextIndent, WebDXFeature::kTextIndent},
          {CSSSampleId::kTextSpacingTrim, WebDXFeature::kTextSpacingTrim},
          {CSSSampleId::kTextUnderlineOffset,
           WebDXFeature::kTextUnderlineOffset},
          {CSSSampleId::kTransitionBehavior, WebDXFeature::kTransitionBehavior},
          {CSSSampleId::kTranslate, WebDXFeature::kIndividualTransforms},
          {CSSSampleId::kRotate, WebDXFeature::kIndividualTransforms},
          {CSSSampleId::kScale, WebDXFeature::kIndividualTransforms},
          {CSSSampleId::kWillChange, WebDXFeature::kWillChange},
          {CSSSampleId::kMaskImage, WebDXFeature::kMasks},
          {CSSSampleId::kMaskClip, WebDXFeature::kMasks},
          {CSSSampleId::kMaskSize, WebDXFeature::kMasks},
          {CSSSampleId::kMaskOrigin, WebDXFeature::kMasks},
          {CSSSampleId::kMaskRepeat, WebDXFeature::kMasks},
          {CSSSampleId::kMaskComposite, WebDXFeature::kMasks},
          {CSSSampleId::kMaskPosition, WebDXFeature::kMasks},
          {CSSSampleId::kMaskMode, WebDXFeature::kMasks},
          {CSSSampleId::kMask, WebDXFeature::kMasks},
          {CSSSampleId::kPaintOrder, WebDXFeature::kPaintOrder},
          {CSSSampleId::kBackgroundClip, WebDXFeature::kBackgroundClipText},
          {CSSSampleId::kContainIntrinsicInlineSize,
           WebDXFeature::kContainInlineSize},
          {CSSSampleId::kOverlay, WebDXFeature::kOverlay},
          {CSSSampleId::kContentVisibility, WebDXFeature::kContentVisibility},
          {CSSSampleId::kCounterSet, WebDXFeature::kCounterSet},
          {CSSSampleId::kObjectViewBox, WebDXFeature::kObjectViewBox},
          {CSSSampleId::kForcedColorAdjust, WebDXFeature::kForcedColors},
          {CSSSampleId::kWhiteSpaceCollapse, WebDXFeature::kWhiteSpaceCollapse},
          {CSSSampleId::kImageOrientation, WebDXFeature::kImageOrientation},
          // https://drafts.csswg.org/css-logical-1/
          {CSSSampleId::kBlockSize, logical_properties},
          {CSSSampleId::kInlineSize, logical_properties},
          {CSSSampleId::kMinBlockSize, logical_properties},
          {CSSSampleId::kMaxBlockSize, logical_properties},
          {CSSSampleId::kMinInlineSize, logical_properties},
          {CSSSampleId::kMaxInlineSize, logical_properties},
          {CSSSampleId::kMarginBlockStart, logical_properties},
          {CSSSampleId::kMarginBlockEnd, logical_properties},
          {CSSSampleId::kMarginInlineStart, logical_properties},
          {CSSSampleId::kMarginInlineEnd, logical_properties},
          {CSSSampleId::kInsetBlockStart, logical_properties},
          {CSSSampleId::kInsetBlockEnd, logical_properties},
          {CSSSampleId::kInsetInlineStart, logical_properties},
          {CSSSampleId::kInsetInlineEnd, logical_properties},
          {CSSSampleId::kPaddingBlockStart, logical_properties},
          {CSSSampleId::kPaddingBlockEnd, logical_properties},
          {CSSSampleId::kPaddingInlineStart, logical_properties},
          {CSSSampleId::kPaddingInlineEnd, logical_properties},
          {CSSSampleId::kBorderBlockStartWidth, logical_properties},
          {CSSSampleId::kBorderBlockEndWidth, logical_properties},
          {CSSSampleId::kBorderInlineStartWidth, logical_properties},
          {CSSSampleId::kBorderInlineEndWidth, logical_properties},
          {CSSSampleId::kBorderBlockStartStyle, logical_properties},
          {CSSSampleId::kBorderBlockEndStyle, logical_properties},
          {CSSSampleId::kBorderInlineStartStyle, logical_properties},
          {CSSSampleId::kBorderInlineEndStyle, logical_properties},
          {CSSSampleId::kBorderBlockStartColor, logical_properties},
          {CSSSampleId::kBorderBlockEndColor, logical_properties},
          {CSSSampleId::kBorderInlineStartColor, logical_properties},
          {CSSSampleId::kBorderInlineEndColor, logical_properties},
          {CSSSampleId::kBorderStartStartRadius, logical_properties},
          {CSSSampleId::kBorderEndEndRadius, logical_properties},
          {CSSSampleId::kBorderStartEndRadius, logical_properties},
          {CSSSampleId::kBorderEndStartRadius, logical_properties},
          {CSSSampleId::kFontVariantPosition,
           WebDXFeature::kFontVariantPosition},
          {CSSSampleId::kTextEmphasis, WebDXFeature::kTextEmphasis},
          {CSSSampleId::kTextWrap, WebDXFeature::kTextWrap},
          {CSSSampleId::kTextWrapStyle, WebDXFeature::kTextWrapStyle},
          {CSSSampleId::kOffsetPath, WebDXFeature::kMotionPath},
          {CSSSampleId::kOutline, WebDXFeature::kOutline},
          {CSSSampleId::kTransformBox, WebDXFeature::kTransformBox},
          {CSSSampleId::kRubyAlign, WebDXFeature::kRubyAlign},
          {CSSSampleId::kRubyPosition, WebDXFeature::kRubyPosition},
          {CSSSampleId::kInitialLetter, WebDXFeature::kInitialLetter},
          {CSSSampleId::kHyphenateCharacter, WebDXFeature::kHyphenateCharacter},
          {CSSSampleId::kHyphenateLimitChars,
           WebDXFeature::kHyphenateLimitChars},
          {CSSSampleId::kQuotes, WebDXFeature::kQuotes},
          {CSSSampleId::kBaselineSource, WebDXFeature::kBaselineSource},
          {CSSSampleId::kClipPath, WebDXFeature::kClipPath},
          {CSSSampleId::kBoxDecorationBreak, WebDXFeature::kBoxDecorationBreak},
          {CSSSampleId::kPageOrientation, WebDXFeature::kPageOrientation},
          {CSSSampleId::kScrollTimeline, WebDXFeature::kScrollDrivenAnimations},
          {CSSSampleId::kScrollTimelineName,
           WebDXFeature::kScrollDrivenAnimations},
          {CSSSampleId::kViewTimeline, WebDXFeature::kScrollDrivenAnimations},
          {CSSSampleId::kViewTimelineName,
           WebDXFeature::kScrollDrivenAnimations},
          {CSSSampleId::kInterpolateSize, WebDXFeature::kInterpolateSize},
          {CSSSampleId::kViewTransitionClass,
           WebDXFeature::kViewTransitionClass},
          {CSSSampleId::kScrollMarkerGroup, WebDXFeature::kScrollMarkers},
          {CSSSampleId::kInteractivity, WebDXFeature::kInteractivity},
          {CSSSampleId::kReadingFlow, WebDXFeature::kReadingFlow},
          {CSSSampleId::kPrintColorAdjust, WebDXFeature::kPrintColorAdjust},
          {CSSSampleId::kLineBreak, WebDXFeature::kLineBreak},
          {CSSSampleId::kFontLanguageOverride,
           WebDXFeature::kFontLanguageOverride},
          {CSSSampleId::kTextJustify, WebDXFeature::kTextJustify},
          // Add new features above this line.
      }};

  return *kMap;
}

const base::flat_map<CSSSampleId, WebDXFeature>&
GetAnimatedCSSPropertiesToWebDXFeatureMap() {
  static const base::NoDestructor<
      const base::flat_map<CSSSampleId, WebDXFeature>>
      kMap{{
          {CSSSampleId::kFontPalette, WebDXFeature::kFontPaletteAnimation},
          {CSSSampleId::kDisplay, WebDXFeature::kDisplayAnimation},
          // Add new features above this line.
      }};

  return *kMap;
}

}  // namespace blink
