chromium/third_party/blink/renderer/core/css/css_properties.json5

// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

{
// This file specifies all the CSS properties we support and the necessary
// information for our code generation. The various supported arguments
// are described below with example usage

  parameters: {
    // - alias_for: "other-property"
    // Properties specifying alias_for should be virtually identical to the
    // properties they alias. Minor parsing differences are allowed as long as
    // the CSSValues created are of the same format of the aliased property.
    alias_for: {
    },

    // - alternative_of: "other-property"
    //
    // Makes the the property an "alternative" of another property.
    // An alternative property has a separate CSSProperty class which (based on
    // runtime flags) is used internally in place of the main CSSProperty class.
    // This makes it possible to e.g. switch a property definition from a
    // longhand to a shorthand at runtime.
    //
    // When parsing text (e.g. "animation") into a CSSPropertyID, the
    // alternative will be chosen if it is enabled. Otherwise, the main
    // property will be chosen.
    //
    // A main property may only have a single alternative property. It is
    // however possible to have an alternative of an alternative, in which case
    // the chain is followed. In other words, we choose the "innermost"
    // alternative that's enabled.
    //
    // Note that an alternative property ignores any runtime_flag on the main
    // property.
    alternative_of: {
      valid_type: "str",
    },

    // - longhands: ["property", "other-property"]
    // The property is a shorthand for several other properties.
    longhands: {
    },

    // - property_methods: ["method1", "method2"]
    // List of methods that are implemented in the CSSProperty for this
    // property.
    property_methods: {
      default: [],
      valid_type: "list",
      valid_values: [
        "ParseSingleValue",
        "ParseShorthand",
        "CSSValueFromComputedStyleInternal",
        "ColorIncludingFallback",
        "InitialValue"
      ],
    },

    // Suppresses code generation for the specified style builder functions.
    // This allows us to provide hand-written style builder functions in cases
    // where it's needed.
    style_builder_custom_functions: {
      default: [],
      valid_type: "list",
      valid_values: [
        "initial",
        "inherit",
        "value",
      ],
    },

    // Affects how the style building functions are generated.
    //
    // Several property groups (e.g. color properties) deviate from the default
    // style builder application, yet there are enough of these properties that
    // we want to generate code for them rather than having manually written
    // style builder functions.
    style_builder_template: {
      valid_values: [
        "animation",
        "auto",
        "background_layer",
        "border_image",
        "color",
        "counter",
        "empty",
        "grid",
        // The legacy template means that regular code generation should not be
        // be performed, and that the property is hard-coded in
        // style_builder_functions.cc.tmpl.
        "legacy",
        "mask_box",
        "mask_layer",
        "transition",
        "visited_color",
      ],
    },

    // Additional arguments to 'style_builder_template' may be provided here.
    style_builder_template_args: {
      default: {},
      valid_type: "dict"
    },

    // - is_descriptor
    // Whether it is a CSS descriptor. Descriptors define the characteristics of
    // an at-rule. E.g. @font-face is an at-rule, and src is a valid descriptor
    // for @font-face. Descriptors and CSS properties with the same name are
    // handled together in this file.
    // TODO(crbug.com/752745): Don't use CSSPropertyID for descriptors.
    // - is_property
    // Whether it is a CSS property. If this is false then is_descriptor must be
    // true.
    is_descriptor: {
      default: false,
      valid_type: "bool",
    },
    is_property: {
      default: true,
      valid_type: "bool",
    },

    // - independent
    // This property affects only one field on ComputedStyle, and can be set
    // directly during inheritance instead of forcing a recalc.
    // StyleResolver and StyleAdjuster are not invoked when these properties
    // are changed on a parent. Recalcs only happen if at least one
    // non-independent inherited property is changed in the parent.
    independent: {
      default: false,
      valid_type: "bool",
    },

    // - semi_independent_variable
    // This property affects to the {Inherited, NonInherited}Variable data fields so that we
    // can assume that the custom properties might not depend on any other property. We can
    // handle these properties so that they are excluded from the shared Inherited/NohInherited
    // logic, like the Equal and inheritance functions.
    semi_independent_variable: {
      default: false,
      valid_type: "bool",
    },

    // - affected_by_all
    // The affected_by_all flag indicates whether a change to the CSS property
    // "all" affects this property.
    // c.f. https://drafts.csswg.org/css-cascade/#all-shorthand
    // Descriptors (is_property: false) are never affected by changes to the
    // all property.
    affected_by_all: {
      default: true,
      valid_type: "bool",
    },

    // - interpolable
    // The interpolable flag indicates whether a property can be animated
    // smoothly. If this flag is set, the property should also be added to the
    // switch statements in CSSPropertyEquality and CSSInterpolationTypesMap.
    interpolable: {
      default: false,
      valid_type: "bool",
    },

    // - inherited
    // The property will inherit by default if no value is specified, typically
    // mentioned in specifications as "Inherited: yes"
    inherited: {
      default: false,
      valid_type: "bool",
    },

    // - compositable
    // The property can be animated by the compositor
    compositable: {
      default: false,
      valid_type: "bool",
    },

    // - computable
    //
    // Whether or not a property appears on CSSStyleDeclaration.
    //
    // By default a property is computable if it's all of the following:
    //
    // - Not an alias
    // - A property (as opposed to a descriptor)
    // - A longhand
    //
    // Otherwise the property is (by default) _not_ computable.
    //
    // If an explicit true/false value is provided, this overrides the default,
    // and the property unconditionally becomes computable/not-computable
    // according to the value specified.
    //
    // Internal properties (-internal-*) are never computable, and using this
    // flag on internal properties is an error.
    computable: {
      valid_type: "bool",
    },

    // - runtime_flag
    // The name of the flag on RuntimeEnabledFeatures
    // (e.g. "CSSOverscrollBehavior") that conditionally enables the
    // property.
    // This doesn't currently work with alias_for.
    runtime_flag: {
      valid_type: "str",
    },

    // - field_group
    // Name of the group that this field belongs to. Fields in the same group
    // are stored together as a nested class inside ComputedStyle and
    // dynamically allocated on use.
    // Leave this out if the field is stored directly on ComputedStyle.
    // If you want to auto group this property use: field_group: "*[->subgroup]"
    // If you use the auto grouping function check if your property is in
    // css_properties_ranking.json5
    // -  If yes, only provide: field_group: "*"
    // -  If no, you can specify a subgroup following the asterisk:
    //    field_group: "*[->subgroup]"
    field_group: {
      valid_type: "str",
    },

    // - field_size
    // Number of bits needed to store this field.
    field_size: {
      valid_type: "int",
    },

    // - field_template
    // Affects how the interface to this field is generated.
    // TODO(sashab, meade): Remove this once TypedOM types are specified for
    // every property, since this value can be inferred from that.
    field_template: {
      valid_values: [
        // Field is stored as an enum and has a initial/getter/setter/resetter.
        // If include_paths is empty, we would also generate the corresponding
        // enum definition in ComputedStyleConstants.h.
        "keyword",
        // Field can take on any subset of values from a list of keywords.
        "multi_keyword",
        // Semantically equivalent to keyword, but the type is represented as a
        // bit flag field as with multi_keyword as a performance optimization
        // for matching multiple values.
        "bitset_keyword",
        // Field stores a primitive value like int/bool. The type is specified
        // by type_name. The interface has a initial/getter/setter/resetter.
        "primitive",
        // Field is stored as a bool, whose default value is false
        // and can only be set to true. Has a initial/getter/setter.
        "monotonic_flag",
        // A derived flag is derived from other information on ComputedStyle.
        // It has no setters, and is instead calculated on first access by
        // the function specified by 'derived_from'.
        //
        // Derived flags must be marked as 'mutable', and can not have a
        // 'field_group' (i.e. must exist on the top level of ComputedStyle).
        //
        // See computed_style_extra_fields.json5 for examples of derived flags.
        "derived_flag",
        // Field has type specified at type_name and has a getter/setter.
        // Also has a setter taking an rvalue reference. Cannot be packed.
        "external",
        // Field is stored as a wrapper_pointer_name to a class.
        "pointer",
        // Preset "length" for external and Length class
        // This preset represents alias templates that will be replace by
        // entries in CSSFieldAlias.json5.
        "<[a-z]+>"
      ],
    },

    // - anchor_mode
    // Determines whether or not anchor() / anchor-size() queries are allowed
    // in the relevant property.
    //
    // If omitted, no anchor queries are allowed.
    //
    // See also AnchorScope::Mode.
    anchor_mode: {
      valid_values: [
        // anchor()
        "left",
        "right",
        "top",
        "bottom",

        // anchor-size()
        "width",
        "height",
      ]
    },

    // When specified on a property/field, this will generate code within
    // ComputedStyleBase::FieldInvalidationDiff to check if the property/field
    // has changed, and if so set a flag indicating this.
    //
    // Example usage:
    // if (field_diff & kBorderRadius) {
    //   diff.SetBorderRadiusChanged();
    // }
    //
    // The diff can also be used to "guard" against more expensive checks, e.g:
    // if ((field_diff & kOutline) && !OutlineVisuallyEqual(other)) {
    //   return true;
    // }
    //
    // This is to be **only** used within ComputedStyle::VisualInvalidationDiff
    // and will generally be more efficient than comparing fields directly.
    invalidate: {
      default: [],
      valid_type: "list",
      valid_values: [
        "accent-color",
        "background",
        "background-color",
        "background-current-color",
        "blend-mode",
        "border-image",
        "border-outline-visited-color",
        "border-radius",
        "border-visual",
        "border-width",
        "clip",
        "clip-path",
        "color",
        "compositing",
        "filter-data",
        "has-transform",
        "inset",
        "layout",
        "margin",
        "mask",
        "opacity",
        "outline",
        "out-of-flow",
        "paint",
        "reshape",
        "scroll-anchor",
        "scrollbar-color",
        "scrollbar-style",
        "stroke",
        "text-decoration",
        "transform-data",
        "transform-other",
        "transform-property",
        "visibility",
        "visual-overflow",
        "z-index",
      ],
    },

    // Valid for field_template:derived_flag only. This specifies the function
    // on ComputedStyle used to calculate the flag.
    derived_from: {
      valid_type: "str",
    },

    // - include_paths: ["path/to/file1.h", "path/to/file2.h"]
    // List of files containing the definitions of types in 'type_name'. Each of
    // these files will appear as a #include in ComputedStyleBase.h. For
    // example, if the type_name is 'Vector<String>', include_paths should be
    // ["third_party/blink/renderer/platform/wtf/vector.h",
    //  "third_party/blink/renderer/platform/wtf/text/wtf_string.h"]
    include_paths: {
      default: [],
    },

    // Name of the pointer type that wraps this field (e.g. scoped_refptr).
    wrapper_pointer_name: {
      valid_type: "str",
      valid_values: ["scoped_refptr", "Member", "std::unique_ptr"],
    },

    // - keywords: ["keyword1", "keyword2"]
    // This specifies all valid keyword values for the property.
    // TODO(sashab): Once all properties are represented here, delete
    // CSSValueKeywords.in and use this list instead.
    keywords: {
      default: [],
    },

    // - default_value: "keyword-value"
    // This specifies the default value for this field.
    // - for keyword fields, this is the initial keyword
    // - for other fields, this is a string containg the C++ expression
    //   that is used to initialise the field.
    default_value: {
    },

    // Flags which go into CSSOMTypes:
    // - typedom_types: ["Keyword", "Type", "OtherType"]
    // The property can take types specified in typedom_types for CSS Typed OM.
    // - separator
    // The property supports a list of values, and when there is more than one,
    // it is separated with this character.
    typedom_types: {
      default: [],
      valid_type: "list",
      valid_values: [
        "Angle",
        "Flex",
        "Frequency",
        "Keyword",
        "Length",
        "Number",
        "Percentage",
        "Position",
        "Resolution",
        "Time",
        "Transform",
        "Unparsed",
        "Image"
      ],
    },
    separator: {
      valid_values: [",", " ", "/"],
    },

    // The remaining arguments are used for the StyleBuilder and allow us to
    // succinctly describe how to apply properties. When default handlers are
    // not sufficient, we should prefer to use converter, and failing that
    // define custom property handlers in CSSProperty subclasses. We should only
    // use style_builder_functions.tmpl to define handlers when there are
    // multiple properties requiring the same handling, but converter doesn't
    // suffice.

    // - font
    // The default property handlers call into the FontBuilder instead of
    // setting values directly onto the ComputedStyle
    font: {
      default: false,
      valid_type: "bool",
    },

    // - name_for_methods: "BlendMode"
    // Tweaks how we choose defaults for getter, setter, initial and type_name.
    // For example, setting this to BlendMode will make us use a setter of
    // SetBlendMode. Note that 'name_for_methods' also determines the name
    // of the generated field on ComputedStyle.
    // - initial
    // The static function to invoke on ComputedStyleInitialValues
    // or FontBuilder to retrieve the initial value.
    // Defaults to e.g. InitialBorderBottomLeft.
    // - getter
    // The ComputedStyle getter, defaults to e.g. BorderBottomLeft
    // - setter
    // The ComputedStyle setter, defaults to e.g. GetBorderBottomLeft
    // - type_name
    // The computed type for the property. Only required for the default value
    // application, defaults to e.g. EDisplay
    name_for_methods: {
    },
    initial: {
    },
    getter: {
    },
    setter: {
    },
    type_name: {
    },

    // - computed_style_protected_functions
    //
    // Any function specified in the list will be generated with protected
    // visibility. This is useful if the default-generated getter function is
    // typically not what clients want to use.
    //
    // For example, the Clear getter is protected to force clients to take
    // TextDirection into account.
    computed_style_protected_functions: {
      default: [],
      valid_type: "list",
      valid_values: ["getter", "setter", "resetter"],
    },

    // - computed_style_custom_functions
    //
    // Any function specified in the list will be generated with protected
    // visibility and an "Internal" suffix. A custom accessor (with the suffix-
    // less name) must be manually provided on ComputedStyle. This is useful for
    // e.g. properties that have special behavior that affects the computed
    // value of the property.
    //
    // For example, the computed value of border-left-width magically becomes
    // zero if border-left-style is none or hidden. The generated code can not
    // express this, hence a custom one is specified.
    //
    // Any custom function automatically gets protected visiblity, and therefore
    // it is not valid to specify a function as both custom and explicitly
    // protected (using computed_style_protected_functions).
    computed_style_custom_functions: {
      default: [],
      valid_type: "list",
      valid_values: ["initial", "getter", "setter", "resetter"],
    },

    // - converter: "ConvertRadius"
    // The StyleBuilder will call the specified function on
    // StyleBuilderConverter to convert a CSSValue to an appropriate platform
    // value
    converter: {
    },

    // - logical_property_group: used for properties that depend on writing-mode
    // and/or text-direction (e.g. css-logical), and for their physical counterparts.
    // Represents the "logical property group" described by css-logical
    // (https://drafts.csswg.org/css-logical/#logical-property-group).
    logical_property_group: {
      // A name identifying the logical property group. All logical and physical
      // properties in the same group should have the same name.
      //
      // In terms of code generation, each value corresponds to 2 functions in
      // CSSDirectionAwareResolver. E.g. a value of "foo-bar" would correspond to:
      // - CSSDirectionAwareResolver::LogicalFooBarMapping(), containing the
      //   properties of the group with a flow-relative mapping logic.
      // - CSSDirectionAwareResolver::PhysicalFooBarMapping(), containing the
      //   properties of the group with a physical mapping logic.
      name: {
        valid_type: "str",
        valid_values: ["border", "border-color", "border-radius",
                       "border-style", "border-width", "contain-intrinsic-size",
                       "inset", "margin", "max-size", "min-size", "overflow",
                       "padding", "scroll-margin", "scroll-padding",
                       "scroll-start", "scroll-start-target", "size",
                       "visited-border-color"],
      },
      // The name of the mapping function used to convert between equivalent
      // logical and physical properties within the same group. Corresponds to
      // a function in CSSDirectionAwareResolver. E.g. a value of "baz"
      // corresponds to CSSDirectionAwareResolver::ResolveBaz(...).
      //
      // Also identifies the mapping logic of the group
      // (https://drafts.csswg.org/css-logical-1/#mapping-logic)
      resolver: {
        valid_type: "str",
        valid_values: [
          // Mapping logic: flow-relative (logical)
          "block", "inline",
          "block-start", "block-end", "inline-start", "inline-end",
          "start-start", "start-end", "end-start", "end-end",
          // Mapping logic: physical
          "vertical", "horizontal",
          "top", "bottom", "left", "right",
          "top-left", "top-right", "bottom-right", "bottom-left",
        ],
      },
    },

    // - surrogate_for: "other-property"
    //
    // A surrogate is a property which acts like another property. Unlike an
    // alias (which is resolved as parse-time), a surrogate exists alongside
    // the original in the parsed rule, and in the cascade.
    //
    // However, surrogates modify the same fields on ComputedStyle. Examples of
    // surrogates are:
    //
    //  * -webkit-writing-mode (surrogate of writing-mode)
    //  * inline-size (surrogate for width, or height)
    //  * All css-logical properties in general
    //
    // Note that for properties that use logical_property_group,
    // 'surrogate_for' should not be set, as the mapping is determined at
    // run-time (depending og e.g. 'direction').
    surrogate_for: {
      valid_type: "str",
    },

    // - priority: 1
    // The priority level for computing the property. Properties with the same
    // priority level are grouped and computed in alphabetical order.
    // Anything above zero are designated "high priority" and done before
    // certain operations, like updating fonts. (Most high-priority properties
    // are 1; 2 and higher are used only in special circumstances.) This mechanism
    // is primarily useful for properties that influence other properties,
    // like line-height influencing lh units. Negative values are not used.
    priority: {
      default: 0,
      valid_type: "int",
    },

    // - layout_dependent
    // The resolved value used for getComputedStyle() depends on layout for this
    // property, which means we may need to update layout to return the correct
    // value from getComputedStyle(). Setting this to true will override
    // IsLayoutDependentProperty() to return true and require a custom
    // IsLayoutDependent() which typically checks for LayoutObject existence and
    // type.
    layout_dependent: {
      default: false,
      valid_type: "bool",
    },

    // - visited_property_for: "other-property"
    // CSS properties that are allowed in :visited selectors each have an
    // internal "companion" property with the visited value. For privacy reasons
    // CSSOM APIs must return computed values as if links aren't visited, but
    // for rendering purposes we need the value with the :visited rules applied.
    //
    // This means that the regular property (e.g. background-color) represents
    // the value as seen by CSSOM, and the -internal-visited counterpart (e.g.
    // -internal-visited-background-color) represents the same property as seen
    // by painting.
    visited_property_for: {
      valid_type: "str",
    },

    // - valid_for_first_letter: true
    //
    // https://drafts.csswg.org/css-pseudo-4/#first-letter-styling
    valid_for_first_letter: {
      default: false,
      valid_type: "bool",
    },

    // - valid_for_first_line: true
    //
    // https://drafts.csswg.org/css-pseudo-4/#first-line-styling
    valid_for_first_line: {
      default: false,
      valid_type: "bool",
    },

    // - valid_for_cue: true
    //
    // https://w3c.github.io/webvtt/#the-cue-pseudo-element
    valid_for_cue: {
      default: false,
      valid_type: "bool",
    },

    // - valid_for_marker: true
    //
    // https://drafts.csswg.org/css-pseudo-4/#marker-pseudo
    valid_for_marker: {
      default: false,
      valid_type: "bool",
    },

    // - valid_for_highlight_legacy: true
    //
    // Theoretically matches
    // https://drafts.csswg.org/css-pseudo-4/#highlight-styling,
    // but includes additional properties for compatibility reasons.
    // Applied to highlight pseudos that use originating inheritance
    // instead of highlight inheritance.
    valid_for_highlight_legacy: {
      default: false,
      valid_type: "bool",
    },

    // - valid_for_highlight: true
    //
    // https://drafts.csswg.org/css-pseudo-4/#highlight-styling
    valid_for_highlight: {
      default: false,
      valid_type: "bool",
    },

    // Valid @page properties and descriptors when PageMarginBoxes aren't
    // enabled. This is limited to the set of descriptors and properties
    // that have an effect when this feature is disabled (essentially page
    // size, margins and orientation).
    valid_for_limited_page_context: {
      default: false,
      valid_type: "bool",
    },

    // Applicable @page properties and descriptors.
    valid_for_page_context: {
      default: false,
      valid_type: "bool",
    },

    // - is_border
    // The property, when used by the author, will disable any native
    // appearance on UI elements.
    is_border: {
      default: false,
      valid_type: "bool",
    },

    // - is_background
    // The property, when used by the author, will disable any native
    // appearance on UI elements.
    is_background: {
      default: false,
      valid_type: "bool",
    },

    // - is_border_radius
    // The property, when used by the author, will disable any native
    // appearance on UI elements.
    is_border_radius: {
      default: false,
      valid_type: "bool",
    },

    // - is_highlight_colors
    // The property participates in paired cascade, such that when encountered
    // in highlight styles, we make all other highlight color properties default
    // to initial, rather than the UA default.
    // https://drafts.csswg.org/css-pseudo-4/#highlight-cascade
    is_highlight_colors: {
      default: false,
      valid_type: "bool",
    },
    // - is_visited_highlight_colors
    // Like the previous one but for visited internal properties.
    is_visited_highlight_colors: {
      default: false,
      valid_type: "bool",
    },

    // - is_animation_property
    // The property is a longhand of the 'animation' or 'transition' shorthands.
    is_animation_property: {
      default: false,
      valid_type: "bool",
    },

    // Whether changing this property is so independent that we can apply
    // a change to them incrementally on top of the old style. This happens
    // only when inline style is changed. Conceptually, this could be a blocklist,
    // but being conservative, we have chosen to make it an allowlist.
    // The properties with known issue are explicitly marked as false,
    // so changing the default from false to true _should_ have no ill effects,
    // but bugs are of course possible. (There is a DCHECK verifying that we
    // computed the correct style when this optimization is in effect.)
    //
    // Since animations can affect pretty much anything else, and we don't
    // support their interactions anyway (see CanApplyInlineStyleIncrementally()),
    // animation properties are also never marked as supporting incremental style.
    // This is verified in validate_property().
    supports_incremental_style: {
      default: false,
      valid_type: "bool",
    },

    // If false, this property is known to cause problems if setting
    // it on an element's inline style will cause problems with computing
    // that element's style incrementally.
    //
    // NOTE: Setting false here is probably indicative of a bug. Long-term,
    // we should fix all of these and remove the flag.
    idempotent: {
      default: true,
      valid_type: "bool",
    },

    // If true, this property will accept a CSSNumericLiteralValue
    // (created by a fast-path parser), with no restrictions on range.
    // (NaN and infinities will be sent through the normal ParseSingleValue
    // path.) A typical case is the properties that can accept an alpha value;
    // percent values will take the slow paths, but simple numbers will be sent
    // directly through.
    accepts_numeric_literal: {
      default: false,
      valid_type: "bool",
    },

    // If true, then the ComputedStyle field for this property overlaps with
    // another property.
    //
    // Overlapping properties are *partially* overlapping, or do otherwise not
    // have compatible or interchangeable values with each other.
    overlapping: {
      default: false,
      valid_type: "bool",
    },

    // Like 'overlapping', but set on -webkit-prefixed properties that should
    // ultimately be removed.
    //
    // Note that properties that are legacy_overlapping are also overlapping
    // (i.e. legacy_overlapping:true implies overlapping:true).
    legacy_overlapping: {
      default: false,
      valid_type: "bool",
    },

    // - valid_for_keyframe: true
    //
    // Whether the property can be used in @keyframes.
    // https://www.w3.org/TR/css-animations-1/#typedef-keyframe-block
    valid_for_keyframe: {
      default: true,
      valid_type: "bool",
    },

    // Whether the property can be applied to <permission> elements.
    // See https://github.com/WICG/PEPC/blob/main/explainer.md#locking-the-pepc-style
    valid_for_permission_element: {
      default: false,
      valid_type: "bool",
    },

    // - valid_for_position_try: true
    //
    // Whether the property can be used in a @position-try rule
    // https://drafts.csswg.org/css-anchor-1/#fallback-rule
    valid_for_position_try: {
      default: false,
      valid_type: "bool",
    },

    // - affected_by_zoom: true
    //
    // Whether or not the computed value of this property is affected by
    // the effective zoom factor. Generally, all computed values that contain
    // a blink::Length are affected by zoom.
    //
    // Setting this flag to 'true' will change the inheritance behavior
    // (Longhand::ApplyInherit) to effectively "rezoom" the inherited value.
    //
    // https://github.com/w3c/csswg-drafts/issues/9397
    affected_by_zoom: {
      default: false,
      valid_type: "bool",
    },
  },

  // Members in the data objects should appear in the same order as in the
  // parameters object above
  data: [
    // Properties with StyleBuilder handling

    // Animation Priority properties
    {
      name: "animation-composition",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      keywords: ["replace", "add", "accumulate"],
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "Composition",
      },
      typedom_types: ["Keyword"],
      separator: ",",
      include_paths: ["third_party/blink/renderer/core/animation/effect_model.h"],
      default_value: "EffectModel::kCompositeReplace",
      type_name: "EffectModel::CompositeOperation",
      valid_for_marker: true,
    },
    {
      name: "animation-delay",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "DelayStart",
      },
      typedom_types: ["Time"],
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
      valid_for_keyframe: false,
    },
    {
      name: "animation-direction",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      keywords: ["normal", "reverse", "alternate", "alternate-reverse"],
      typedom_types: ["Keyword"],
      separator: ",",
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "Direction",
      },
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
      valid_for_keyframe: false,
    },
    {
      name: "animation-duration",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      separator: ",",
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "Duration",
      },
      typedom_types: ["Time"],
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
      valid_for_keyframe: false,
    },
    {
      name: "animation-fill-mode",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "FillMode",
      },
      keywords: ["none", "forwards", "backwards", "both"],
      typedom_types: ["Keyword"],
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
      valid_for_keyframe: false,
    },
    {
      name: "animation-iteration-count",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      keywords: ["infinite"],
      separator: ",",
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "IterationCount",
      },
      keywords: ["infinite"],
      typedom_types: ["Keyword", "Number"],
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
      valid_for_keyframe: false,
    },
    {
      // TODO(futhark): Set the TreeScope on CSSAnimationData.
      name: "animation-name",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "Name",
      },
      keywords: ["none"],
      typedom_types: ["Keyword"],
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
      valid_for_keyframe: false,
    },
    {
      name: "animation-play-state",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "PlayState",
      },
      keywords: ["running", "paused"],
      typedom_types: ["Keyword"],
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
      valid_for_keyframe: false,
    },
    {
      name: "animation-range-start",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "RangeStart",
      },
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
      valid_for_keyframe: false,
      runtime_flag: "ScrollTimeline",
    },
    {
      name: "animation-range-end",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "RangeEnd",
      },
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
      valid_for_keyframe: false,
      runtime_flag: "ScrollTimeline",
    },
    {
      name: "animation-timeline",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "Timeline",
      },
      keywords: ["none", "auto"],
      typedom_types: ["Keyword"],
      separator: ",",
      valid_for_marker: true,
      runtime_flag: "ScrollTimeline",
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
    },
    {
      name: "animation-timing-function",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "animation",
      style_builder_template_args: {
        attribute: "TimingFunction",
      },
      keywords: [
        "linear",
        "ease",
        "ease-in",
        "ease-out",
        "ease-in-out",
        "jump-both",
        "jump-end",
        "jump-none",
        "jump-start",
        "step-start",
        "step-end"
      ],
      typedom_types: ["Keyword"],
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
    },
    {
      name: "transition-delay",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "transition",
      style_builder_template_args: {
        attribute: "DelayStart",
      },
      typedom_types: ["Time"],
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
    },
    {
      name: "transition-duration",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      typedom_types: ["Keyword", "Time"],
      separator: ",",
      style_builder_template: "transition",
      style_builder_template_args: {
        attribute: "Duration",
      },
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
    },
    {
      name: "transition-property",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "transition",
      style_builder_template_args: {
        attribute: "Property",
      },
      keywords: ["none"],
      typedom_types: ["Keyword"],
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
    },
    {
      name: "transition-behavior",
      keywords: ["normal", "allow-discrete"],
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      typedom_types: ["Keyword"],
      separator: ",",
      style_builder_template: "transition",
      style_builder_template_args: {
        attribute: "Behavior",
      },
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
    },
    {
      name: "transition-timing-function",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "transition",
      style_builder_template_args: {
        attribute: "TimingFunction",
      },
      keywords: [
        "linear",
        "ease",
        "ease-in",
        "ease-out",
        "ease-in-out",
        "jump-both",
        "jump-end",
        "jump-none",
        "jump-start",
        "step-start",
        "step-end"],
      typedom_types: ["Keyword"],
      separator: ",",
      valid_for_marker: true,
      is_animation_property: true,
      // Animation properites are never incremental.
      supports_incremental_style: false,
    },

    // High Priority and all other font properties.
    // Other properties can depend upon high priority properties
    // (e.g. font-size / ems)
    {
      name: "color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      inherited: true,
      // color isn't strictly independent of all other properties;
      // it determines currentColor, which in turn can affect the used value of
      // other properties (such as border colors, stops in gradients, etc.).
      // However, changes to color generally also trigger paint invalidation,
      // and paint invalidation resolves the color anew. (For the special case
      // of gradient stops, we have logic within ComputedStyle::AdjustDiffForBackgroundVisuallyEqual
      // that forces paint invalidation, recomputing the gradient and repainting
      // the element.)
      independent: true,
      field_group: "inherited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor(Color::kBlack)",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      style_builder_custom_functions: ["initial", "inherit", "value"],
      priority: 1,
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      is_highlight_colors: true,
      supports_incremental_style: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["accent-color", "background-current-color", "border-visual", "color", "outline"],
    },
    {
      name: "direction",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      affected_by_all: false,
      inherited: true,
      field_template: "keyword",
      include_paths: ["third_party/blink/renderer/platform/text/text_direction.h"],
      keywords: ["ltr", "rtl"],
      typedom_types: ["Keyword"],
      default_value: "ltr",
      type_name: "TextDirection",
      style_builder_custom_functions: ["value"],
      priority: 1,
      valid_for_marker: true,
      valid_for_page_context: true,
      invalidate: ["reshape"],
    },
    {
      name: "font-family",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      is_descriptor: true,
      inherited: true,
      font: true,
      name_for_methods: "FamilyDescription",
      type_name: "FontDescription::FamilyDescription",
      style_builder_custom_functions: ["initial", "inherit"],
      converter: "ConvertFontFamily",
      priority: 1,
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
      valid_for_page_context: true,
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "font-kerning",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      name_for_methods: "Kerning",
      converter: "ConvertFontKerning",
      type_name: "FontDescription::Kerning",
      priority: 1,
      keywords: ["auto", "normal", "none"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "font-optical-sizing",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      name_for_methods: "FontOpticalSizing",
      converter: "ConvertFontOpticalSizing",
      type_name: "OpticalSizing",
      priority: 1,
      keywords: ["auto", "none"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "font-palette",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal" ],
      interpolable: true,
      inherited: true,
      font: true,
      converter: "ConvertFontPalette",
      type_name: "FontPalette",
      priority: 1,
      keywords: ["normal", "light", "dark"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      valid_for_page_context: true,
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "font-size",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      font: true,
      name_for_methods: "Size",
      getter: "GetSize",
      converter: "ConvertFontSize",
      priority: 1,
      keywords: ["xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "xxx-large", "larger", "smaller", "-webkit-xxx-large"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "font-size-adjust",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      runtime_flag: "CSSFontSizeAdjust",
      font: true,
      name_for_methods: "SizeAdjust",
      converter: "ConvertFontSizeAdjust",
      priority: 1,
      keywords: ["none", "ex-height", "cap-height", "ch-width", "ic-width", "ic-height", "from-font"],
      typedom_types: ["Keyword", "Number"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      valid_for_page_context: true,
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "font-stretch",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      is_descriptor: true,
      interpolable: true,
      inherited: true,
      font: true,
      name_for_methods: "Stretch",
      converter: "ConvertFontStretch",
      priority: 1,
      keywords: [
        "normal", "ultra-condensed", "extra-condensed", "condensed",
        "semi-condensed", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded"
      ],
      typedom_types: ["Keyword", "Percentage"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "font-style",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      is_descriptor: true,
      interpolable: true,
      inherited: true,
      font: true,
      name_for_methods: "Style",
      converter: "ConvertFontStyle",
      priority: 1,
      keywords: ["normal", "italic", "oblique"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "font-variant-ligatures",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      name_for_methods: "VariantLigatures",
      type_name: "VariantLigatures",
      converter: "ConvertFontVariantLigatures",
      priority: 1,
      keywords: [
         "normal", "none", "common-ligatures", "no-common-ligatures",
         "discretionary-ligatures", "no-discretionary-ligatures",
         "historical-ligatures", "no-historical-ligatures", "contextual",
         "no-contextual"
      ],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "font-variant-caps",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      name_for_methods: "VariantCaps",
      converter: "ConvertFontVariantCaps",
      priority: 1,
      keywords: [
        "normal", "small-caps", "all-small-caps", "petite-caps",
        "all-petite-caps", "unicase", "titling-caps"
      ],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "font-variant-east-asian",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      name_for_methods: "VariantEastAsian",
      converter: "ConvertFontVariantEastAsian",
      priority: 1,
      keywords: [
         "normal", "jis78", "jis83", "jis90", "jis04", "simplified",
         "traditional", "full-width", "proportional-width", "ruby"
      ],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "font-variant-numeric",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      name_for_methods: "VariantNumeric",
      converter: "ConvertFontVariantNumeric",
      priority: 1,
      keywords: [
        "normal", "lining-nums", "oldstyle-nums", "proportional-nums",
        "tabular-nums", "diagonal-fractions", "stacked-fractions", "ordinal",
        "slashed-zero"
      ],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "font-variant-alternates",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      type_name: "FontVariantAlternates",
      name_for_methods: "FontVariantAlternates",
      converter: "ConvertFontVariantAlternates",
      priority: 1,
      keywords: [
        "normal",
      ],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "font-weight",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      is_descriptor: true,
      interpolable: true,
      inherited: true,
      font: true,
      name_for_methods: "Weight",
      converter: "ConvertFontWeight",
      priority: 1,
      keywords: ["normal", "bold", "bolder", "lighter"],
      typedom_types: ["Keyword", "Number"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "font-synthesis-weight",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      name_for_methods: "FontSynthesisWeight",
      type_name: "FontDescription::FontSynthesisWeight",
      priority: 1,
      keywords: ["auto", "none"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
      valid_for_permission_element: true,
    },
    {
      name: "font-synthesis-style",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      name_for_methods: "FontSynthesisStyle",
      type_name: "FontDescription::FontSynthesisStyle",
      priority: 1,
      keywords: ["auto", "none"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
      valid_for_permission_element: true,
    },
    {
      name: "font-synthesis-small-caps",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      name_for_methods: "FontSynthesisSmallCaps",
      type_name: "FontDescription::FontSynthesisSmallCaps",
      priority: 1,
      keywords: ["auto", "none"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
      valid_for_permission_element: true,
    },
    {
      name: "font-feature-settings",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      is_descriptor: true,
      inherited: true,
      font: true,
      name_for_methods: "FeatureSettings",
      converter: "ConvertFontFeatureSettings",
      priority: 1,
      keywords: ["normal"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      computable: false,
      // See comment on font.
      supports_incremental_style: false,
      valid_for_permission_element: true,
    },
    {
      name: "font-variation-settings",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      font: true,
      name_for_methods: "VariationSettings",
      converter: "ConvertFontVariationSettings",
      priority: 1,
      keywords: ["normal"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
      computable: false,
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "font-variant-emoji",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      runtime_flag: "FontVariantEmoji",
      font: true,
      name_for_methods: "VariantEmoji",
      type_name: "FontDescription::FontVariantEmoji",
      converter: "ConvertFontVariantEmoji",
      priority: 1,
      keywords: ["normal", "text", "emoji", "unicode"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      supports_incremental_style: false,
    },
    {
      name: "font-variant-position",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      name_for_methods: "VariantPosition",
      type_name: "FontDescription::FontVariantPosition",
      converter: "ConvertFontVariantPosition",
      priority: 1,
      keywords: ["normal", "sub", "super"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "-webkit-font-smoothing",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      type_name: "FontSmoothingMode",
      priority: 1,
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_permission_element: true,
    },
    {
      name: "forced-color-adjust",
      field_group: "*",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      runtime_flag: "ForcedColors",
      field_template: "keyword",
      // Affects the computed value of color when it is inherited and
      // forced-color- adjust is set to preserve-parent-color.
      priority: 2,
      keywords: ["auto", "none", "preserve-parent-color"],
      typedom_types: ["Keyword"],
      default_value: "auto",
      valid_for_highlight_legacy: true,
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "field-sizing",
      field_group: "visual",
      field_template: "keyword",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      keywords: ["fixed", "content"],
      default_value: "fixed",
      typedom_types: ["Keyword"],
      invalidate: ["layout"],
    },
    {
      name: "-webkit-locale",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      style_builder_custom_functions: ["value"],
      priority: 1,
    },
    {
      name: "math-depth",
      default_value: 0,
      field_group: "*",
      field_template: "primitive",
      inherited: true,
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      style_builder_custom_functions: ["value"],
      type_name: "short",
      typedom_types: ["Number"],
      // Affects the computed value of 'font-size', hence needs to happen before
      // high-priority properties.
      priority: 2,
    },
    {
      name: "text-orientation",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["sideways", "mixed", "upright"],
      typedom_types: ["Keyword"],
      default_value: "mixed",
      getter: "GetTextOrientation",
      style_builder_custom_functions: ["initial", "inherit", "value"],
      priority: 1,
      computable: false,
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-text-orientation",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      type_name: "TextOrientation",
      priority: 1,
      surrogate_for: "text-orientation",
    },
    {
      name: "writing-mode",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_template: "keyword",
      include_paths: ["third_party/blink/renderer/platform/text/writing_mode.h"],
      keywords: ["horizontal-tb", "vertical-rl", "vertical-lr",
                 "sideways-rl", "sideways-lr"],
      typedom_types: ["Keyword"],
      default_value: "horizontal-tb",
      type_name: "WritingMode",
      style_builder_custom_functions: ["initial", "inherit", "value"],
      priority: 1,
      valid_for_page_context: true,
      // Incremental code does not call DidChangeWritingMode(), which influences
      // the font.
      supports_incremental_style: false,
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-writing-mode",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      type_name: "WritingMode",
      priority: 1,
      surrogate_for: "writing-mode",
    },
    {
      name: "text-rendering",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      type_name: "TextRenderingMode",
      keywords: ["auto", "optimizespeed", "optimizelegibility", "geometricprecision"],
      typedom_types: ["Keyword"],
      priority: 1,
      valid_for_permission_element: true,
    },
    {
      name: "zoom",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "visual",
      field_template: "primitive",
      default_value: "1.0",
      type_name: "float",
      style_builder_custom_functions: ["initial", "inherit", "value"],
      priority: 1,
      // Setting zoom affects the _EffectiveZoom_, which in turns affects every px value
      // stored on ComputedStyle; see CSSToLengthConversionData::ZoomedComputedPixels.
      supports_incremental_style: false,
      valid_for_permission_element: true,
    },
    {
      name: "accent-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_auto_color.h"],
      type_name: "StyleAutoColor",
      computed_style_protected_functions: ["getter"],
      keywords: ["auto", "currentcolor"],
      typedom_types: ["Keyword"],
      converter: "ConvertStyleAutoColor",
      default_value: "StyleAutoColor::AutoColor()",
      computable: true,
      invalidate: ["accent-color"],
    },
    {
      name: "align-content",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/style_content_alignment_data.h"],
      default_value: "StyleContentAlignmentData(ContentPosition::kNormal, ContentDistributionType::kDefault, OverflowAlignment::kDefault)",
      type_name: "StyleContentAlignmentData",
      converter: "ConvertContentAlignmentData",
      invalidate: ["layout"],
    },
    {
      name: "align-items",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/style_self_alignment_data.h"],
      default_value: "StyleSelfAlignmentData(ItemPosition::kNormal, OverflowAlignment::kDefault)",
      type_name: "StyleSelfAlignmentData",
      converter: "ConvertSelfOrDefaultAlignmentData",
      invalidate: ["layout"],
    },
    {
      name: "alignment-baseline",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "svg",
      field_template: "keyword",
      keywords: ["auto", "baseline", "alphabetic", "ideographic", "middle",
                 "central", "mathematical", "before-edge", "text-before-edge",
                 "after-edge", "text-after-edge", "hanging"],
      typedom_types: ["Keyword"],
      default_value: "auto",
      invalidate: ["layout", "paint"],
    },
    {
      name: "align-self",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/style_self_alignment_data.h"],
      default_value: "StyleSelfAlignmentData(ItemPosition::kAuto, OverflowAlignment::kDefault)",
      type_name: "StyleSelfAlignmentData",
      converter: "ConvertSelfOrDefaultAlignmentData",
      valid_for_position_try: true,
      valid_for_permission_element: true,
      invalidate: ["layout"],
    },
    {
      name: "anchor-name",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal" ],
      include_paths: ["third_party/blink/renderer/core/style/scoped_css_name.h"],
      type_name: "ScopedCSSNameList",
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      field_group: "*",
      field_template: "external",
      converter: "ConvertAnchorName",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      valid_for_permission_element: true,
      invalidate: ["layout"],
    },
    {
      name: "anchor-scope",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal" ],
      include_paths: ["third_party/blink/renderer/core/style/scoped_css_name.h"],
      type_name: "ScopedCSSNameList",
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      field_group: "*",
      field_template: "external",
      converter: "ConvertAnchorScope",
      keywords: ["none", "all"],
      typedom_types: ["Keyword"],
      runtime_flag: "CSSAnchorScope",
      valid_for_permission_element: true,
      invalidate: ["layout"],
    },
    {
      name: "aspect-ratio",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "surround",
      field_template: "external",
      keywords: ["auto"],
      default_value: "StyleAspectRatio(EAspectRatioType::kAuto, gfx::SizeF())",
      type_name: "StyleAspectRatio",
      converter: "ConvertAspectRatio",
      include_paths: ["third_party/blink/renderer/core/style/style_aspect_ratio.h"],
      computable: false,
      valid_for_permission_element: true,
      invalidate: ["layout"],
    },
    {
      name: "backdrop-filter",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      compositable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/filter_operations.h"],
      default_value: "FilterOperations()",
      type_name: "FilterOperations",
      computed_style_custom_functions: ["initial"],
      style_builder_custom_functions: ["value"],
      keywords: ["none"],
      typedom_types: ["Keyword"],
      invalidate: ["compositing"],
    },
    {
      name: "backface-visibility",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["visible", "hidden"],
      typedom_types: ["Keyword"],
      default_value: "visible",
      invalidate: ["compositing"],
    },
    {
      name: "background-attachment",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      keywords: ["scroll", "fixed", "local"],
      typedom_types: ["Keyword"],
      separator: " ",
      style_builder_template: "background_layer",
      style_builder_template_args: {
        fill_type: "Attachment",
      },
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      is_background: true,
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "background-blend-mode",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      keywords: [
        "normal", "multiply", "screen", "overlay", "darken", "lighten",
        "color-dodge", "color-burn", "hard-light", "soft-light", "difference",
        "exclusion", "hue", "saturation", "color", "luminosity"
      ],
      typedom_types: ["Keyword"],
      separator: " ",
      style_builder_template: "background_layer",
      style_builder_template_args: {
        fill_type: "BlendMode",
        fill_type_getter: "GetBlendMode",
      },
      valid_for_first_letter: true,
      valid_for_first_line: true,
      is_background: false,
      valid_for_page_context: true,
    },
    {
      name: "background-clip",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      keywords: ["border-box", "padding-box", "content-box", "text"],
      typedom_types: ["Keyword"],
      separator: " ",
      style_builder_template: "background_layer",
      style_builder_template_args: {
        fill_type: "Clip",
      },
      style_builder_custom_functions: ["value"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      is_background: true,
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "background-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      compositable: true,
      field_group: "background",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor(Color::kTransparent)",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      style_builder_template_args: {
        initial_color: "ComputedStyleInitialValues::InitialBackgroundColor",
      },
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      is_background: true,
      is_highlight_colors: true,
      supports_incremental_style: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["background-color"],
    },
    {
      name: "background-image",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      keywords: ["auto", "none"],
      typedom_types: ["Keyword", "Image"],
      separator: " ",
      style_builder_template: "background_layer",
      style_builder_template_args: {
        fill_type: "Image",
        fill_type_getter: "GetImage",
      },
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      is_background: true,
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "background-origin",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      keywords: ["border-box", "padding-box", "content-box"],
      typedom_types: ["Keyword"],
      separator: " ",
      style_builder_template: "background_layer",
      style_builder_template_args: {
        fill_type: "Origin",
      },
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      is_background: true,
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "background-position-x",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      style_builder_template: "background_layer",
      style_builder_template_args: {
        fill_type: "PositionX",
      },
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      is_background: true,
      computable: false,
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "background-position-y",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      style_builder_template: "background_layer",
      style_builder_template_args: {
        fill_type: "PositionY",
      },
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      is_background: true,
      computable: false,
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "background-repeat",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      style_builder_template: "background_layer",
      style_builder_template_args: {
        fill_type: "Repeat",
      },
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "background-size",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      keywords: ["auto", "cover", "contain"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      separator: " ",
      style_builder_template: "background_layer",
      style_builder_template_args: {
        fill_type: "Size",
      },
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      is_background: true,
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "baseline-shift",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "svg->misc",
      field_template: "external",
      type_name: "Length",
      default_value: "Length::Fixed()",
      style_builder_custom_functions: ["inherit", "value"],
      keywords: ["baseline", "sub", "super"],
      typedom_types: ["Keyword", "Percentage", "Length"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "baseline-source",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "box",
      field_template: "keyword",
      default_value: "auto",
      keywords: ["auto", "first", "last"],
      typedom_types: ["Keyword"],
      invalidate: ["layout"],
    },
    {
      name: "border-bottom-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      field_group: "surround",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-color",
        resolver: "bottom",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-visual"],
    },
    {
      name: "border-bottom-left-radius",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "surround",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/length_size.h"],
      default_value: "LengthSize(Length::Fixed(0), Length::Fixed(0))",
      type_name: "LengthSize",
      converter: "ConvertRadius",
      typedom_types: ["Length", "Percentage"],
      valid_for_first_letter: true,
      is_border: true,
      is_border_radius: true,
      logical_property_group: {
        name: "border-radius",
        resolver: "bottom-left",
      },
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-radius", "paint"],
    },
    {
      name: "border-bottom-right-radius",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "surround",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/length_size.h"],
      default_value: "LengthSize(Length::Fixed(0), Length::Fixed(0))",
      type_name: "LengthSize",
      converter: "ConvertRadius",
      typedom_types: ["Length", "Percentage"],
      valid_for_first_letter: true,
      is_border: true,
      is_border_radius: true,
      logical_property_group: {
        name: "border-radius",
        resolver: "bottom-right",
      },
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-radius", "paint"],
    },
    {
      name: "border-bottom-style",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "box",
      field_template: "keyword",
      keywords: [
        "none", "hidden", "inset", "groove", "outset", "ridge", "dotted",
        "dashed", "solid", "double"
      ],
      typedom_types: ["Keyword"],
      default_value: "none",
      type_name: "EBorderStyle",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-style",
        resolver: "bottom",
      },
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-width", "border-visual"],
    },
    {
      name: "border-bottom-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "box",
      field_template: "external",
      keywords: ["thin", "medium", "thick"],
      default_value: "3",
      typedom_types: ["Keyword", "Length"],
      type_name: "int",
      computed_style_custom_functions: ["getter"],
      converter: "ConvertBorderWidth",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-width",
        resolver: "bottom",
      },
      // Overlaps with -webkit-border-image.
      overlapping: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-width", "border-visual"],
    },
    {
      name: "border-collapse",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      independent: true,
      inherited: true,
      field_template: "keyword",
      keywords: ["separate", "collapse"],
      typedom_types: ["Keyword"],
      default_value: "separate",
      invalidate: ["layout", "paint"],
    },
    {
      name: "border-image-outset",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      interpolable: true,
      typedom_types: ["Length", "Number"],
      style_builder_template: "border_image",
      style_builder_template_args: {
        modifier_type: "Outset",
      },
      valid_for_first_letter: true,
      is_border: true,
      // Overlaps with -webkit-border-image.
      overlapping: true,
    },
    {
      name: "border-image-repeat",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      keywords: ["stretch", "repeat", "round", "space"],
      typedom_types: ["Keyword"],
      style_builder_template: "border_image",
      style_builder_template_args: {
        modifier_type: "Repeat",
      },
      valid_for_first_letter: true,
      is_border: true,
      // Overlaps with -webkit-border-image.
      overlapping: true,
    },
    {
      name: "border-image-slice",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      interpolable: true,
      typedom_types: ["Number", "Percentage"],
      style_builder_template: "border_image",
      style_builder_template_args: {
        modifier_type: "Slice",
      },
      valid_for_first_letter: true,
      is_border: true,
      // Overlaps with -webkit-border-image.
      overlapping: true,
    },
    {
      name: "border-image-source",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      interpolable: true,
      keywords: ["none"],
      typedom_types: ["Keyword", "Image"],
      style_builder_custom_functions: ["value"],
      valid_for_first_letter: true,
      is_border: true,
      // Overlaps with -webkit-border-image.
      overlapping: true,
    },
    {
      name: "border-image-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      interpolable: true,
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage", "Number"],
      style_builder_template: "border_image",
      style_builder_template_args: {
        modifier_type: "Width",
      },
      valid_for_first_letter: true,
      is_border: true,
      // Overlaps with -webkit-border-image.
      overlapping: true,
    },
    {
      name: "border-left-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      field_group: "surround",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-color",
        resolver: "left",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-visual"],
    },
    {
      name: "border-left-style",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "box",
      field_template: "keyword",
      keywords: [
        "none", "hidden", "inset", "groove", "outset", "ridge", "dotted",
        "dashed", "solid", "double"
      ],
      typedom_types: ["Keyword"],
      default_value: "none",
      type_name: "EBorderStyle",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-style",
        resolver: "left",
      },
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-width", "border-visual"],
    },
    {
      name: "border-left-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "box",
      field_template: "external",
      keywords: ["thin", "medium", "thick"],
      default_value: "3",
      typedom_types: ["Keyword", "Length"],
      type_name: "int",
      computed_style_custom_functions: ["getter"],
      converter: "ConvertBorderWidth",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-width",
        resolver: "left",
      },
      // Overlaps with -webkit-border-image.
      overlapping: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-width", "border-visual"],
    },
    {
      name: "border-right-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      field_group: "surround",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-color",
        resolver: "right",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-visual"],
    },
    {
      name: "border-right-style",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "box",
      field_template: "keyword",
      keywords: [
        "none", "hidden", "inset", "groove", "outset", "ridge", "dotted",
        "dashed", "solid", "double"
      ],
      typedom_types: ["Keyword"],
      default_value: "none",
      type_name: "EBorderStyle",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-style",
        resolver: "right",
      },
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-width", "border-visual"],
    },
    {
      name: "border-right-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "box",
      field_template: "external",
      keywords: ["thin", "medium", "thick"],
      default_value: "3",
      typedom_types: ["Keyword", "Length"],
      type_name: "int",
      computed_style_custom_functions: ["getter"],
      converter: "ConvertBorderWidth",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-width",
        resolver: "right",
      },
      // Overlaps with -webkit-border-image.
      overlapping: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-width", "border-visual"],
    },
    {
      name: "border-top-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      field_group: "surround",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-color",
        resolver: "top",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-visual"],
    },
    {
      name: "border-top-left-radius",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "surround",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/length_size.h"],
      default_value: "LengthSize(Length::Fixed(0), Length::Fixed(0))",
      type_name: "LengthSize",
      converter: "ConvertRadius",
      typedom_types: ["Length", "Percentage"],
      valid_for_first_letter: true,
      is_border: true,
      is_border_radius: true,
      logical_property_group: {
        name: "border-radius",
        resolver: "top-left",
      },
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-radius", "paint"],
    },
    {
      name: "border-top-right-radius",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "surround",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/length_size.h"],
      default_value: "LengthSize(Length::Fixed(0), Length::Fixed(0))",
      type_name: "LengthSize",
      converter: "ConvertRadius",
      typedom_types: ["Length", "Percentage"],
      valid_for_first_letter: true,
      is_border: true,
      is_border_radius: true,
      logical_property_group: {
        name: "border-radius",
        resolver: "top-right",
      },
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-radius", "paint"],
    },
    {
      name: "border-top-style",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "box",
      field_template: "keyword",
      keywords: [
        "none", "hidden", "inset", "groove", "outset", "ridge", "dotted",
        "dashed", "solid", "double"
      ],
      typedom_types: ["Keyword"],
      default_value: "none",
      type_name: "EBorderStyle",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-style",
        resolver: "top",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-width", "border-visual"],
    },
    {
      name: "border-top-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "box",
      field_template: "external",
      keywords: ["thin", "medium", "thick"],
      default_value: "3",
      typedom_types: ["Keyword", "Length"],
      type_name: "int",
      computed_style_custom_functions: ["getter"],
      converter: "ConvertBorderWidth",
      valid_for_first_letter: true,
      is_border: true,
      logical_property_group: {
        name: "border-width",
        resolver: "top",
      },
      // Overlaps with -webkit-border-image.
      overlapping: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["border-width", "border-visual"],
    },
    {
      name: "bottom",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "surround",
      field_template: "<length>",
      keywords: ["auto"],
      default_value: "Length()",
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthOrAuto",
      anchor_mode: "bottom",
      logical_property_group: {
        name: "inset",
        resolver: "bottom",
      },
      supports_incremental_style: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      invalidate: ["inset", "out-of-flow", "scroll-anchor"],
    },
    {
      name: "box-decoration-break",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "box",
      field_template: "keyword",
      keywords: ["slice", "clone"],
      default_value: "slice",
      invalidate: ["layout", "paint"],
      runtime_flag: "BoxDecorationBreak",
    },
    {
      name: "box-shadow",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "pointer",
      include_paths: ["third_party/blink/renderer/core/style/shadow_list.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      type_name: "ShadowList",
      converter: "ConvertShadowList",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      invalidate: ["paint", "visual-overflow"],
    },
    {
      name: "box-sizing",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      // NOTE: Naturally fits into field_group: "box", but is so commonly set
      // that is is better to have it at the root.
      field_template: "keyword",
      keywords: ["content-box", "border-box"],
      typedom_types: ["Keyword"],
      default_value: "content-box",
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["layout"],
    },
    {
      name: "break-after",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      // Storage for this property also covers these legacy properties:
      // page-break-after, -webkit-column-break-after
      field_template: "keyword",
      field_group: "*",
      keywords: [
        "auto", "avoid", "avoid-column", "avoid-page", "column", "left", "page",
        "recto", "right", "verso"
      ],
      typedom_types: ["Keyword"],
      default_value: "auto",
      type_name: "EBreakBetween",
      invalidate: ["layout"],
    },
    {
      name: "break-before",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      // Storage for this property also covers these legacy properties:
      // page-break-before, -webkit-column-break-before
      field_template: "keyword",
      field_group: "*",
      keywords: [
        "auto", "avoid", "avoid-column", "avoid-page", "column", "left", "page",
        "recto", "right", "verso"
      ],
      typedom_types: ["Keyword"],
      default_value: "auto",
      type_name: "EBreakBetween",
      invalidate: ["layout"],
    },
    {
      name: "break-inside",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      // Storage for this property also covers these legacy properties:
      // page-break-inside, -webkit-column-break-inside
      field_template: "keyword",
      field_group: "*",
      keywords: ["auto", "avoid", "avoid-column", "avoid-page"],
      typedom_types: ["Keyword"],
      default_value: "auto",
      invalidate: ["layout"],
    },
    {
      name: "buffered-rendering",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "svg",
      field_template: "keyword",
      keywords: ["auto", "dynamic", "static"],
      default_value: "auto",
    },
    {
      name: "caption-side",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      independent: true,
      inherited: true,
      field_template: "keyword",
      keywords: ["top", "bottom"],
      typedom_types: ["Keyword"],
      default_value: "top",
      invalidate: ["layout", "paint"],
    },
    {
      name: "caret-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_auto_color.h"],
      default_value: "StyleAutoColor::AutoColor()",
      type_name: "StyleAutoColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleAutoColor",
      keywords: ["auto", "currentcolor"],
      typedom_types: ["Keyword"],
      valid_for_highlight_legacy: true,
      invalidate: ["color"],
    },
    {
      name: "clear",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      computed_style_protected_functions: ["getter"],
      keywords: ["none", "left", "right", "both", "inline-start", "inline-end"],
      typedom_types: ["Keyword"],
      default_value: "none",
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "clip",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "visual",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/length_box.h"],
      default_value: "LengthBox()",
      type_name: "LengthBox",
      computed_style_custom_functions: ["setter"],
      style_builder_template: "auto",
      converter: "ConvertClip",
      keywords: ["auto"],
      typedom_types: ["Keyword"],
      invalidate: ["clip"],
    },
    {
      name: "clip-path",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      compositable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/clip_path_operation.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      type_name: "ClipPathOperation",
      computed_style_custom_functions: ["getter", "setter"],
      converter: "ConvertClipPath",
      keywords: ["border-box", "padding-box", "content-box", "margin-box", "fill-box", "stroke-box", "view-box", "none"],
      typedom_types: ["Keyword"],
      invalidate: ["clip-path"],
    },
    {
      name: "clip-rule",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg",
      // TODO(fs): Convert this to a keyword (requires enum massage).
      field_template: "primitive",
      field_size: 1,
      include_paths: ["third_party/blink/renderer/platform/graphics/graphics_types.h"],
      type_name: "WindRule",
      keywords: ["nonzero", "evenodd"],
      default_value: "RULE_NONZERO",
      typedom_types: ["Keyword"],
      invalidate: ["paint"],
    },
    {
      name: "color-interpolation",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg",
      field_template: "keyword",
      type_name: "EColorInterpolation",
      keywords: ["auto", "srgb", "linearrgb"],
      default_value: "srgb",
      typedom_types: ["Keyword"],
      invalidate: ["paint"],
    },
    {
      name: "color-interpolation-filters",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg",
      field_template: "keyword",
      type_name: "EColorInterpolation",
      keywords: ["auto", "srgb", "linearrgb"],
      default_value: "linearrgb",
      typedom_types: ["Keyword"],
      invalidate: ["paint"],
    },
    {
      name: "color-rendering",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg",
      field_template: "keyword",
      keywords: ["auto", "optimizespeed", "optimizequality"],
      default_value: "auto",
      typedom_types: ["Keyword"],
    },
    {
      name: "color-scheme",
      field_group: "*",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_custom_functions: ["initial", "inherit", "value"],
      inherited: true,
      include_paths: ["third_party/blink/public/mojom/frame/color_scheme.mojom-blink.h"],
      type_name: "Vector<AtomicString>",
      default_value: "Vector<AtomicString, 0>()",
      field_template: "external",
      valid_for_highlight_legacy: true,
      computable: false,
      // Affects the computed value of 'color', hence needs to happen before
      // high-priority properties.
      priority: 2,
      valid_for_permission_element: true,
    },
    {
      name: "column-fill",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["balance", "auto"],
      default_value: "balance",
      getter: "GetColumnFill",
      typedom_types: ["Keyword"],
      computable: false,
      invalidate: ["layout", "paint"],
    },
    {
      name: "contain",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_size: 5,
      field_template: "primitive",
      default_value: "kContainsNone",
      name_for_methods: "Contain",
      type_name: "unsigned",
      converter: "ConvertFlags<Containment>",
      keywords: ["none", "strict", "content", "size", "layout", "style", "paint", "inline-size", "block-size"],
      typedom_types: ["Keyword"],
      computable: false,
      valid_for_permission_element: true,
      invalidate: ["layout"],
    },
    {
      name: "contain-intrinsic-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "surround",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/style_intrinsic_length.h"],
      keywords: ["none"],
      default_value: "StyleIntrinsicLength()",
      type_name: "StyleIntrinsicLength",
      converter: "ConvertIntrinsicDimension",
      valid_for_permission_element: true,
      invalidate: ["layout", "scroll-anchor"],
    },
    {
      name: "contain-intrinsic-height",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "surround",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/style_intrinsic_length.h"],
      keywords: ["none"],
      default_value: "StyleIntrinsicLength()",
      type_name: "StyleIntrinsicLength",
      converter: "ConvertIntrinsicDimension",
      valid_for_permission_element: true,
      invalidate: ["layout", "scroll-anchor"],
    },
    {
      name: "container-name",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      type_name: "ScopedCSSNameList",
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      field_group: "*",
      field_template: "external",
      converter: "ConvertContainerName",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      valid_for_permission_element: true,
    },
    {
      name: "container-type",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      keywords: ["normal", "inline-size", "size", "scroll-state"],
      field_group: "*",
      field_size: 3,
      field_template: "primitive",
      default_value: "kContainerTypeNormal",
      type_name: "unsigned",
      converter: "ConvertFlags<EContainerType, CSSValueID::kNormal>",
      typedom_types: ["Keyword"],
      valid_for_permission_element: true,
      invalidate: ["layout"],
    },
    {
      name: "content",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/content_data.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      separator: ",",
      type_name: "ContentData",
      computed_style_custom_functions: ["getter"],
      style_builder_custom_functions: ["initial", "inherit", "value"],
      valid_for_marker: true,
      valid_for_page_context: true,
      supports_incremental_style: true,
    },
    {
      name: "counter-increment",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      style_builder_template: "counter",
      style_builder_template_args: {
        action: "Increment",
      },
      keywords: ["none"],
      typedom_types: ["Keyword"],
      computable: false,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "counter-reset",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      style_builder_template: "counter",
      style_builder_template_args: {
        action: "Reset",
      },
      keywords: ["none"],
      typedom_types: ["Keyword"],
      computable: false,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "counter-set",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      style_builder_template: "counter",
      style_builder_template_args: {
        action: "Set",
      },
      keywords: ["none"],
      typedom_types: ["Keyword"],
      computable: false,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "cursor",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_template: "keyword",
      keywords: [
        "auto", "default", "none", "context-menu", "help", "pointer",
        "progress", "wait", "cell", "crosshair", "text", "vertical-text",
        "alias", "copy", "move", "no-drop", "not-allowed", "e-resize",
        "n-resize", "ne-resize", "nw-resize", "s-resize", "se-resize",
        "sw-resize", "w-resize", "ew-resize", "ns-resize", "nesw-resize",
        "nwse-resize", "col-resize", "row-resize", "all-scroll", "zoom-in",
        "zoom-out", "grab", "grabbing"
      ],
      default_value: "auto",
      style_builder_custom_functions: ["initial", "inherit", "value"],
      typedom_types: ["Keyword"],
      valid_for_highlight_legacy: true,
      valid_for_marker: true,
      valid_for_permission_element: true,
    },
    {
      name: "cx",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "svg->geometry",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      typedom_types: ["Length", "Percentage"],
      converter: "ConvertLength",
      supports_incremental_style: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "cy",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "svg->geometry",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      typedom_types: ["Length", "Percentage"],
      converter: "ConvertLength",
      supports_incremental_style: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "d",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "svg->geometry",
      field_template: "pointer",
      include_paths: ["third_party/blink/renderer/core/style/style_path.h"],
      wrapper_pointer_name: "scoped_refptr",
      type_name: "StylePath",
      default_value: "nullptr",
      converter: "ConvertPathOrNone",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      supports_incremental_style: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "display",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      keywords: [
        "inline", "block", "list-item", "inline-block", "table", "inline-table",
        "table-row-group", "table-header-group", "table-footer-group",
        "table-row", "table-column-group", "table-column", "table-cell",
        "table-caption", "-webkit-box", "-webkit-inline-box", "flex",
        "inline-flex", "grid", "inline-grid", "contents", "flow-root", "none",
        "flow", "math", "ruby", "ruby-text", "masonry", "inline-masonry"
      ],
      typedom_types: ["Keyword"],
      style_builder_custom_functions: ["initial", "inherit", "value"],
      // In general many things are tweaked after-the-fact based on display/float/position
      // (e.g. OriginalDisplay is based on display, and setting float can cause blockification),
      // so we turn off incremental style for all them all.
      supports_incremental_style: false,
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "dominant-baseline",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg",
      field_template: "keyword",
      keywords: ["auto", "alphabetic", "ideographic", "middle", "central", "mathematical", "hanging",
                 "use-script", "no-change", "reset-size", "text-after-edge", "text-before-edge"],
      default_value: "auto",
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "empty-cells",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      independent: true,
      inherited: true,
      field_template: "keyword",
      keywords: ["show", "hide"],
      typedom_types: ["Keyword"],
      default_value: "show",
      invalidate: ["layout", "paint"],
    },
    {
      name: "fill",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      inherited: true,
      field_group: "svg->fill",
      field_template: "external",
      type_name: "SVGPaint",
      include_paths: ["third_party/blink/renderer/core/style/svg_paint.h"],
      default_value: "SVGPaint(Color::kBlack)",
      name_for_methods: "FillPaint",
      converter: "ConvertSVGPaint",
      style_builder_template: "color",
      style_builder_template_args: {
        initial_color: "ComputedStyleInitialValues::InitialFillPaint",
      },
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["paint"],
    },
    {
      name: "fill-opacity",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "svg->fill",
      field_template: "primitive",
      type_name: "float",
      default_value: "1",
      converter: "ConvertAlpha",
      typedom_types: ["Number"],
      accepts_numeric_literal: true,
      invalidate: ["paint"],
    },
    {
      name: "fill-rule",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg",
      // TODO(fs): Convert this to a keyword (requires enum massage).
      field_template: "primitive",
      field_size: 1,
      include_paths: ["third_party/blink/renderer/platform/graphics/graphics_types.h"],
      type_name: "WindRule",
      keywords: ["nonzero", "evenodd"],
      default_value: "RULE_NONZERO",
      typedom_types: ["Keyword"],
      invalidate: ["paint"],
    },
    {
      name: "filter",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      compositable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/filter_operations.h"],
      default_value: "FilterOperations()",
      type_name: "FilterOperations",
      computed_style_custom_functions: ["initial"],
      style_builder_custom_functions: ["value"],
      keywords: ["none"],
      typedom_types: ["Keyword"],
      invalidate: ["filter-data"],
    },
    {
      name: "flex-basis",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "<length>",
      default_value: "Length::Auto()",
      converter: "ConvertLengthSizing",
      typedom_types: ["Keyword", "Length", "Percentage"],
      keywords: ["auto", "fit-content", "min-content", "max-content", "content"],
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "flex-direction",
      property_methods: ["CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*",
      field_template: "keyword",
      typedom_types: ["Keyword"],
      keywords: ["row", "row-reverse", "column", "column-reverse"],
      default_value: "row",
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "flex-grow",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "primitive",
      default_value: "0.0f",
      type_name: "float",
      typedom_types: ["Number"],
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "flex-shrink",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "primitive",
      default_value: "1.0f",
      type_name: "float",
      typedom_types: ["Number"],
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "flex-wrap",
      property_methods: ["CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*",
      field_template: "keyword",
      typedom_types: ["Keyword"],
      keywords: ["nowrap", "wrap", "wrap-reverse"],
      default_value: "nowrap",
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "float",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      computed_style_protected_functions: ["getter"],
      keywords: ["none", "left", "right", "inline-start", "inline-end"],
      typedom_types: ["Keyword"],
      default_value: "none",
      name_for_methods: "Floating",
      type_name: "EFloat",
      valid_for_first_letter: true,
      // See comment on display.
      supports_incremental_style: false,
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "flood-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      field_group: "svg->misc",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor(Color::kBlack)",
      type_name: "StyleColor",
      style_builder_template: "color",
      style_builder_template_args: {
        initial_color: "ComputedStyleInitialValues::InitialFloodColor",
      },
      converter: "ConvertStyleColor",
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      supports_incremental_style: true,
      invalidate: ["paint"],
    },
    {
      name: "flood-opacity",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "svg->misc",
      field_template: "primitive",
      type_name: "float",
      default_value: "1",
      converter: "ConvertAlpha",
      typedom_types: ["Number"],
      supports_incremental_style: true,
      accepts_numeric_literal: true,
      invalidate: ["paint"],
    },
    {
      name: "grid-auto-columns",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/grid_track_list.h"],
      default_value: "NGGridTrackList(GridTrackSize(Length::Auto()))",
      type_name: "NGGridTrackList",
      converter: "ConvertGridTrackSizeList",
      keywords: ["auto", "min-content", "max-content"],
      typedom_types: ["Keyword", "Length", "Percentage", "Flex"],
      separator: " ",
      invalidate: ["layout", "paint"],
    },
    {
      name: "grid-auto-flow",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*",
      field_size: 4, // FIXME: Make this use "kGridAutoFlowBits".
      field_template: "primitive",
      default_value: "kAutoFlowRow",
      type_name: "GridAutoFlow",
      computed_style_custom_functions: ["getter"],
      converter: "ConvertGridAutoFlow",
      keywords: ["row", "column"],
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "grid-auto-rows",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/grid_track_list.h"],
      default_value: "NGGridTrackList(GridTrackSize(Length::Auto()))",
      type_name: "NGGridTrackList",
      converter: "ConvertGridTrackSizeList",
      keywords: ["auto", "min-content", "max-content"],
      typedom_types: ["Keyword", "Length", "Percentage", "Flex"],
      separator: " ",
      invalidate: ["layout", "paint"],
    },
    {
      name: "grid-column-end",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/grid_position.h"],
      default_value: "GridPosition()",
      type_name: "GridPosition",
      keywords: ["auto"],
      typedom_types: ["Keyword"],
      converter: "ConvertGridPosition",
      invalidate: ["layout", "paint"],
    },
    {
      name: "grid-column-start",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/grid_position.h"],
      default_value: "GridPosition()",
      type_name: "GridPosition",
      keywords: ["auto"],
      typedom_types: ["Keyword"],
      converter: "ConvertGridPosition",
      invalidate: ["layout", "paint"],
    },
    {
      name: "grid-row-end",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/grid_position.h"],
      default_value: "GridPosition()",
      type_name: "GridPosition",
      keywords: ["auto"],
      typedom_types: ["Keyword"],
      converter: "ConvertGridPosition",
      invalidate: ["layout", "paint"],
    },
    {
      name: "grid-row-start",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/grid_position.h"],
      default_value: "GridPosition()",
      type_name: "GridPosition",
      keywords: ["auto"],
      typedom_types: ["Keyword"],
      converter: "ConvertGridPosition",
      invalidate: ["layout", "paint"],
    },
    {
      name: "grid-template-areas",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/computed_grid_template_areas.h"],
      type_name: "ComputedGridTemplateAreas",
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      converter: "ConvertGridTemplateAreas",
      invalidate: ["layout", "paint"],
    },
    {
      name: "grid-template-columns",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      layout_dependent: true,
      field_group: "*->grid",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/computed_grid_track_list.h"],
      interpolable: true,
      default_value: "ComputedGridTrackList()",
      type_name: "ComputedGridTrackList",
      style_builder_template: "grid",
      style_builder_template_args: {
        type: "GridTemplateColumns",
      },
      keywords: ["none"],
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "grid-template-rows",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      layout_dependent: true,
      field_group: "*->grid",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/computed_grid_track_list.h"],
      interpolable: true,
      default_value: "ComputedGridTrackList()",
      type_name: "ComputedGridTrackList",
      style_builder_template: "grid",
      style_builder_template_args: {
        type: "GridTemplateRows",
      },
      keywords: ["none"],
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "height",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "box",
      field_template: "<length>",
      keywords: ["auto", "fit-content", "min-content", "max-content"],
      default_value: "Length()",
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthSizing",
      anchor_mode: "height",
      logical_property_group: {
        name: "size",
        resolver: "vertical",
      },
      supports_incremental_style: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["layout", "scroll-anchor"],
    },
    {
      name: "hyphenate-limit-chars",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "external",
      keywords: ["auto"],
      type_name: "StyleHyphenateLimitChars",
      default_value: "StyleHyphenateLimitChars()",
      include_paths: ["third_party/blink/renderer/core/style/style_hyphenate_limit_chars.h"],
      converter: "ConvertHyphenateLimitChars",
      invalidate: ["layout", "paint"],
    },
    {
      name: "popover-show-delay",
      runtime_flag: "HTMLPopoverActionHover",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "primitive",
      type_name: "float",
      interpolable: true,
      typedom_types: ["Time"],
      converter: "ConvertTimeValue",
      default_value: "0.5",
      supports_incremental_style: true,
    },
    {
      name: "popover-hide-delay",
      runtime_flag: "HTMLPopoverActionHover",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "primitive",
      type_name: "float",
      interpolable: true,
      typedom_types: ["Time"],
      converter: "ConvertTimeValue",
      default_value: "HUGE_VALF",
      supports_incremental_style: true,
    },
    {
      name: "hyphens",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["none", "manual", "auto"],
      default_value: "manual",
      type_name: "Hyphens",
      typedom_types: ["Keyword"],
      valid_for_marker: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "image-rendering",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: [
        "auto", "optimizespeed", "optimizequality",
        "-webkit-optimize-contrast", "pixelated"
      ],
      typedom_types: ["Keyword"],
      default_value: "auto",
      invalidate: ["paint"],
    },
    {
      name: "image-orientation",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "primitive",
      field_size: 1,
      type_name: "RespectImageOrientationEnum",
      default_value: "kRespectImageOrientation",
      converter: "ConvertImageOrientation",
      include_paths: [
        "third_party/blink/renderer/platform/graphics/image_orientation.h"
      ],
      invalidate: ["layout", "paint"],
    },
    {
      name: "dynamic-range-limit",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      runtime_flag: "CSSDynamicRangeLimit",
      converter: "ConvertDynamicRangeLimit",
      type_name: "DynamicRangeLimit",
      field_group: "*",
      field_template: "external",
      keywords: ["standard", "high", "constrained-high"],
      typedom_types: ["Keyword"],
      include_paths: ["third_party/blink/renderer/platform/graphics/graphics_types.h"],
      default_value: "DynamicRangeLimit(cc::PaintFlags::DynamicRangeLimit::kHigh)",
      invalidate: ["paint"],
    },
    {
      name: "initial-letter",
      converter: "ConvertInitialLetter",
      default_value: "StyleInitialLetter()",
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/style_initial_letter.h"],
      inherited: false,
      keywords: ["drop", "normal", "raise"],
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      type_name: "StyleInitialLetter",
      valid_for_first_letter: true,
      invalidate: ["reshape", "layout", "paint"],
    },
    {
      name: "interpolate-size",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["numeric-only", "allow-keywords"],
      typedom_types: ["Keyword"],
      default_value: "numeric-only",
      invalidate: [],
      runtime_flag: "CSSCalcSizeFunction",
    },
    {
      name: "isolation",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["auto", "isolate"],
      typedom_types: ["Keyword"],
      default_value: "auto",
      valid_for_permission_element: true,
      invalidate: ["paint"],
    },
    {
      name: "justify-content",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/style_content_alignment_data.h"],
      default_value: "StyleContentAlignmentData(ContentPosition::kNormal, ContentDistributionType::kDefault, OverflowAlignment::kDefault)",
      type_name: "StyleContentAlignmentData",
      converter: "ConvertContentAlignmentData",
      invalidate: ["layout"],
    },
    {
      name: "justify-items",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/style_self_alignment_data.h"],
      default_value: "StyleSelfAlignmentData(ItemPosition::kLegacy, OverflowAlignment::kDefault)",
      type_name: "StyleSelfAlignmentData",
      converter: "ConvertSelfOrDefaultAlignmentData",
      invalidate: ["layout"],
    },
    {
      name: "justify-self",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/style_self_alignment_data.h"],
      default_value: "StyleSelfAlignmentData(ItemPosition::kAuto, OverflowAlignment::kDefault)",
      type_name: "StyleSelfAlignmentData",
      converter: "ConvertSelfOrDefaultAlignmentData",
      valid_for_position_try: true,
      valid_for_permission_element: true,
      invalidate: ["layout"],
    },
    {
      name: "left",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "surround",
      field_template: "<length>",
      keywords: ["auto"],
      default_value: "Length()",
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthOrAuto",
      anchor_mode: "left",
      logical_property_group: {
        name: "inset",
        resolver: "left",
      },
      supports_incremental_style: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      invalidate: ["inset", "out-of-flow", "scroll-anchor"],
    },
    {
      name: "letter-spacing",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      converter: "ConvertSpacing",
      keywords: ["normal"],
      typedom_types: ["Keyword", "Length"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      affected_by_zoom: true,
    },
    {
      name: "lighting-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      field_group: "svg->misc",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor(Color::kWhite)",
      type_name: "StyleColor",
      style_builder_template: "color",
      style_builder_template_args: {
        initial_color: "ComputedStyleInitialValues::InitialLightingColor",
      },
      converter: "ConvertStyleColor",
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      invalidate: ["paint"],
    },
    {
      name: "line-height",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "inherited",
      field_template: "<length>",
      default_value: "Length::Auto()",
      getter: "SpecifiedLineHeight",
      computed_style_custom_functions: ["getter"],
      converter: "ConvertLineHeight",
      keywords: ["normal"],
      typedom_types: ["Keyword", "Length", "Number", "Percentage"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
      valid_for_page_context: true,
      affected_by_zoom: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "list-style-image",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/style_image.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      typedom_types: ["Keyword", "Image"],
      type_name: "StyleImage",
      style_builder_custom_functions: ["value"],
      keywords: ["none"],
      invalidate: ["layout", "paint"],
      affected_by_zoom: true,
    },
    {
      name: "list-style-position",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      independent: true,
      inherited: true,
      field_template: "keyword",
      keywords: ["outside", "inside"],
      typedom_types: ["Keyword"],
      default_value: "outside",
      invalidate: ["layout", "paint"],
    },
    {
      name: "list-style-type",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/keywords.h",
                      "third_party/blink/renderer/core/style/list_style_type_data.h"],
      wrapper_pointer_name: "Member",
      default_value: "ListStyleTypeData::CreateCounterStyle(keywords::kDisc, nullptr)",
      type_name: "ListStyleTypeData",
      keywords: [
        "disc", "circle", "square", "disclosure-open", "disclosure-closed",
        "decimal", "none"
      ],
      style_builder_custom_functions: ["value"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "margin-bottom",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      converter: "ConvertQuirkyLength",
      computed_style_custom_functions: ["setter"],
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_position_try: true,
      logical_property_group: {
        name: "margin",
        resolver: "bottom",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
      invalidate: ["margin", "out-of-flow", "scroll-anchor"],
    },
    {
      name: "margin-left",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      converter: "ConvertQuirkyLength",
      computed_style_custom_functions: ["setter"],
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_position_try: true,
      logical_property_group: {
        name: "margin",
        resolver: "left",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
      invalidate: ["margin", "out-of-flow", "scroll-anchor"],
    },
    {
      name: "margin-right",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      converter: "ConvertQuirkyLength",
      computed_style_custom_functions: ["setter"],
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_position_try: true,
      logical_property_group: {
        name: "margin",
        resolver: "right",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
      invalidate: ["margin", "out-of-flow", "scroll-anchor"],
    },
    {
      name: "margin-top",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      converter: "ConvertQuirkyLength",
      computed_style_custom_functions: ["setter"],
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_position_try: true,
      logical_property_group: {
        name: "margin",
        resolver: "top",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
      invalidate: ["margin", "out-of-flow", "scroll-anchor"],
    },
    {
      name: "marker-end",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg->inherited_resources",
      field_template: "pointer",
      type_name: "StyleSVGResource",
      include_paths: ["third_party/blink/renderer/core/style/style_svg_resource.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      name_for_methods: "MarkerEndResource",
      converter: "ConvertElementReference",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "marker-mid",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg->inherited_resources",
      field_template: "pointer",
      type_name: "StyleSVGResource",
      include_paths: ["third_party/blink/renderer/core/style/style_svg_resource.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      name_for_methods: "MarkerMidResource",
      converter: "ConvertElementReference",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "marker-start",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg->inherited_resources",
      field_template: "pointer",
      type_name: "StyleSVGResource",
      include_paths: ["third_party/blink/renderer/core/style/style_svg_resource.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      name_for_methods: "MarkerStartResource",
      converter: "ConvertElementReference",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "mask-type",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "svg",
      field_template: "keyword",
      keywords: ["luminance", "alpha"],
      typedom_types: ["Keyword"],
      default_value: "luminance",
      invalidate: ["paint"],
    },
    {
      name: "masonry-template-tracks",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      layout_dependent: true,
      field_group: "*->masonry",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/computed_grid_track_list.h"],
      default_value: "ComputedGridTrackList::DefaultMasonryTrackList()",
      type_name: "ComputedGridTrackList",
      style_builder_template: "grid",
      style_builder_template_args: {
        type: "MasonryTemplateTracks",
      },
      invalidate: ["layout", "paint"],
      runtime_flag: "CSSMasonryLayout",
    },
    {
      name: "masonry-track-end",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/grid_position.h"],
      default_value: "GridPosition()",
      type_name: "GridPosition",
      keywords: ["auto"],
      typedom_types: ["Keyword"],
      converter: "ConvertGridPosition",
      invalidate: ["layout", "paint"],
      runtime_flag: "CSSMasonryLayout",
    },
    {
      name: "masonry-track-start",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/grid_position.h"],
      default_value: "GridPosition()",
      type_name: "GridPosition",
      keywords: ["auto"],
      typedom_types: ["Keyword"],
      converter: "ConvertGridPosition",
      invalidate: ["layout", "paint"],
      runtime_flag: "CSSMasonryLayout",
    },
    {
      name: "math-shift",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      inherited: true,
      keywords: ["normal", "compact"],
      typedom_types: ["Keyword"],
      default_value: "normal",
    },
    {
      name: "math-style",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      inherited: true,
      keywords: ["normal", "compact"],
      typedom_types: ["Keyword"],
      default_value: "normal",
    },
    {
      name: "max-height",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length::None()",
      converter: "ConvertLengthMaxSizing",
      anchor_mode: "height",
      keywords: ["none"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      logical_property_group: {
        name: "max-size",
        resolver: "vertical",
      },
      supports_incremental_style: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["layout", "scroll-anchor"],
    },
    {
      name: "max-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length::None()",
      converter: "ConvertLengthMaxSizing",
      anchor_mode: "width",
      keywords: ["none"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      logical_property_group: {
        name: "max-size",
        resolver: "horizontal",
      },
      supports_incremental_style: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["layout", "scroll-anchor"],
    },
    {
      name: "min-height",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length()",
      converter: "ConvertLengthSizing",
      anchor_mode: "height",
      typedom_types: ["Length", "Percentage"],
      logical_property_group: {
        name: "min-size",
        resolver: "vertical",
      },
      supports_incremental_style: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["layout", "scroll-anchor"],
    },
    {
      name: "min-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length()",
      converter: "ConvertLengthSizing",
      anchor_mode: "width",
      typedom_types: ["Length", "Percentage"],
      logical_property_group: {
        name: "min-size",
        resolver: "horizontal",
      },
      supports_incremental_style: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["layout", "scroll-anchor"],
    },
    {
      name: "mix-blend-mode",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      include_paths: ["third_party/blink/renderer/platform/graphics/graphics_types.h"],
      keywords: [
        "normal", "multiply", "screen", "overlay", "darken", "lighten",
        "color-dodge", "color-burn", "hard-light", "soft-light", "difference",
        "exclusion", "hue", "saturation", "color", "luminosity", "plus-lighter"
      ],
      typedom_types: ["Keyword"],
      default_value: "normal",
      name_for_methods: "BlendMode",
      type_name: "BlendMode",
      invalidate: ["blend-mode", "paint"],
    },
    {
      name: "object-fit",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["fill", "contain", "cover", "none", "scale-down"],
      typedom_types: ["Keyword"],
      default_value: "fill",
      getter: "GetObjectFit",
      invalidate: ["paint"],
    },
    {
      name: "object-position",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/length_point.h"],
      default_value: "LengthPoint(Length::Percent(50.0), Length::Percent(50.0))",
      type_name: "LengthPoint",
      converter: "ConvertPosition",
      typedom_types: ["Keyword", "Position"],
      invalidate: ["paint"],
    },
    {
      name: "object-view-box",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "pointer",
      include_paths: ["third_party/blink/renderer/core/style/basic_shapes.h"],
      wrapper_pointer_name: "scoped_refptr",
      default_value: "nullptr",
      type_name: "BasicShape",
      converter: "ConvertObjectViewBox",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "offset-anchor",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/length_point.h"],
      default_value: "LengthPoint(Length::Auto(), Length::Auto())",
      type_name: "LengthPoint",
      converter: "ConvertPositionOrAuto",
      keywords: ["auto"],
      typedom_types: ["Keyword", "Position"],
      invalidate: ["transform-data", "transform-other"],
    },
    {
      name: "offset-distance",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "<length>",
      default_value: "Length::Fixed(0)",
      converter: "ConvertLength",
      typedom_types: ["Length", "Percentage"],
      invalidate: ["transform-data", "transform-other"],
    },
    {
      name: "offset-path",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "pointer",
      include_paths: ["third_party/blink/renderer/core/style/offset_path_operation.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      type_name: "OffsetPathOperation",
      converter: "ConvertOffsetPath",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      invalidate: ["has-transform", "transform-data", "transform-other"],
    },
    {
      name: "offset-position",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/length_point.h"],
      default_value: "LengthPoint(Length::None(), Length::None())",
      type_name: "LengthPoint",
      converter: "ConvertOffsetPosition",
      keywords: ["auto", "normal"],
      typedom_types: ["Keyword", "Position"],
      invalidate: ["has-transform", "transform-data", "transform-other"],
    },
    {
      name: "offset-rotate",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/style_offset_rotation.h"],
      default_value: "StyleOffsetRotation(0, OffsetRotationType::kAuto)",
      type_name: "StyleOffsetRotation",
      converter: "ConvertOffsetRotate",
      keywords: ["auto", "reverse"],
      typedom_types: ["Keyword", "Angle"],
      invalidate: ["transform-data", "transform-other"],
    },
    {
      name: "opacity",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      compositable: true,
      field_group: "*",
      field_template: "primitive",
      default_value: "1.0",
      type_name: "float",
      computed_style_custom_functions: ["setter"],
      typedom_types: ["Number"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      supports_incremental_style: true,
      accepts_numeric_literal: true,
      invalidate: ["opacity"],
    },
    {
      name: "order",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "primitive",
      default_value: "0",
      type_name: "int",
      typedom_types: ["Number"],
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      // This property is used for testing with origin trial intergration only.
      // It should never be web-exposed.
      name: "origin-trial-test-property",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      default_value: "normal",
      keywords: ["normal", "none"],
      typedom_types: ["Keyword"],
      runtime_flag: "OriginTrialsSampleAPI",
      computable: false,
    },
    {
      name: "orphans",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "primitive",
      computed_style_custom_functions: ["setter"],
      default_value: "2",
      type_name: "short",
      typedom_types: ["Number"],
      valid_for_permission_element: true,
      invalidate: ["layout"],
    },
    {
      name: "outline-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      valid_for_cue: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["outline"],
    },
    {
      name: "outline-offset",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/layout_unit.h"],
      default_value: "LayoutUnit()",
      type_name: "LayoutUnit",
      converter: "ConvertLayoutUnit",
      typedom_types: ["Length"],
      valid_for_cue: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["outline"],
    },
    {
      name: "outline-style",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: [
        "none", "hidden", "inset", "groove", "outset", "ridge", "dotted",
        "dashed", "solid", "double"
      ],
      typedom_types: ["Keyword"],
      default_value: "none",
      type_name: "EBorderStyle",
      style_builder_custom_functions: ["initial", "inherit", "value"],
      valid_for_cue: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["outline"],
    },
    {
      name: "outline-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      default_value: "3",
      type_name: "int",
      computed_style_custom_functions: ["getter"],
      converter: "ConvertBorderWidth",
      keywords: ["thin", "medium", "thick"],
      typedom_types: ["Keyword", "Length"],
      valid_for_cue: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["outline"],
    },
    {
      name: "overflow-anchor",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: false,
      field_template: "keyword",
      keywords: [
        "visible", "none", "auto"
      ],
      typedom_types: ["Keyword"],
      default_value: "auto",
      valid_for_permission_element: true,
    },
    {
      name: "overflow-wrap",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["normal", "break-word", "anywhere"],
      default_value: "normal",
      typedom_types: ["Keyword"],
      valid_for_marker: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "overflow-inline",
      logical_property_group: {
        name: "overflow",
        resolver: "inline",
      },
      runtime_flag: "CSSLogicalOverflow",
      // See comment on overflow-x.
      supports_incremental_style: false,
    },
    {
      name: "-internal-overflow-inline",
      logical_property_group: {
        name: "overflow",
        resolver: "inline",
      },
    },
    {
      name: "overflow-block",
      logical_property_group: {
        name: "overflow",
        resolver: "block",
      },
      runtime_flag: "CSSLogicalOverflow",
      // See comment on overflow-x.
      supports_incremental_style: false,
    },
    {
      name: "-internal-overflow-block",
      logical_property_group: {
        name: "overflow",
        resolver: "block",
      },
    },
    {
      name: "overflow-clip-margin",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_template: "external",
      field_group: "*",
      include_paths: ["third_party/blink/renderer/core/style/style_overflow_clip_margin.h"],
      keywords: ["border-box", "content-box", "padding-box"],
      separator: " ",
      default_value: "std::nullopt",
      type_name: "std::optional<StyleOverflowClipMargin>",
      converter: "ConvertOverflowClipMargin",
      invalidate: ["layout"],
    },
    {
      name: "overflow-x",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      keywords: [
        "visible", "hidden", "scroll", "auto", "overlay", "clip"
      ],
      typedom_types: ["Keyword"],
      default_value: "visible",
      // This is to allow us to gather metrics when overflow is explicitly set.
      style_builder_custom_functions: ["initial", "inherit", "value"],
      type_name: "EOverflow",
      logical_property_group: {
        name: "overflow",
        resolver: "horizontal",
      },
      // Overflow has special semantics; overflowY can influence overflowX.
      // But StyleAdjuster::AdjustOverflow() only does this properly if overflowX
      // is set to the initial value (it cannot distinguish between an explicitly
      // set overflowX, and one that was already adjusted in a previous pass).
      // Modifying overflow frequently should not be common, so we take it out.
      supports_incremental_style: false,
      idempotent: false,
      invalidate: ["layout", "paint"],
    },
    {
      name: "overflow-y",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      keywords: [
        "visible", "hidden", "scroll", "auto", "overlay", "clip"
      ],
      typedom_types: ["Keyword"],
      default_value: "visible",
      // This is to allow us to gather metrics when overflow is explicitly set.
      style_builder_custom_functions: ["initial", "inherit", "value"],
      type_name: "EOverflow",
      logical_property_group: {
        name: "overflow",
        resolver: "vertical",
      },
      // See comment on overflow-x.
      supports_incremental_style: false,
      idempotent: false,
      invalidate: ["layout", "paint"],
    },
    {
      name: "overscroll-behavior-inline",
      logical_property_group: {
        name: "overscroll-behavior",
        resolver: "inline",
      },
      valid_for_permission_element: true,
    },
    {
      name: "overscroll-behavior-block",
      logical_property_group: {
        name: "overscroll-behavior",
        resolver: "block",
      },
      valid_for_permission_element: true,
    },
    {
      name: "overscroll-behavior-x",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      field_group: "*",
      keywords: ["auto", "contain", "none"],
      default_value: "auto",
      type_name: "EOverscrollBehavior",
      typedom_types: ["Keyword"],
      logical_property_group: {
        name: "overscroll-behavior",
        resolver: "horizontal",
      },
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "overscroll-behavior-y",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      field_group: "*",
      keywords: ["auto", "contain", "none"],
      default_value: "auto",
      type_name: "EOverscrollBehavior",
      typedom_types: ["Keyword"],
      logical_property_group: {
        name: "overscroll-behavior",
        resolver: "vertical",
      },
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "padding-bottom",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      converter: "ConvertLength",
      computed_style_custom_functions: ["setter"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_page_context: true,
      logical_property_group: {
        name: "padding",
        resolver: "bottom",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      invalidate: ["layout", "paint", "scroll-anchor"],
    },
    {
      name: "padding-left",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      converter: "ConvertLength",
      computed_style_custom_functions: ["setter"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_page_context: true,
      logical_property_group: {
        name: "padding",
        resolver: "left",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      invalidate: ["layout", "paint", "scroll-anchor"],
    },
    {
      name: "padding-right",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      converter: "ConvertLength",
      computed_style_custom_functions: ["setter"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_page_context: true,
      logical_property_group: {
        name: "padding",
        resolver: "right",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      invalidate: ["layout", "paint", "scroll-anchor"],
    },
    {
      name: "padding-top",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "box",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      converter: "ConvertLength",
      computed_style_custom_functions: ["setter"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_page_context: true,
      logical_property_group: {
        name: "padding",
        resolver: "top",
      },
      supports_incremental_style: true,
      valid_for_permission_element: true,
      invalidate: ["layout", "paint", "scroll-anchor"],
    },
    {
      name: "page",
      field_group: "*",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      converter: "ConvertPage",
      type_name: "AtomicString",
      default_value: "AtomicString()",
      field_template: "external",
      keywords: ["auto"],
      typedom_types: ["Keyword"],
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "page-orientation",
      is_descriptor: true,
      field_template: "primitive",
      field_group: "*",
      type_name: "PageOrientation",
      field_size: 2,
      default_value: "PageOrientation::kUpright",
      include_paths: ["third_party/blink/public/common/css/page_orientation.h"],
      computable: false,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
    },
    {
      name: "paint-order",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg",
      field_template: "primitive",
      field_size: 3,
      type_name: "EPaintOrder",
      default_value: "kPaintOrderNormal",
      converter: "ConvertPaintOrder",
      keywords: ["normal", "fill", "stroke", "markers"],
      typedom_types: ["Keyword"],
      invalidate: ["paint"],
    },
    {
      name: "perspective",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "primitive",
      default_value: "-1.0",
      type_name: "float",
      converter: "ConvertPerspective",
      keywords: ["none"],
      typedom_types: ["Keyword", "Length"],
      invalidate: ["transform-other"],
    },
    {
      name: "perspective-origin",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/length_point.h"],
      default_value: "LengthPoint(Length::Percent(50.0), Length::Percent(50.0))",
      type_name: "LengthPoint",
      converter: "ConvertPosition",
      typedom_types: ["Position"],
      // Overlaps with -webkit-perspective-origin-[x,y].
      overlapping: true,
      invalidate: ["transform-other"],
    },
    {
      name: "pointer-events",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      computed_style_protected_functions: ["getter"],
      independent: true,
      inherited: true,
      field_template: "keyword",
      keywords: [
        "none", "auto", "stroke", "fill", "painted", "visible", "visiblestroke",
        "visiblefill", "visiblepainted", "bounding-box", "all"
      ],
      typedom_types: ["Keyword"],
      default_value: "auto",
    },
    {
      name: "position",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      keywords: [
        "static", "relative", "absolute", "fixed", "sticky"
      ],
      typedom_types: ["Keyword"],
      default_value: "static",
      getter: "GetPosition",
      computed_style_custom_functions: ["getter"],
      // See comment on display.
      supports_incremental_style: false,
      // @position-try-styling rely on this being high-priority, so that
      // declarations from @position-try blocks can be applied conditionally
      // based on whether or not we're out-of-flow positioned. Also, it needs to
      // have a priority higher than position-area which is already at priority:1.
      priority: 2,
      valid_for_permission_element: true,
      invalidate: ["clip", "layout", "scroll-anchor"],
    },
    {
      name: "position-anchor",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal" ],
      style_builder_custom_functions: ["initial", "inherit", "value"],
      include_paths: ["third_party/blink/renderer/core/style/scoped_css_name.h"],
      type_name: "ScopedCSSName",
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      field_group: "*",
      field_template: "external",
      converter: "ConvertPositionAnchor",
      keywords: ["auto"],
      typedom_types: ["Keyword"],
      valid_for_permission_element: true,
      valid_for_position_try: true,
      // Needs to be applied before position-area which in turn needs to be applied
      // before inset properties.
      priority: 2,
      invalidate: ["layout", "paint"],
    },
    {
      name: "position-try-fallbacks",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      style_builder_custom_functions: ["value"],
      field_group: "*",
      field_template: "external",
      keywords: ["none", "flip-block", "flip-inline", "flip-start"],
      typedom_types: ["Keyword"],
      include_paths: ["third_party/blink/renderer/core/style/position_try_fallbacks.h"],
      wrapper_pointer_name: "Member",
      type_name: "PositionTryFallbacks",
      default_value: "nullptr",
      invalidate: ["layout", "paint"],
      runtime_flag: "CSSPositionTryFallbacks",
    },
    {
      name: "position-try-options",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      surrogate_for: "position-try-fallbacks",
      runtime_flag: "CSSPositionTryOptions",
    },
    {
      name: "position-try-order",
      property_methods: ["CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["normal", "most-width", "most-height", "most-block-size", "most-inline-size"],
      typedom_types: ["Keyword"],
      default_value: "normal",
      invalidate: ["layout", "paint"],
    },
    {
      name: "position-visibility",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_size: 3,
      field_template: "primitive",
      default_value: "PositionVisibility::kAlways",
      getter: "GetPositionVisibility",
      type_name: "PositionVisibility",
      converter: "ConvertPositionVisibility",
      // TODO(crbug.com/332933527): Support anchors-valid.
      keywords: ["always", "anchors-visible", "no-overflow"],
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "quotes",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "pointer",
      include_paths: ["third_party/blink/renderer/platform/text/quotes_data.h"],
      wrapper_pointer_name: "scoped_refptr",
      default_value: "nullptr",
      type_name: "QuotesData",
      converter: "ConvertQuotes",
      keywords: ["auto", "none"],
      typedom_types: ["Keyword"],
      computable: false,
      valid_for_page_context: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "content-visibility",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      keywords: ["visible", "auto", "hidden"],
      default_value: "visible",
      typedom_types: ["Keyword"],
      computable: false,
      valid_for_permission_element: true,
      invalidate: ["layout"],
    },
    {
      name: "reading-flow",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["normal", "flex-visual", "flex-flow", "grid-rows", "grid-columns", "grid-order"],
      typedom_types: ["Keyword"],
      default_value: "normal",
      invalidate: ["layout"],
      runtime_flag: "CSSReadingFlow",
    },
    {
      name: "resize",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      computed_style_protected_functions: ["getter"],
      style_builder_custom_functions: ["value"],
      keywords: ["none", "both", "horizontal", "vertical", "block", "inline"],
      typedom_types: ["Keyword"],
      default_value: "none",
      invalidate: ["paint"],
    },
    {
      name: "right",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "surround",
      field_template: "<length>",
      keywords: ["auto"],
      default_value: "Length()",
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthOrAuto",
      anchor_mode: "right",
      logical_property_group: {
        name: "inset",
        resolver: "right",
      },
      supports_incremental_style: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      invalidate: ["inset", "out-of-flow", "scroll-anchor"],
    },
    {
      name: "r",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "svg->geometry",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      typedom_types: ["Length", "Percentage"],
      converter: "ConvertLength",
      supports_incremental_style: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "rx",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "svg->geometry",
      field_template: "<length>",
      default_value: "Length::Auto()",
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthOrAuto",
      supports_incremental_style: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "ry",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "svg->geometry",
      field_template: "<length>",
      default_value: "Length::Auto()",
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthOrAuto",
      supports_incremental_style: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "scroll-marker-group",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["none", "after", "before"],
      typedom_types: ["Keyword"],
      default_value: "none",
      runtime_flag: "CSSPseudoScrollMarkers",
    },
    {
      interpolable: true,
      name: "scrollbar-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      name_for_methods: "ScrollbarColor",
      type_name: "StyleScrollbarColor",
      converter: "ConvertScrollbarColor",
      keywords: ["auto"],
      field_group: "*",
      field_template: "pointer",
      default_value: "nullptr",
      wrapper_pointer_name: "Member",
      include_paths: ["third_party/blink/renderer/core/style/style_scrollbar_color.h"],
      invalidate: ["scrollbar-style", "scrollbar-color"],
      runtime_flag: "ScrollbarColor",
    },
    {
      name: "scrollbar-gutter",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: false,
      field_size: 4,
      field_template: "primitive",
      default_value: "kScrollbarGutterAuto",
      name_for_methods: "ScrollbarGutter",
      type_name: "unsigned",
      converter: "ConvertScrollbarGutter",
      keywords: [
        "auto", "stable", "both-edges"
      ],
      typedom_types: ["Keyword"],
      invalidate: ["layout"],
    },
    {
      name: "scrollbar-width",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: false,
      field_group: "*",
      field_template: "keyword",
      keywords: ["auto", "thin", "none"],
      default_value: "auto",
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint", "scrollbar-style"],
      runtime_flag: "ScrollbarWidth",
    },
    {
      name: "scroll-behavior",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_size: 2, // FIXME: Convert this to a keyword field
      field_template: "primitive",
      include_paths: ["third_party/blink/public/mojom/scroll/scroll_enums.mojom-blink.h"],
      default_value: "mojom::blink::ScrollBehavior::kAuto",
      type_name: "mojom::blink::ScrollBehavior",
      keywords: ["auto", "smooth"],
      typedom_types: ["Keyword"],
    },
    {
      name: "scroll-margin-block-end",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "scroll-margin",
        resolver: "block-end",
      },
      typedom_types: ["Keyword", "Length"],
      valid_for_permission_element: true,
    },
    {
      name: "scroll-margin-block-start",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "scroll-margin",
        resolver: "block-start",
      },
      typedom_types: ["Keyword", "Length"],
      valid_for_permission_element: true,
    },
    {
      name: "scroll-margin-bottom",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "primitive",
      default_value: "0.0f",
      type_name: "float",
      converter: "ConvertComputedLength<float>",
      typedom_types: ["Keyword", "Length"],
      logical_property_group: {
        name: "scroll-margin",
        resolver: "bottom",
      },
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "scroll-margin-inline-end",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "scroll-margin",
        resolver: "inline-end",
      },
      typedom_types: ["Keyword", "Length"],
      valid_for_permission_element: true,
    },
    {
      name: "scroll-margin-inline-start",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "scroll-margin",
        resolver: "inline-start",
      },
      typedom_types: ["Keyword", "Length"],
      valid_for_permission_element: true,
    },
    {
      name: "scroll-margin-left",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "primitive",
      default_value: "0.0f",
      type_name: "float",
      converter: "ConvertComputedLength<float>",
      typedom_types: ["Keyword", "Length"],
      logical_property_group: {
        name: "scroll-margin",
        resolver: "left",
      },
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "scroll-margin-right",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "primitive",
      default_value: "0.0f",
      type_name: "float",
      converter: "ConvertComputedLength<float>",
      typedom_types: ["Keyword", "Length"],
      logical_property_group: {
        name: "scroll-margin",
        resolver: "right",
      },
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "scroll-margin-top",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "primitive",
      default_value: "0.0f",
      type_name: "float",
      converter: "ConvertComputedLength<float>",
      typedom_types: ["Keyword", "Length"],
      logical_property_group: {
        name: "scroll-margin",
        resolver: "top",
      },
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "scroll-padding-block-end",
      property_methods: ["ParseSingleValue"],
      include_paths: ["third_party/blink/renderer/platform/geometry/length.h"],
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      type_name: "Length",
      converter: "ConvertLengthOrAuto",
      logical_property_group: {
        name: "scroll-padding",
        resolver: "block-end",
      },
      valid_for_permission_element: true,
    },
    {
      name: "scroll-padding-block-start",
      property_methods: ["ParseSingleValue"],
      include_paths: ["third_party/blink/renderer/platform/geometry/length.h"],
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      type_name: "Length",
      converter: "ConvertLengthOrAuto",
      logical_property_group: {
        name: "scroll-padding",
        resolver: "block-start",
      },
      valid_for_permission_element: true,
    },
    {
      name: "scroll-padding-bottom",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "<length>",
      default_value: "Length()",
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthOrAuto",
      logical_property_group: {
        name: "scroll-padding",
        resolver: "bottom",
      },
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "scroll-padding-inline-end",
      property_methods: ["ParseSingleValue"],
      include_paths: ["third_party/blink/renderer/platform/geometry/length.h"],
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      type_name: "Length",
      converter: "ConvertLengthOrAuto",
      logical_property_group: {
        name: "scroll-padding",
        resolver: "inline-end",
      },
      valid_for_permission_element: true,
    },
    {
      name: "scroll-padding-inline-start",
      property_methods: ["ParseSingleValue"],
      include_paths: ["third_party/blink/renderer/platform/geometry/length.h"],
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      type_name: "Length",
      converter: "ConvertLengthOrAuto",
      logical_property_group: {
        name: "scroll-padding",
        resolver: "inline-start",
      },
      valid_for_permission_element: true,
    },
    {
      name: "scroll-padding-left",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "<length>",
      default_value: "Length()",
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthOrAuto",
      logical_property_group: {
        name: "scroll-padding",
        resolver: "left",
      },
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "scroll-padding-right",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "<length>",
      default_value: "Length()",
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthOrAuto",
      logical_property_group: {
        name: "scroll-padding",
        resolver: "right",
      },
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "scroll-padding-top",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "<length>",
      default_value: "Length()",
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthOrAuto",
      logical_property_group: {
        name: "scroll-padding",
        resolver: "top",
      },
      computable: false,
      valid_for_permission_element: true,
    },
    {
      name: "scroll-snap-align",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["cc/input/scroll_snap_data.h"],
      default_value: "cc::ScrollSnapAlign()",
      getter: "GetScrollSnapAlign",
      type_name: "cc::ScrollSnapAlign",
      converter: "ConvertSnapAlign",
      keywords: ["none", "start", "end", "center"],
      typedom_types: ["Keyword"],
      computable: false,
    },
    {
      name: "scroll-snap-stop",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      keywords: ["normal", "always"],
      default_value: "normal",
      typedom_types: ["Keyword"],
      computable: false,
    },
    {
      name: "scroll-snap-type",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "external",
      include_paths: ["cc/input/scroll_snap_data.h"],
      default_value: "cc::ScrollSnapType()",
      getter: "GetScrollSnapType",
      type_name: "cc::ScrollSnapType",
      converter: "ConvertSnapType",
      keywords: ["none", "x", "y", "block", "inline", "both", "mandatory", "proximity"],
      typedom_types: ["Keyword"],
      computable: false,
    },
    {
      name: "scroll-start-x",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*->start",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/scroll_start_data.h"],
      default_value: "blink::ScrollStartData()",
      type_name: "ScrollStartData",
      converter: "ConvertScrollStart",
      logical_property_group : {
        name: "scroll-start",
        resolver: "horizontal"
      },
      runtime_flag: "CSSScrollStart",
    },
    {
      name: "scroll-start-y",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*->start",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/scroll_start_data.h"],
      default_value: "blink::ScrollStartData()",
      type_name: "ScrollStartData",
      converter: "ConvertScrollStart",
      logical_property_group : {
        name: "scroll-start",
        resolver: "vertical"
      },
      runtime_flag: "CSSScrollStart",
    },
    {
      name: "scroll-start-target-x",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*->target",
      field_template: "keyword",
      type_name: "EScrollStartTarget",
      default_value: "none",
      logical_property_group: {
        name: "scroll-start-target",
        resolver: "horizontal"
      },
      keywords: ["none", "auto"],
      invalidate: ["layout"],
      runtime_flag: "CSSScrollStartTarget",
    },
    {
      name: "scroll-start-target-y",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*->target",
      field_template: "keyword",
      type_name: "EScrollStartTarget",
      default_value: "none",
      logical_property_group: {
        name: "scroll-start-target",
        resolver: "vertical"
      },
      keywords: ["none", "auto"],
      invalidate: ["layout"],
      runtime_flag: "CSSScrollStartTarget",
    },
    {
      name: "scroll-timeline-axis",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*->timeline",
      field_template: "external",
      default_value: "Vector<TimelineAxis>()",
      type_name: "Vector<TimelineAxis>",
      converter: "ConvertViewTimelineAxis",
      separator: ",",
      runtime_flag: "ScrollTimeline",
    },
    {
      name: "scroll-timeline-name",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*->timeline",
      field_template: "external",
      default_value: "nullptr",
      type_name: "ScopedCSSNameList",
      wrapper_pointer_name: "Member",
      converter: "ConvertViewTimelineName",
      separator: ",",
      runtime_flag: "ScrollTimeline",
    },
    {
      name: "shape-image-threshold",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "primitive",
      default_value: "0.0",
      type_name: "float",
      computed_style_custom_functions: ["setter"],
      typedom_types: ["Number"],
      accepts_numeric_literal: true,
    },
    {
      name: "shape-margin",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "<length>",
      default_value: "Length::Fixed(0)",
      converter: "ConvertLength",
      keywords: ["none"],
      typedom_types: ["Length", "Percentage"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "shape-outside",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/shape_value.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      typedom_types: ["Keyword", "Image"],
      type_name: "ShapeValue",
      computed_style_custom_functions: ["getter"],
      converter: "ConvertShapeValue",
      keywords: ["none"],
      invalidate: ["paint"],
    },
    {
      name: "shape-rendering",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg",
      field_template: "keyword",
      keywords: ["auto", "optimizespeed", "crispedges", "geometricprecision"],
      default_value: "auto",
      typedom_types: ["Keyword"],
      invalidate: ["paint"],
    },
    {
      name: "size",
      property_methods: ["ParseSingleValue"],
      style_builder_custom_functions: ["initial", "inherit", "value"],
      computable: false,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
    },
    {
      name: "speak",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: [
        "none", "normal", "spell-out", "digits", "literal-punctuation",
        "no-punctuation"
      ],
      default_value: "normal",
    },
    {
      name: "stop-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      field_group: "svg->stop",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor(Color::kBlack)",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      style_builder_template: "color",
      style_builder_template_args: {
        initial_color: "ComputedStyleInitialValues::InitialStopColor",
      },
      converter: "ConvertStyleColor",
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      invalidate: ["paint"],
    },
    {
      name: "stop-opacity",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "svg->stop",
      field_template: "primitive",
      type_name: "float",
      default_value: "1",
      converter: "ConvertAlpha",
      typedom_types: ["Number"],
      accepts_numeric_literal: true,
      invalidate: ["paint"],
    },
    {
      name: "stroke",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      inherited: true,
      field_group: "svg->stroke",
      field_template: "external",
      type_name: "SVGPaint",
      include_paths: ["third_party/blink/renderer/core/style/svg_paint.h"],
      default_value: "SVGPaint()",
      name_for_methods: "StrokePaint",
      converter: "ConvertSVGPaint",
      style_builder_template: "color",
      style_builder_template_args: {
        initial_color: "ComputedStyleInitialValues::InitialStrokePaint",
      },
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["paint", "stroke"],
    },
    {
      name: "stroke-dasharray",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "svg->stroke",
      field_template: "pointer",
      type_name: "SVGDashArray",
      include_paths: ["third_party/blink/renderer/core/style/svg_dash_array.h"],
      wrapper_pointer_name: "scoped_refptr",
      default_value: "EmptyDashArray()",
      name_for_methods: "StrokeDashArray",
      converter: "ConvertStrokeDasharray",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      invalidate: ["paint", "stroke"],
      affected_by_zoom: true,
    },
    {
      name: "stroke-dashoffset",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "svg->stroke",
      field_template: "external",
      type_name: "Length",
      default_value: "Length::Fixed()",
      name_for_methods: "StrokeDashOffset",
      converter: "ConvertLength",
      typedom_types: ["Length", "Percentage"],
      invalidate: ["paint"],
      affected_by_zoom: true,
    },
    {
      name: "stroke-linecap",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg->stroke",
      field_template: "primitive",
      field_size: 2,
      type_name: "LineCap",
      default_value: "kButtCap",
      name_for_methods: "CapStyle",
      keywords: ["butt", "round", "square"],
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "stroke-linejoin",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg->stroke",
      field_template: "primitive",
      field_size: 2,
      type_name: "LineJoin",
      default_value: "kMiterJoin",
      name_for_methods: "JoinStyle",
      keywords: ["miter", "bevel", "round"],
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "stroke-miterlimit",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "svg->stroke",
      field_template: "primitive",
      type_name: "float",
      default_value: "4",
      name_for_methods: "StrokeMiterLimit",
      typedom_types: ["Number"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "stroke-opacity",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "svg->stroke",
      field_template: "primitive",
      type_name: "float",
      default_value: "1",
      converter: "ConvertAlpha",
      typedom_types: ["Number"],
      accepts_numeric_literal: true,
      invalidate: ["paint"],
    },
    {
      name: "stroke-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "svg->stroke",
      field_template: "external",
      type_name: "UnzoomedLength",
      include_paths: ["third_party/blink/renderer/core/style/unzoomed_length.h"],
      default_value: "UnzoomedLength(Length::Fixed(1))",
      converter: "ConvertUnzoomedLength",
      typedom_types: ["Length", "Percentage"],
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["layout", "paint"],
      affected_by_zoom: true,
    },
    {
      name: "table-layout",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      keywords: [
        "auto", "fixed"
      ],
      typedom_types: ["Keyword"],
      default_value: "auto",
      invalidate: ["layout", "paint"],
    },
    {
      name: "tab-size",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/text/tab_size.h"],
      default_value: "TabSize(8)",
      getter: "GetTabSize",
      type_name: "TabSize",
      converter: "ConvertLengthOrTabSpaces",
      computed_style_custom_functions: ["setter"],
      typedom_types: ["Number", "Length"],
      valid_for_marker: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "text-align",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      independent: false,
      inherited: true,
      field_template: "keyword",
      keywords: [
        "left", "right", "center", "justify", "-webkit-left", "-webkit-right",
        "-webkit-center", "start", "end"
      ],
      typedom_types: ["Keyword"],
      default_value: "start",
      getter: "GetTextAlign",
      style_builder_custom_functions: ["value"],
      valid_for_page_context: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "text-align-last",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["auto", "start", "end", "left", "right", "center", "justify"],
      default_value: "auto",
      typedom_types: ["Keyword"],
      valid_for_page_context: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "text-anchor",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "svg",
      field_template: "keyword",
      keywords: ["start", "middle", "end"],
      default_value: "start",
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "text-autospace",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["normal", "no-autospace"],
      default_value: "normal",
      typedom_types: ["Keyword"],
      invalidate: ["reshape"],
      runtime_flag: "CSSTextAutoSpace",
    },
    {
      name: "text-box",
      longhands: ["text-box-trim", "text-box-edge"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      runtime_flag: "CSSTextBoxTrim",
    },
    {
      name: "text-box-edge",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "primitive",
      field_size: 6,  // Sync with `TextBoxEdge::kBits`.
      include_paths: ["third_party/blink/renderer/core/style/text_box_edge.h"],
      default_value: "TextBoxEdge()",
      type_name: "TextBoxEdge",
      converter: "ConvertTextBoxEdge",
      invalidate: ["layout"],
      runtime_flag: "CSSTextBoxTrim",
    },
    {
      name: "text-box-trim",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "box",
      field_template: "keyword",
      default_value: "none",
      keywords: ["none", "trim-start", "trim-end", "trim-both"],
      typedom_types: ["Keyword"],
      invalidate: ["layout"],
      runtime_flag: "CSSTextBoxTrim",
    },
    {
      name: "text-combine-upright",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["none", "all"],
      typedom_types: ["Keyword"],
      default_value: "none",
      name_for_methods: "TextCombine",
      valid_for_marker: true,
      computable: false,
      invalidate: ["layout", "paint"],
    },
    {
      name: "text-decoration-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      supports_incremental_style: true,
      valid_for_page_context: true,
      invalidate: ["color"],
    },
    {
      name: "text-decoration-line",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "visual",
      field_template: "multi_keyword",
      keywords: ["none", "underline", "overline", "line-through", "blink", "spelling-error", "grammar-error"],
      typedom_types: ["Keyword"],
      default_value: "none",
      type_name: "TextDecorationLine",
      converter: "ConvertFlags<blink::TextDecorationLine>",
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      valid_for_page_context: true,
      invalidate: ["text-decoration"],
    },
    {
      name: "text-decoration-skip-ink",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["none", "auto"],
      typedom_types: ["Keyword"],
      default_value: "auto",
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      valid_for_page_context: true,
      invalidate: ["text-decoration"],
    },
    {
      name: "text-decoration-style",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["solid", "double", "dotted", "dashed", "wavy"],
      typedom_types: ["Keyword"],
      default_value: "solid",
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      valid_for_page_context: true,
      invalidate: ["text-decoration"],
    },
    {
      name: "text-decoration-thickness",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      include_paths: ["third_party/blink/renderer/core/style/text_decoration_thickness.h"],
      inherited: false,
      field_group: "*",
      field_template: "external",
      type_name: "TextDecorationThickness",
      default_value: "TextDecorationThickness(Length::Auto())",
      converter: "ConvertTextDecorationThickness",
      keywords: ["auto", "from-font"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      computable: false,
      valid_for_page_context: true,
      invalidate: ["text-decoration"],
    },
    {
      name: "text-indent",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      style_builder_custom_functions: ["value"],
      typedom_types: ["Length", "Percentage"],
      valid_for_page_context: true,
      invalidate: ["layout", "paint"],
      affected_by_zoom: true,
    },
    {
      name: "text-overflow",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["clip", "ellipsis"],
      typedom_types: ["Keyword"],
      default_value: "clip",
      valid_for_page_context: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "text-shadow",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "pointer",
      include_paths: ["third_party/blink/renderer/core/style/shadow_list.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      type_name: "ShadowList",
      converter: "ConvertShadowList",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      valid_for_page_context: true,
      invalidate: ["layout", "paint"],
      affected_by_zoom: true,
    },
    {
      name: "text-size-adjust",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/text_size_adjust.h"],
      style_builder_custom_functions: ["initial", "inherit", "value"],
      default_value: "TextSizeAdjust::AdjustAuto()",
      getter: "GetTextSizeAdjust",
      // When `TextSizeAdjustImprovements` is enabled, this affects font-size
      // during style building and needs to apply before it.
      priority: 2,
      type_name: "TextSizeAdjust",
      converter: "ConvertTextSizeAdjust",
      keywords: ["none", "auto"],
      typedom_types: ["Keyword", "Percentage"],
      // When `TextSizeAdjustImprovements` is enabled, this affects font-size
      // during style building. Changes to anything related to fonts require
      // that we call style.UpdateFont(), which the incremental path does not
      // do.
      supports_incremental_style: false,
      invalidate: ["layout", "paint"],
    },
    {
      name: "text-spacing",
      longhands: ["text-autospace", "text-spacing-trim"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      runtime_flag: "CSSTextSpacing",
    },
    {
      name: "text-spacing-trim",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      font: true,
      priority: 1,
      type_name: "TextSpacingTrim",
      include_paths: ["third_party/blink/renderer/platform/fonts/shaping/text_spacing_trim.h"],
      keywords: ["normal", "space-all", "space-first", "trim-start"],
      default_value: "TextSpacingTrim::kInitial",
      typedom_types: ["Keyword"],
      valid_for_permission_element: true,
    },
    {
      name: "text-transform",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      independent: true,
      inherited: true,
      field_template: "keyword",
      keywords: ["capitalize", "uppercase", "lowercase", "none", "math-auto"],
      typedom_types: ["Keyword"],
      default_value: "none",
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      valid_for_page_context: true,
      invalidate: ["reshape"],
    },
    {
      name: "text-underline-offset",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "<length>",
      default_value: "Length()",
      name_for_methods: "TextUnderlineOffset",
      converter: "ConvertTextUnderlineOffset",
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      computable: false,
      valid_for_highlight: true,
      valid_for_page_context: true,
      invalidate: ["text-decoration"],
      affected_by_zoom: true,
    },
    {
      name: "text-underline-position",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_size: 4,
      field_template: "primitive",
      default_value: "TextUnderlinePosition::kAuto",
      getter: "GetTextUnderlinePosition",
      type_name: "TextUnderlinePosition",
      converter: "ConvertTextUnderlinePosition",
      keywords: ["auto", "from-font", "under", "left", "right"],
      typedom_types: ["Keyword"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_page_context: true,
      invalidate: ["text-decoration"],
    },
    {
      name: "timeline-scope",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*->timeline",
      field_template: "external",
      default_value: "nullptr",
      type_name: "ScopedCSSNameList",
      wrapper_pointer_name: "Member",
      converter: "ConvertTimelineScope",
      separator: ",",
      runtime_flag: "TimelineScope",
    },
    {
      name: "top",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "surround",
      field_template: "<length>",
      keywords: ["auto"],
      default_value: "Length()",
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthOrAuto",
      anchor_mode: "top",
      logical_property_group: {
        name: "inset",
        resolver: "top",
      },
      supports_incremental_style: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      invalidate: ["inset", "out-of-flow", "scroll-anchor"],
    },
    {
      name: "overlay",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["none", "auto"],
      default_value: "none",
      typedom_types: ["Keyword"],
    },
    {
      name: "touch-action",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_size: 8, // FIXME: Make this use "kTouchActionBits".
      field_template: "primitive",
      include_paths: ["third_party/blink/renderer/platform/graphics/touch_action.h"],
      default_value: "TouchAction::kAuto",
      type_name: "TouchAction",
      converter: "ConvertFlags<blink::TouchAction>",
      keywords: ["auto", "none", "pan-x", "pan-left", "pan-right", "pan-y", "pan-up", "pan-down", "pinch-zoom", "manipulation"],
      typedom_types: ["Keyword"],
    },
    {
      name: "transform",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      compositable: true,
      layout_dependent: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/transforms/transform_operations.h"],
      keywords: ["none"],
      default_value: "EmptyTransformOperations()",
      typedom_types: ["Keyword", "Transform"],
      type_name: "TransformOperations",
      converter: "ConvertTransformOperations",
      supports_incremental_style: true,
      invalidate: ["has-transform", "transform-data", "transform-property"],
    },
    {
      name: "transform-box",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      keywords: ["content-box", "border-box", "fill-box", "stroke-box", "view-box"],
      default_value: "view-box",
      typedom_types: ["Keyword"],
      computable: false,
      supports_incremental_style: true,
      invalidate: ["transform-data", "transform-other"],
    },
    {
      name: "transform-origin",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "svg",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/transform_origin.h"],
      default_value: "TransformOrigin(Length::Percent(50.0), Length::Percent(50.0), 0)",
      getter: "GetTransformOrigin",
      type_name: "TransformOrigin",
      converter: "ConvertTransformOrigin",
      supports_incremental_style: true,
      // Overlaps with -webkit-transform-origin-[x,y,z].
      overlapping: true,
      invalidate: ["transform-data", "transform-other"],
    },
    {
      name: "transform-style",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["flat", "preserve-3d"],
      default_value: "flat",
      typedom_types: ["Keyword"],
      name_for_methods: "TransformStyle3D",
      supports_incremental_style: true,
    },
    {
      name: "translate",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      compositable: true,
      layout_dependent: true,
      field_group: "*",
      field_template: "pointer",
      include_paths: ["third_party/blink/renderer/platform/transforms/translate_transform_operation.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      type_name: "TranslateTransformOperation",
      converter: "ConvertTranslate",
      supports_incremental_style: true,
      invalidate: ["has-transform", "transform-data", "transform-other"],
    },
    {
      name: "rotate",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      compositable: true,
      field_group: "*",
      field_template: "pointer",
      include_paths: ["third_party/blink/renderer/platform/transforms/rotate_transform_operation.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      type_name: "RotateTransformOperation",
      converter: "ConvertRotate",
      supports_incremental_style: true,
      invalidate: ["has-transform", "transform-data", "transform-other"],
    },
    {
      name: "scale",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      compositable: true,
      field_group: "*",
      field_template: "pointer",
      include_paths: ["third_party/blink/renderer/platform/transforms/scale_transform_operation.h"],
      wrapper_pointer_name: "Member",
      default_value: "nullptr",
      type_name: "ScaleTransformOperation",
      converter: "ConvertScale",
      supports_incremental_style: true,
      invalidate: ["has-transform", "transform-data", "transform-other"],
    },
    {
      name: "unicode-bidi",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      affected_by_all: false,
      field_template: "keyword",
      include_paths: ["third_party/blink/renderer/platform/text/unicode_bidi.h"],
      keywords: [
        "normal", "embed", "bidi-override", "isolate", "plaintext",
        "isolate-override"
      ],
      typedom_types: ["Keyword"],
      default_value: "normal",
      type_name: "UnicodeBidi",
      valid_for_marker: true,
      invalidate: ["reshape"],
    },
    {
      name: "vector-effect",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "svg",
      field_template: "keyword",
      keywords: ["none", "non-scaling-stroke"],
      typedom_types: ["Keyword"],
      default_value: "none",
      invalidate: ["layout", "paint"],
    },
    {
      name: "vertical-align",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      style_builder_custom_functions: ["inherit", "value"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      keywords: ["baseline", "sub", "super", "text-top", "text-bottom", "middle"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_page_context: true,
    },
    {
      name: "view-timeline-axis",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*->timeline",
      field_template: "external",
      default_value: "Vector<TimelineAxis>()",
      type_name: "Vector<TimelineAxis>",
      converter: "ConvertViewTimelineAxis",
      separator: ",",
      runtime_flag: "ScrollTimeline",
    },
    {
      name: "view-timeline-inset",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*->timeline",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/animation/timeline_inset.h"],
      default_value: "Vector<TimelineInset>()",
      type_name: "Vector<TimelineInset>",
      converter: "ConvertViewTimelineInset",
      separator: ",",
      runtime_flag: "ScrollTimeline",
    },
    {
      name: "view-timeline-name",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      field_group: "*->timeline",
      field_template: "external",
      default_value: "nullptr",
      type_name: "ScopedCSSNameList",
      wrapper_pointer_name: "Member",
      converter: "ConvertViewTimelineName",
      separator: ",",
      runtime_flag: "ScrollTimeline",
    },
    {
      name: "view-transition-class",
      field_group: "*",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      converter: "ConvertViewTransitionClass",
      type_name: "ScopedCSSNameList",
      default_value: "nullptr",
      wrapper_pointer_name: "Member",
      field_template: "external",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      runtime_flag: "CSSViewTransitionClass",
    },
    {
      name: "view-transition-group",
      field_group: "*",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      converter: "ConvertViewTransitionGroup",
      type_name: "StyleViewTransitionGroup",
      default_value: "StyleViewTransitionGroup::Normal()",
      include_paths: ["third_party/blink/renderer/core/style/style_view_transition_group.h"],
      field_template: "external",
      keywords: ["normal", "contain", "nearest"],
      typedom_types: ["Keyword"],
      runtime_flag: "NestedViewTransition",
    },
    {
      name: "view-transition-name",
      field_group: "*",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      converter: "ConvertViewTransitionName",
      type_name: "ScopedCSSName",
      default_value: "nullptr",
      field_template: "external",
      keywords: ["none"],
      typedom_types: ["Keyword"],
      wrapper_pointer_name: "Member",
    },
    {
      name: "visibility",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      independent: true,
      interpolable: true,
      inherited: true,
      field_template: "keyword",
      keywords: ["visible", "hidden", "collapse"],
      typedom_types: ["Keyword"],
      default_value: "visible",
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["paint", "visibility"],
    },
    {
      name: "x",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "svg->geometry",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      typedom_types: ["Length", "Percentage"],
      converter: "ConvertLength",
      supports_incremental_style: true,
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "y",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "svg->geometry",
      field_template: "<length>",
      default_value: "Length::Fixed()",
      typedom_types: ["Length", "Percentage"],
      converter: "ConvertLength",
      supports_incremental_style: true,
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "appearance",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_size: 5,
      field_template: "primitive",
      include_paths: ["third_party/blink/renderer/platform/theme_types.h"],
      computed_style_protected_functions: ["getter"],
      default_value: "kNoControlPart",
      type_name: "ControlPart",
      // appearance needs to be computed before
      // -internal-appearance-auto-base-select() can be resolved.
      priority: 1,
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-appearance",
      alias_for: "appearance",
    },
    {
      name: "app-region",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["none", "drag", "no-drag"],
      default_value: "none",
      name_for_methods: "DraggableRegionMode",
      style_builder_custom_functions: ["initial", "inherit", "value"],
      invalidate: ["layout"],
    },
    {
      name: "-webkit-app-region",
      alias_for: "app-region",
    },
    {
      name: "-webkit-border-horizontal-spacing",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "inherited",
      field_template: "primitive",
      default_value: "0",
      name_for_methods: "HorizontalBorderSpacing",
      type_name: "short",
      converter: "ConvertComputedLength<short>",
      valid_for_first_letter: true,
      invalidate: ["layout", "paint"],
      affected_by_zoom: true,
    },
    {
      name: "-webkit-border-image",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      style_builder_custom_functions: ["value"],
      valid_for_first_letter: true,
      affected_by_all: false,
      // Overlaps with border-image.
      legacy_overlapping: true,
    },
    {
      name: "-webkit-border-vertical-spacing",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "inherited",
      field_template: "primitive",
      default_value: "0",
      name_for_methods: "VerticalBorderSpacing",
      type_name: "short",
      converter: "ConvertComputedLength<short>",
      valid_for_first_letter: true,
      invalidate: ["layout", "paint"],
      affected_by_zoom: true,
    },
    // For valid values of box-align see
    // http://www.w3.org/TR/2009/WD-css3-flexbox-20090723/#alignment
    {
      name: "-webkit-box-align",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["stretch", "start", "center", "end", "baseline"],
      default_value: "stretch",
      type_name: "EBoxAlignment",
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-box-decoration-break",
      surrogate_for: "box-decoration-break",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      keywords: ["slice", "clone"],
    },
    {
      name: "-webkit-box-direction",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_template: "keyword",
      keywords: ["normal", "reverse"],
      default_value: "normal",
      computed_style_protected_functions: ["getter"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-box-flex",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "primitive",
      default_value: "0.0f",
      type_name: "float",
      accepts_numeric_literal: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-box-ordinal-group",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "primitive",
      default_value: "1",
      type_name: "unsigned",
      computed_style_custom_functions: ["setter"],
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-box-orient",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["horizontal", "vertical"],
      default_value: "horizontal",
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-box-pack",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["start", "center", "end", "justify"],
      default_value: "start",
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-box-reflect",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "pointer",
      include_paths: ["third_party/blink/renderer/core/style/style_reflection.h"],
      wrapper_pointer_name: "scoped_refptr",
      default_value: "nullptr",
      type_name: "StyleReflection",
      converter: "ConvertBoxReflect",
      invalidate: ["filter-data"],
    },
    {
      name: "column-count",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "primitive",
      default_value: "1",
      type_name: "unsigned short",
      computed_style_custom_functions: ["setter"],
      style_builder_template: "auto",
      keywords: ["auto"],
      typedom_types: ["Keyword", "Number"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "column-gap",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/length.h"],
      default_value: "std::nullopt",
      type_name: "std::optional<Length>",
      converter: "ConvertGapLength",
      keywords: ["normal"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "row-gap",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/geometry/length.h"],
      default_value: "std::nullopt",
      type_name: "std::optional<Length>",
      converter: "ConvertGapLength",
      keywords: ["normal"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "column-rule-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      invalidate: ["paint"],
    },
    {
      name: "column-rule-style",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: [
        "none", "hidden", "inset", "groove", "outset", "ridge", "dotted",
        "dashed", "solid", "double"
      ],
      default_value: "none",
      type_name: "EBorderStyle",
      typedom_types: ["Keyword"],
      invalidate: ["paint"],
    },
    {
      name: "column-rule-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "external",
      default_value: "3",
      type_name: "int",
      computed_style_custom_functions: ["initial", "getter", "setter"],
      converter: "ConvertColumnRuleWidth",
      keywords: ["thin", "medium", "thick"],
      typedom_types: ["Keyword", "Length"],
      invalidate: ["paint"],
    },
    {
      name: "column-span",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["none", "all"],
      default_value: "none",
      getter: "GetColumnSpan",
      typedom_types: ["Keyword"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "column-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "*",
      field_template: "primitive",
      default_value: "0.0f",
      type_name: "float",
      computed_style_custom_functions: ["setter"],
      style_builder_template: "auto",
      converter: "ConvertComputedLength<float>",
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length"],
      invalidate: ["layout", "paint"],
    },
    {
      name: "hyphenate-character",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/platform/wtf/text/atomic_string.h"],
      default_value: "AtomicString()",
      name_for_methods: "HyphenationString",
      type_name: "AtomicString",
      converter: "ConvertString<CSSValueID::kAuto>",
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-line-break",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["auto", "loose", "normal", "strict", "after-white-space", "anywhere"],
      default_value: "auto",
      type_name: "LineBreak",
      invalidate: ["layout", "paint"],
    },
    {
      name: "line-break",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      type_name: "LineBreak",
      keywords: ["auto", "loose", "normal", "strict", "anywhere"],
      typedom_types: ["Keyword"],
      valid_for_marker: true,
      surrogate_for: "-webkit-line-break",
    },
    {
      name: "line-clamp",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "primitive",
      default_value: "0",
      converter: "ConvertIntegerOrNone<0>",
      computed_style_custom_functions: ["setter"],
      style_builder_custom_functions: ["initial"],
      style_builder_template: "auto",
      keywords: ["none", "auto"],
      type_name: "int",
      invalidate: ["layout", "paint"],
      name_for_methods: "StandardLineClamp",
      runtime_flag: "CSSLineClamp",
    },
    {
      name: "-webkit-line-clamp",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "primitive",
      default_value: "0",
      type_name: "int",
      invalidate: ["layout", "paint"],
      name_for_methods: "WebkitLineClamp",
    },
    {
      name: "-webkit-mask-box-image-outset",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      style_builder_template: "mask_box",
      style_builder_template_args: {
        modifier_type: "Outset",
      },
    },
    {
      name: "-webkit-mask-box-image-repeat",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      style_builder_template: "mask_box",
      style_builder_template_args: {
        modifier_type: "Repeat",
      },
    },
    {
      name: "-webkit-mask-box-image-slice",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      style_builder_template: "mask_box",
      style_builder_template_args: {
        modifier_type: "Slice",
      },
    },
    {
      name: "-webkit-mask-box-image-source",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      style_builder_custom_functions: ["value"],
    },
    {
      name: "-webkit-mask-box-image-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      style_builder_template: "mask_box",
      style_builder_template_args: {
        modifier_type: "Width",
      },
    },
    {
      name: "mask-mode",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "mask_layer",
      style_builder_template_args: {
        fill_type: "MaskMode",
      },
    },
    {
      name: "mask-clip",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "mask_layer",
      style_builder_template_args: {
        fill_type: "Clip",
      },
    },
    {
      name: "-webkit-mask-clip",
      alias_for: "mask-clip",
    },
    {
      name: "mask-composite",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "mask_layer",
      style_builder_template_args: {
        fill_type: "CompositingOperator",
      },
    },
    {
      name: "-webkit-mask-composite",
      alias_for: "mask-composite",
    },
    {
      name: "mask-image",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      style_builder_template: "mask_layer",
      style_builder_template_args: {
        fill_type: "Image",
        fill_type_getter: "GetImage"
      },
      // {-webkit-}mask-image needs to be applied before {-webkit-}mask-composite,
      // otherwise {-webkit-}mask-composite has no effect.
      priority: 2,
    },
    {
      name: "-webkit-mask-image",
      alias_for: "mask-image",
    },
    {
      name: "mask-origin",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "mask_layer",
      style_builder_template_args: {
        fill_type: "Origin",
      },
    },
    {
      name: "-webkit-mask-origin",
      alias_for: "mask-origin",
    },
    {
      name: "-webkit-mask-position-x",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      interpolable: true,
      style_builder_template: "mask_layer",
      style_builder_template_args: {
        fill_type: "PositionX",
      },
      computable: false,
    },
    {
      name: "-webkit-mask-position-y",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      interpolable: true,
      style_builder_template: "mask_layer",
      style_builder_template_args: {
        fill_type: "PositionY",
      },
      computable: false,
    },
    {
      name: "mask-repeat",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      style_builder_template: "mask_layer",
      style_builder_template_args: {
        fill_type: "Repeat",
      },
    },
    {
      name: "-webkit-mask-repeat",
      alias_for: "mask-repeat",
    },
    {
      name: "mask-size",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
      interpolable: true,
      style_builder_template: "mask_layer",
      style_builder_template_args: {
        fill_type: "Size",
      },
    },
    {
      name: "-webkit-mask-size",
      alias_for: "mask-size",
    },
    {
      name: "-webkit-perspective-origin-x",
      property_methods: ["ParseSingleValue"],
      style_builder_custom_functions: ["inherit"],
      interpolable: true,
      converter: "ConvertLength",
      computable: false,
      affected_by_all: false,
      // Overlaps with perspective-origin.
      legacy_overlapping: true,
    },
    {
      name: "-webkit-perspective-origin-y",
      property_methods: ["ParseSingleValue"],
      style_builder_custom_functions: ["inherit"],
      interpolable: true,
      converter: "ConvertLength",
      computable: false,
      affected_by_all: false,
      // Overlaps with perspective-origin.
      legacy_overlapping: true,
    },
    {
      name: "-webkit-print-color-adjust",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      independent: false,  // Actually true, but setting it to false saves a precious bit in ComputedStyleBase.
      inherited: true,
      field_template: "keyword",
      keywords: ["economy", "exact"],
      default_value: "economy",
      valid_for_permission_element: true,
      invalidate: ["paint"],
    },
    {
      name: "-webkit-rtl-ordering",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      independent: true,
      inherited: true,
      field_template: "keyword",
      keywords: ["logical", "visual"],
      default_value: "logical",
      name_for_methods: "RtlOrdering",
      setter: "SetRtlOrdering",
      type_name: "EOrder",
      invalidate: ["reshape"],
    },
    {
      name: "ruby-align",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["space-around", "start", "center", "space-between"],
      default_value: "space-around",
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
      runtime_flag: "CssRubyAlign",
    },
    {
      name: "-webkit-ruby-position",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      type_name: "RubyPosition",
      converter: "ConvertRubyPosition",
      computable: false,
      surrogate_for: "ruby-position",
      valid_for_permission_element: true,
    },
    {
      name: "ruby-position",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["over", "under"],
      default_value: "over",
      type_name: "RubyPosition",
      converter: "ConvertRubyPosition",
      valid_for_first_line: true,
      valid_for_permission_element: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-tap-highlight-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      inherited: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h",
                      "third_party/blink/renderer/core/layout/layout_theme.h"],
      type_name: "StyleColor",
      default_value: "StyleColor(LayoutTheme::TapHighlightColor())",
      converter: "ConvertStyleColor",
    },
    {
      name: "-webkit-text-combine",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      surrogate_for: "text-combine-upright",
    },
    {
      name: "text-emphasis-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      keywords: ["currentcolor"],
      typedom_types: ["Keyword"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      valid_for_marker: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["color"],
    },
    {
      name: "text-emphasis-position",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_size: 2,
      field_template: "primitive",
      default_value: "TextEmphasisPosition::kOverRight",
      type_name: "TextEmphasisPosition",
      converter: "ConvertTextTextEmphasisPosition",
      valid_for_marker: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "text-emphasis-style",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      style_builder_custom_functions: ["initial", "inherit", "value"],
      valid_for_marker: true,
    },
    {
      name: "-webkit-text-fill-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      inherited: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["color"],
    },
    {
      name: "-webkit-text-security",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["none", "disc", "circle", "square"],
      default_value: "none",
      invalidate: ["layout", "paint"],
    },
    {
      name: "-webkit-text-stroke-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["color"],
    },
    {
      name: "-webkit-text-stroke-width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "primitive",
      default_value: "0",
      type_name: "float",
      converter: "ConvertTextStrokeWidth",
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["layout", "paint"],
      affected_by_zoom: true,
    },
    {
      name: "-webkit-transform-origin-x",
      property_methods: ["ParseSingleValue"],
      style_builder_custom_functions: ["inherit"],
      interpolable: true,
      converter: "ConvertLength",
      computable: false,
      affected_by_all: false,
      // Overlaps with transform-origin.
      legacy_overlapping: true,
    },
    {
      name: "-webkit-transform-origin-y",
      property_methods: ["ParseSingleValue"],
      style_builder_custom_functions: ["inherit"],
      interpolable: true,
      converter: "ConvertLength",
      computable: false,
      affected_by_all: false,
      // Overlaps with transform-origin.
      legacy_overlapping: true,
    },
    {
      name: "-webkit-transform-origin-z",
      property_methods: ["ParseSingleValue"],
      style_builder_custom_functions: ["inherit"],
      interpolable: true,
      converter: "ConvertComputedLength<float>",
      computable: false,
      affected_by_all: false,
      // Overlaps with transform-origin.
      legacy_overlapping: true,
    },
    {
      name: "-webkit-user-drag",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      field_group: "*",
      field_template: "keyword",
      keywords: ["auto", "none", "element"],
      default_value: "auto",
      valid_for_permission_element: true,
      invalidate: ["paint"],
    },
    {
      name: "-webkit-user-modify",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      computed_style_protected_functions: ["getter"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["read-only", "read-write", "read-write-plaintext-only"],
      default_value: "read-only",
      affected_by_all: false,
      invalidate: ["paint"],
    },
    {
      name: "user-select",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      computed_style_protected_functions: ["getter"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      keywords: ["auto", "none", "text", "all", "contain"],
      typedom_types: ["Keyword"],
      default_value: "auto",
      valid_for_permission_element: true,
      invalidate: ["paint"],
    },
    {
      name: "white-space",
      longhands: [
        "white-space-collapse", "text-wrap-mode"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "white-space-collapse",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_template: "primitive",
      field_size: 2,  // Ensure this is in sync with `kWhiteSpaceCollapseBits`.
      type_name: "WhiteSpaceCollapse",
      keywords: ["collapse", "preserve", "preserve-breaks", "break-spaces"],
      default_value: "WhiteSpaceCollapse::kCollapse",
      include_paths: ["third_party/blink/renderer/core/css/white_space.h"],
      typedom_types: ["Keyword"],
      valid_for_cue: true,
      valid_for_marker: true,
      valid_for_page_context: true,
      invalidate: ["reshape"],
    },
    {
      name: "text-wrap",
      longhands: [
        "text-wrap-mode", "text-wrap-style"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "text-wrap-mode",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_template: "keyword",
      type_name: "TextWrapMode",
      keywords: ["wrap", "nowrap"],
      default_value: "wrap",
      typedom_types: ["Keyword"],
      valid_for_cue: true,
      valid_for_marker: true,
      valid_for_page_context: true,
      invalidate: ["layout"],
    },
    {
      name: "text-wrap-style",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_template: "keyword",
      type_name: "TextWrapStyle",
      keywords: ["auto", "balance", "pretty", "stable"],
      default_value: "auto",
      typedom_types: ["Keyword"],
      valid_for_cue: true,
      valid_for_marker: true,
      valid_for_page_context: true,
      invalidate: ["layout"],
    },
    {
      name: "widows",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      field_group: "*",
      field_template: "primitive",
      computed_style_custom_functions: ["setter"],
      default_value: "2",
      type_name: "short",
      typedom_types: ["Number"],
      invalidate: ["layout"],
    },
    {
      name: "width",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      layout_dependent: true,
      field_group: "box",
      field_template: "<length>",
      keywords: ["auto", "fit-content", "min-content", "max-content"],
      default_value: "Length()",
      typedom_types: ["Keyword", "Length", "Percentage"],
      converter: "ConvertLengthSizing",
      anchor_mode: "width",
      logical_property_group: {
        name: "size",
        resolver: "horizontal",
      },
      supports_incremental_style: true,
      valid_for_position_try: true,
      affected_by_zoom: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      invalidate: ["layout", "scroll-anchor"],
    },
    {
      name: "will-change",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      style_builder_custom_functions: ["initial", "inherit", "value"],
      keywords: ["auto"],
      typedom_types: ["Keyword"],
      valid_for_permission_element: true,
    },
    {
      name: "word-break",
      property_methods: ["CSSValueFromComputedStyleInternal"],
      inherited: true,
      field_group: "*",
      field_template: "keyword",
      // Word Break Values. Matches WinIE and CSS3
      keywords: ["normal", "break-all", "keep-all", "break-word", "auto-phrase"],
      default_value: "normal",
      typedom_types: ["Keyword"],
      valid_for_marker: true,
      invalidate: ["layout", "paint"],
    },
    {
      name: "word-spacing",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      inherited: true,
      converter: "ConvertSpacing",
      keywords: ["normal"],
      typedom_types: ["normal"],
      typedom_types: ["Keyword", "Length"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_marker: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
      affected_by_zoom: true,
    },
    {
      name: "z-index",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      interpolable: true,
      field_group: "box",
      field_template: "primitive",
      default_value: "0",
      type_name: "int",
      computed_style_custom_functions: ["setter"],
      style_builder_template: "auto",
      converter: "ConvertInteger",
      keywords: ["auto"],
      typedom_types: ["Keyword", "Number"],
      valid_for_permission_element: true,
      invalidate: ["z-index"],
    },

    // CSS logical props
    {
      name: "inline-size",
      property_methods: ["ParseSingleValue"],
      layout_dependent: true,
      logical_property_group: {
        name: "size",
        resolver: "inline",
      },
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "block-size",
      property_methods: ["ParseSingleValue"],
      layout_dependent: true,
      logical_property_group: {
        name: "size",
        resolver: "block",
      },
      keywords: ["auto"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "min-inline-size",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "min-size",
        resolver: "inline",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_position_try: true,
      valid_for_page_context: true,
    },
    {
      name: "min-block-size",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "min-size",
        resolver: "block",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "max-inline-size",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "max-size",
        resolver: "inline",
      },
      keywords: ["none"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "max-block-size",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "max-size",
        resolver: "block",
      },
      keywords: ["none"],
      typedom_types: ["Keyword", "Length", "Percentage"],
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "margin-inline-start",
      layout_dependent: true,
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "margin",
        resolver: "inline-start",
      },
      typedom_types: ["Length", "Percentage"],
      keywords: ["auto"],
      valid_for_first_letter: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
    },
    {
      name: "margin-inline-end",
      layout_dependent: true,
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "margin",
        resolver: "inline-end",
      },
      typedom_types: ["Length", "Percentage"],
      keywords: ["auto"],
      valid_for_first_letter: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
    },
    {
      name: "margin-block-start",
      layout_dependent: true,
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "margin",
        resolver: "block-start",
      },
      typedom_types: ["Length", "Percentage"],
      keywords: ["auto"],
      valid_for_first_letter: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
    },
    {
      name: "margin-block-end",
      layout_dependent: true,
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "margin",
        resolver: "block-end",
      },
      typedom_types: ["Length", "Percentage"],
      keywords: ["auto"],
      valid_for_first_letter: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
    },
    {
      name: "padding-inline-start",
      layout_dependent: true,
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "padding",
        resolver: "inline-start",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_page_context: true,
    },
    {
      name: "padding-inline-end",
      layout_dependent: true,
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "padding",
        resolver: "inline-end",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_page_context: true,
    },
    {
      name: "padding-block-start",
      layout_dependent: true,
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "padding",
        resolver: "block-start",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_page_context: true,
    },
    {
      name: "padding-block-end",
      layout_dependent: true,
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "padding",
        resolver: "block-end",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_page_context: true,
    },
    {
      name: "scroll-start-block",
      property_methods: ["ParseSingleValue"],
      logical_property_group : {
        name: "scroll-start",
        resolver: "block"
      },
      runtime_flag: "CSSScrollStart",
    },
    {
      name: "scroll-start-inline",
      property_methods: ["ParseSingleValue"],
      logical_property_group : {
        name: "scroll-start",
        resolver: "inline"
      },
      runtime_flag: "CSSScrollStart",
    },
    {
      name: "scroll-start-target-block",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "scroll-start-target",
        resolver: "block",
      },
      runtime_flag: "CSSScrollStartTarget",
    },
    {
      name: "scroll-start-target-inline",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "scroll-start-target",
        resolver: "inline",
      },
      runtime_flag: "CSSScrollStartTarget",
    },
    {
      name: "border-inline-start-width",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-width",
        resolver: "inline-start",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-inline-start-style",
      logical_property_group: {
        name: "border-style",
        resolver: "inline-start",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-inline-start-color",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-color",
        resolver: "inline-start",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-inline-end-width",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-width",
        resolver: "inline-end",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-inline-end-style",
      logical_property_group: {
        name: "border-style",
        resolver: "inline-end",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-inline-end-color",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-color",
        resolver: "inline-end",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-block-start-width",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-width",
        resolver: "block-start",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-block-start-style",
      logical_property_group: {
        name: "border-style",
        resolver: "block-start",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-block-start-color",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-color",
        resolver: "block-start",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-block-end-width",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-width",
        resolver: "block-end",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-block-end-style",
      logical_property_group: {
        name: "border-style",
        resolver: "block-end",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-block-end-color",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-color",
        resolver: "block-end",
      },
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "inset-inline-start",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "inset",
        resolver: "inline-start",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_position_try: true,
      layout_dependent: true,
      valid_for_permission_element: true,
    },
    {
      name: "inset-inline-end",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "inset",
        resolver: "inline-end",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_position_try: true,
      layout_dependent: true,
      valid_for_permission_element: true,
    },
    {
      name: "inset-block-start",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "inset",
        resolver: "block-start",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_position_try: true,
      layout_dependent: true,
      valid_for_permission_element: true,
    },
    {
      name: "inset-block-end",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "inset",
        resolver: "block-end",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_position_try: true,
      layout_dependent: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-start-start-radius",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-radius",
        resolver: "start-start",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-start-end-radius",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-radius",
        resolver: "start-end",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-end-start-radius",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-radius",
        resolver: "end-start",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-end-end-radius",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "border-radius",
        resolver: "end-end",
      },
      typedom_types: ["Length", "Percentage"],
      valid_for_first_letter: true,
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },

    // Non-standard direction aware properties

    {
      name: "-webkit-border-end-color",
      alias_for: "border-inline-end-color",
    },
    {
      name: "-webkit-border-end-style",
      alias_for: "border-inline-end-style",
    },
    {
      name: "-webkit-border-end-width",
      alias_for: "border-inline-end-width",
    },
    {
      name: "-webkit-border-start-color",
      alias_for: "border-inline-start-color",
    },
    {
      name: "-webkit-border-start-style",
      alias_for: "border-inline-start-style",
    },
    {
      name: "-webkit-border-start-width",
      alias_for: "border-inline-start-width",
    },
    {
      name: "-webkit-border-before-color",
      alias_for: "border-block-start-color",
    },
    {
      name: "-webkit-border-before-style",
      alias_for: "border-block-start-style",
    },
    {
      name: "-webkit-border-before-width",
      alias_for: "border-block-start-width",
    },
    {
      name: "-webkit-border-after-color",
      alias_for: "border-block-end-color",
    },
    {
      name: "-webkit-border-after-style",
      alias_for: "border-block-end-style",
    },
    {
      name: "-webkit-border-after-width",
      alias_for: "border-block-end-width",
    },
    {
      name: "-webkit-margin-end",
      alias_for: "margin-inline-end",
    },
    {
      name: "-webkit-margin-start",
      alias_for: "margin-inline-start",
    },
    {
      name: "-webkit-margin-before",
      alias_for: "margin-block-start",
    },
    {
      name: "-webkit-margin-after",
      alias_for: "margin-block-end",
    },
    {
      name: "-webkit-padding-end",
      alias_for: "padding-inline-end",
    },
    {
      name: "-webkit-padding-start",
      alias_for: "padding-inline-start",
    },
    {
      name: "-webkit-padding-before",
      alias_for: "padding-block-start",
    },
    {
      name: "-webkit-padding-after",
      alias_for: "padding-block-end",
    },
    {
      name: "-webkit-logical-width",
      alias_for: "inline-size",
    },
    {
      name: "-webkit-logical-height",
      alias_for: "block-size",
    },
    {
      name: "-webkit-min-logical-width",
      alias_for: "min-inline-size",
    },
    {
      name: "-webkit-min-logical-height",
      alias_for: "min-block-size",
    },
    {
      name: "-webkit-max-logical-width",
      alias_for: "max-inline-size",
    },
    {
      name: "-webkit-max-logical-height",
      alias_for: "max-block-size",
    },

    // Properties that we ignore in the StyleBuilder.
    // TODO(timloh): This seems wrong, most of these shouldn't reach the
    // StyleBuilder
    {
      name: "all",
      affected_by_all: false,
      style_builder_template: "empty",
      computable: false,
    },
    // TODO([email protected]): Remove -internal-font-size-delta.
    // fontSizeDelta execCommand does not need separate CSS property.
    {
      name: "-internal-font-size-delta",
      property_methods: ["ParseSingleValue"],
      style_builder_template: "empty",
    },
    {
      name: "-webkit-text-decorations-in-effect",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      inherited: true,
      style_builder_template: "empty",
    },

    // Descriptor only names
    {
      name: "font-display",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "src",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "unicode-range",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "syntax",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "initial-value",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "inherits",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "ascent-override",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "descent-override",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "line-gap-override",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "system",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "negative",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "prefix",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "suffix",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "range",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "pad",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "fallback",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "symbols",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "additive-symbols",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "speak-as",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "size-adjust",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "base-palette",
      is_descriptor: true,
      is_property: false,
      valid_for_permission_element: true,
    },
    {
      name: "override-colors",
      is_descriptor: true,
      is_property: false,
    },
    {
      name: "navigation",
      is_descriptor: true,
      is_property: false,
      runtime_flag: "ViewTransitionOnNavigation",
    },
    {
      name: "types",
      is_descriptor: true,
      is_property: false,
      runtime_flag: "ViewTransitionOnNavigation",
    },
    {
      name: "position-area",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      style_builder_custom_functions: ["value", "inherit"],
      field_group: "*",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/style/position_area.h"],
      converter: "ConvertPositionArea",
      default_value: "PositionArea()",
      type_name: "PositionArea",
      keywords: [
        "none", "top", "bottom", "center", "left", "right", "x-start", "x-end",
        "y-start", "y-end", "start", "end", "self-start", "self-end", "all"
      ],
      typedom_types: ["Keyword"],
      valid_for_position_try: true,
      runtime_flag: "CSSPositionAreaProperty",
      valid_for_permission_element: true,
      // position-area needs to be applied before inset properties since
      // anchor() functions compute relative to the containing block that is
      // modified by position-area in AnchorEvaluatorImpl.
      priority: 1,
      invalidate: ["layout", "out-of-flow", "paint"],
    },
    {
      name: "inset-area",
      surrogate_for: "position-area",
      runtime_flag: "CSSInsetAreaProperty",

      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
      keywords: [
        "none", "top", "bottom", "center", "left", "right", "x-start", "x-end",
        "y-start", "y-end", "start", "end", "self-start", "self-end", "all"
      ],
      typedom_types: ["Keyword"],
      valid_for_position_try: true,
      priority: 1,
    },
    // Shorthands
    {
      name: "animation",
      longhands: [
        "animation-duration", "animation-timing-function", "animation-delay",
        "animation-iteration-count", "animation-direction",
        "animation-fill-mode", "animation-play-state", "animation-name"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      supports_incremental_style: false,
      valid_for_keyframe: false,
    },
    {
      // Variant of the "animation" shorthand which includes the
      // animation-timeline and animation-range-* longhands.
      name: "-alternative-animation-with-timeline",
      alternative_of: "animation",
      longhands: [
        "animation-duration", "animation-timing-function",
        "animation-delay", "animation-iteration-count", "animation-direction",
        "animation-fill-mode", "animation-play-state", "animation-name",
        "animation-timeline", "animation-range-start", "animation-range-end"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      supports_incremental_style: false,
      valid_for_keyframe: false,
      runtime_flag: 'ScrollTimeline',
    },
    {
      name: "animation-range",
      longhands: [
        "animation-range-start", "animation-range-end",
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      supports_incremental_style: false,
      valid_for_keyframe: false,
      runtime_flag: 'ScrollTimeline',
    },
    {
      name: "background",
      longhands: [
        "background-image", "background-position-x", "background-position-y",
        "background-size", "background-repeat",
        "background-attachment", "background-origin", "background-clip",
        "background-color"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "background-position",
      longhands: ["background-position-x", "background-position-y"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      computable: true,
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "border",
      longhands: [
        "border-top-color", "border-top-style", "border-top-width",
        "border-right-color", "border-right-style", "border-right-width",
        "border-bottom-color", "border-bottom-style", "border-bottom-width",
        "border-left-color", "border-left-style", "border-left-width",
        "border-image-source", "border-image-slice", "border-image-width",
        "border-image-outset", "border-image-repeat"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "border-block",
      longhands: [
        "border-block-start-color", "border-block-start-style", "border-block-start-width",
        "border-block-end-color", "border-block-end-style", "border-block-end-width"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "border-block-color",
      longhands: ["border-block-start-color", "border-block-end-color"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "border-block-end",
      longhands: [
        "border-block-end-width", "border-block-end-style",
        "border-block-end-color"
      ],
      property_methods: ["ParseShorthand"],
      logical_property_group: {
        name: "border",
        resolver: "block-end",
      },
      valid_for_page_context: true,
    },
    {
      name: "border-block-start",
      longhands: [
        "border-block-start-width", "border-block-start-style",
        "border-block-start-color"
      ],
      property_methods: ["ParseShorthand"],
      logical_property_group: {
        name: "border",
        resolver: "block-start",
      },
      valid_for_page_context: true,
    },
    {
      name: "border-block-style",
      longhands: ["border-block-start-style", "border-block-end-style"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "border-block-width",
      longhands: ["border-block-start-width", "border-block-end-width"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "border-bottom",
      longhands: [
        "border-bottom-width", "border-bottom-style", "border-bottom-color"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      logical_property_group: {
        name: "border",
        resolver: "bottom",
      },
      valid_for_page_context: true,
    },
    {
      name: "border-color",
      longhands: [
        "border-top-color", "border-right-color", "border-bottom-color",
        "border-left-color"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "border-image",
      longhands: [
        "border-image-source", "border-image-slice", "border-image-width",
        "border-image-outset", "border-image-repeat"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "border-inline",
      longhands: [
        "border-inline-start-color", "border-inline-start-style", "border-inline-start-width",
        "border-inline-end-color", "border-inline-end-style", "border-inline-end-width"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "border-inline-color",
      longhands: ["border-inline-start-color", "border-inline-end-color"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "border-inline-end",
      longhands: [
        "border-inline-end-width", "border-inline-end-style",
        "border-inline-end-color"
      ],
      property_methods: ["ParseShorthand"],
      logical_property_group: {
        name: "border",
        resolver: "inline-end",
      },
      valid_for_page_context: true,
    },
    {
      name: "border-inline-start",
      longhands: [
        "border-inline-start-width", "border-inline-start-style",
        "border-inline-start-color"
      ],
      property_methods: ["ParseShorthand"],
      logical_property_group: {
        name: "border",
        resolver: "inline-start",
      },
      valid_for_page_context: true,
    },
    {
      name: "border-inline-style",
      longhands: ["border-inline-start-style", "border-inline-end-style"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "border-inline-width",
      longhands: ["border-inline-start-width", "border-inline-end-width"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "border-left",
      longhands: [
        "border-left-width", "border-left-style", "border-left-color"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      logical_property_group: {
        name: "border",
        resolver: "left",
      },
      valid_for_page_context: true,
    },
    {
      name: "border-radius",
      longhands: [
        "border-top-left-radius", "border-top-right-radius",
        "border-bottom-right-radius", "border-bottom-left-radius"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_permission_element: true,
      valid_for_page_context: true,
    },
    {
      name: "border-right",
      longhands: [
        "border-right-width", "border-right-style", "border-right-color"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      logical_property_group: {
        name: "border",
        resolver: "right",
      },
      valid_for_page_context: true,
    },
    {
      name: "border-spacing",
      longhands: [
        "-webkit-border-horizontal-spacing", "-webkit-border-vertical-spacing"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "border-style",
      longhands: [
        "border-top-style", "border-right-style", "border-bottom-style",
        "border-left-style"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      keywords: ["none"],
      valid_for_page_context: true,
    },
    {
      name: "border-top",
      longhands: ["border-top-width", "border-top-style", "border-top-color"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      logical_property_group: {
        name: "border",
        resolver: "top",
      },
      valid_for_page_context: true,
    },
    {
      name: "border-width",
      longhands: [
        "border-top-width", "border-right-width", "border-bottom-width",
        "border-left-width"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "contain-intrinsic-inline-size",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "contain-intrinsic-size",
        resolver: "inline",
      },
      typedom_types: ["Keyword", "Length"],
      valid_for_permission_element: true,
    },
    {
      name: "contain-intrinsic-block-size",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "contain-intrinsic-size",
        resolver: "block",
      },
      typedom_types: ["Keyword", "Length"],
      valid_for_permission_element: true,
    },
    {
      name: "contain-intrinsic-size",
      longhands: [
        "contain-intrinsic-width", "contain-intrinsic-height"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      computable: true,
      valid_for_permission_element: true,
    },
    {
      name: "container",
      longhands: [
        "container-name", "container-type"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "flex",
      longhands: ["flex-grow", "flex-shrink", "flex-basis"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "flex-flow",
      longhands: ["flex-direction", "flex-wrap"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "font",
      longhands: [
        "font-style", "font-variant-ligatures", "font-variant-caps",
        "font-variant-numeric", "font-variant-east-asian", "font-variant-alternates",
        "font-variant-position", "font-variant-emoji", "font-weight", "font-stretch",
        "font-size", "line-height", "font-family", "font-optical-sizing",
        "font-size-adjust", "font-kerning", "font-feature-settings",
        "font-variation-settings"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      // Changes to anything related to fonts require that we call style.UpdateFont(),
      // which the incremental path does not do.
      supports_incremental_style: false,
    },
    {
      name: "font-variant",
      longhands: [
        "font-variant-ligatures", "font-variant-caps", "font-variant-alternates",
        "font-variant-numeric", "font-variant-east-asian", "font-variant-position",
        "font-variant-emoji"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      is_descriptor: true,
      computable: true,
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "font-synthesis",
      longhands: ["font-synthesis-weight", "font-synthesis-style", "font-synthesis-small-caps"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      // See comment on font.
      supports_incremental_style: false,
    },
    {
      name: "grid",
      longhands: [
        "grid-template-rows", "grid-template-columns", "grid-template-areas",
        "grid-auto-flow", "grid-auto-rows", "grid-auto-columns"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      layout_dependent: true,
    },
    {
      name: "place-content",
      longhands: ["align-content", "justify-content"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "place-items",
      longhands: ["align-items", "justify-items"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "place-self",
      longhands: ["align-self", "justify-self"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_position_try: true,
    },
    {
      name: "grid-area",
      longhands: [
        "grid-row-start", "grid-column-start", "grid-row-end",
        "grid-column-end"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "grid-column",
      longhands: ["grid-column-start", "grid-column-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "gap",
      longhands: ["row-gap", "column-gap"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "grid-row",
      longhands: ["grid-row-start", "grid-row-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "grid-template",
      longhands: [
        "grid-template-rows", "grid-template-columns", "grid-template-areas"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      layout_dependent: true,
    },
    {
      name: "inset",
      longhands: ["top", "right", "bottom", "left"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_position_try: true,
      layout_dependent: true,
    },
    {
      name: "inset-block",
      longhands: ["inset-block-start", "inset-block-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_position_try: true,
      layout_dependent: true,
    },
    {
      name: "inset-inline",
      longhands: ["inset-inline-start", "inset-inline-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_position_try: true,
      layout_dependent: true,
    },
    {
      name: "list-style",
      longhands: ["list-style-position", "list-style-image", "list-style-type"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "margin",
      longhands: ["margin-top", "margin-right", "margin-bottom", "margin-left"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      layout_dependent: true,
      valid_for_position_try: true,
      valid_for_permission_element: true,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
    },
    {
      name: "margin-block",
      longhands: ["margin-block-start", "margin-block-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      layout_dependent: true,
      valid_for_position_try: true,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
    },
    {
      name: "margin-inline",
      longhands: ["margin-inline-start", "margin-inline-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      layout_dependent: true,
      valid_for_position_try: true,
      valid_for_limited_page_context: true,
      valid_for_page_context: true,
    },
    {
      name: "marker",
      longhands: ["marker-start", "marker-mid", "marker-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "masonry-track",
      longhands: ["masonry-track-start", "masonry-track-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      runtime_flag: "CSSMasonryLayout",
    },
    {
      name: "offset",
      longhands: [
        "offset-position", "offset-path", "offset-distance", "offset-rotate",
        "offset-anchor"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "outline",
      longhands: ["outline-color", "outline-style", "outline-width"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "overflow",
      longhands: ["overflow-x", "overflow-y"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      // See comment on overflow-x.
      supports_incremental_style: false,
    },
    {
      name: "overscroll-behavior",
      longhands: ["overscroll-behavior-x", "overscroll-behavior-y"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "padding",
      longhands: [
        "padding-top", "padding-right", "padding-bottom", "padding-left"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      layout_dependent: true,
      supports_incremental_style: true,
      valid_for_page_context: true,
    },
    {
      name: "padding-block",
      longhands: ["padding-block-start", "padding-block-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "padding-inline",
      longhands: ["padding-inline-start", "padding-inline-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      valid_for_page_context: true,
    },
    {
      name: "page-break-after",
      longhands: ["break-after"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "page-break-before",
      longhands: ["break-before"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "page-break-inside",
      longhands: ["break-inside"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "position-try",
      longhands: ["position-try-order", "position-try-options"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      // Variant of the "position-try" shorthand which has the new
      // position-try-fallbacks instead of position-try-options.
      name: "-alternative-position-try",
      alternative_of: "position-try",
      longhands: ["position-try-order", "position-try-fallbacks"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      runtime_flag: "CSSPositionTryFallbacks",
    },
    {
      name: "scroll-margin",
      longhands: ["scroll-margin-top", "scroll-margin-right", "scroll-margin-bottom", "scroll-margin-left"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "scroll-margin-block",
      longhands: ["scroll-margin-block-start", "scroll-margin-block-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "scroll-margin-inline",
      longhands: ["scroll-margin-inline-start", "scroll-margin-inline-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "scroll-padding",
      longhands: [
        "scroll-padding-top", "scroll-padding-right", "scroll-padding-bottom",
        "scroll-padding-left"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "scroll-padding-block",
      longhands: ["scroll-padding-block-start", "scroll-padding-block-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "scroll-padding-inline",
      longhands: ["scroll-padding-inline-start", "scroll-padding-inline-end"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "scroll-start",
      longhands: ["scroll-start-block", "scroll-start-inline"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      runtime_flag: "CSSScrollStart",
    },
    {
      name: "scroll-start-target",
      longhands: ["scroll-start-target-block", "scroll-start-target-inline"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      runtime_flag: "CSSScrollStartTarget",
    },
    {
      name: "scroll-timeline",
      longhands: ["scroll-timeline-name", "scroll-timeline-axis"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      runtime_flag: "ScrollTimeline",
    },
    {
      name: "text-decoration",
      longhands: ["text-decoration-line", "text-decoration-thickness", "text-decoration-style", "text-decoration-color"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      computable: true,
      valid_for_page_context: true,
    },
    {
      name: "transition",
      longhands: [
        "transition-property", "transition-duration",
        "transition-timing-function", "transition-delay",
        "transition-behavior",
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      // Animation properites are never incremental.
      supports_incremental_style: false,
    },
    {
      name: "view-timeline",
      longhands: ["view-timeline-name", "view-timeline-axis", "view-timeline-inset"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      runtime_flag: "ScrollTimeline",
    },
    {
      name: "-webkit-border-after",
      alias_for: "border-block-end",
    },
    {
      name: "-webkit-border-before",
      alias_for: "border-block-start",
    },
    {
      name: "-webkit-border-end",
      alias_for: "border-inline-end",
    },
    {
      name: "-webkit-border-start",
      alias_for: "border-inline-start",
    },
    {
      name: "-webkit-column-break-after",
      longhands: ["break-after"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "-webkit-column-break-before",
      longhands: ["break-before"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "-webkit-column-break-inside",
      longhands: ["break-inside"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "column-rule",
      longhands: [
        "column-rule-width", "column-rule-style", "column-rule-color"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "columns",
      longhands: ["column-width", "column-count"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "mask",
      longhands: [
        "mask-image", "-webkit-mask-position-x",
        "-webkit-mask-position-y", "mask-size", "mask-repeat", "mask-origin",
        "mask-clip", "mask-composite", "mask-mode"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "-webkit-mask",
      alias_for: "mask",
    },
    {
      name: "-webkit-mask-box-image",
      longhands: [
        "-webkit-mask-box-image-source", "-webkit-mask-box-image-slice",
        "-webkit-mask-box-image-width", "-webkit-mask-box-image-outset",
        "-webkit-mask-box-image-repeat"
      ],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      computable: true,
    },
    {
      name: "mask-position",
      longhands: ["-webkit-mask-position-x", "-webkit-mask-position-y"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
      computable: true,
    },
    {
      name: "-webkit-mask-position",
      alias_for: "mask-position",
    },
    {
      name: "text-emphasis",
      longhands: ["text-emphasis-style", "text-emphasis-color"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },
    {
      name: "-webkit-text-stroke",
      longhands: ["-webkit-text-stroke-width", "-webkit-text-stroke-color"],
      property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
    },

    // Visited properties.
    {
      name: "-internal-visited-color",
      visited_property_for: "color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      inherited: true,
      field_group: "inherited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor(Color::kBlack)",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      style_builder_custom_functions: ["initial", "inherit", "value"],
      priority: 1,
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      is_visited_highlight_colors: true,
      invalidate: ["background-current-color", "border-visual", "color"],
    },
    {
      name: "-internal-visited-caret-color",
      visited_property_for: "caret-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      inherited: true,
      field_group: "*->inherited_visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_auto_color.h"],
      default_value: "StyleAutoColor::AutoColor()",
      type_name: "StyleAutoColor",
      converter: "ConvertStyleAutoColor",
      computed_style_protected_functions: ["getter"],
      style_builder_template: "visited_color",
      style_builder_template_args: {
        initial_color: "StyleAutoColor::AutoColor",
      },
      valid_for_highlight_legacy: true,
      invalidate: ["color"],
    },
    {
      name: "-internal-visited-column-rule-color",
      visited_property_for: "column-rule-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      field_group: "*->visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "visited_color",
      invalidate: ["paint"],
    },
    {
      name: "-internal-visited-background-color",
      visited_property_for: "background-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      field_group: "*->visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor(Color::kTransparent)",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "visited_color",
      style_builder_template_args: {
        initial_color: "ComputedStyleInitialValues::InitialBackgroundColor",
      },
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      is_visited_highlight_colors: true,
      invalidate: ["background-color"],
    },
    {
      name: "-internal-visited-border-left-color",
      visited_property_for: "border-left-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      field_group: "*->visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "visited_color",
      valid_for_first_letter: true,
      logical_property_group: {
        name: "visited-border-color",
        resolver: "left",
      },
      invalidate: ["border-outline-visited-color"],
    },
    {
      name: "-internal-visited-border-right-color",
      visited_property_for: "border-right-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      field_group: "*->visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "visited_color",
      valid_for_first_letter: true,
      logical_property_group: {
        name: "visited-border-color",
        resolver: "right",
      },
      invalidate: ["border-outline-visited-color"],
    },
    {
      name: "-internal-visited-border-top-color",
      visited_property_for: "border-top-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      field_group: "*->visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "visited_color",
      valid_for_first_letter: true,
      logical_property_group: {
        name: "visited-border-color",
        resolver: "top",
      },
      invalidate: ["border-outline-visited-color"],
    },
    {
      name: "-internal-visited-border-bottom-color",
      visited_property_for: "border-bottom-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      field_group: "*->visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "visited_color",
      valid_for_first_letter: true,
      logical_property_group: {
        name: "visited-border-color",
        resolver: "bottom",
      },
      invalidate: ["border-outline-visited-color"],
    },
    {
      name: "-internal-visited-border-inline-start-color",
      visited_property_for: "border-inline-start-color",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "visited-border-color",
        resolver: "inline-start",
      },
      valid_for_first_letter: true,
    },
    {
      name: "-internal-visited-border-inline-end-color",
      visited_property_for: "border-inline-end-color",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "visited-border-color",
        resolver: "inline-end",
      },
      valid_for_first_letter: true,
    },
    {
      name: "-internal-visited-border-block-start-color",
      visited_property_for: "border-block-start-color",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "visited-border-color",
        resolver: "block-start",
      },
      valid_for_first_letter: true,
    },
    {
      name: "-internal-visited-border-block-end-color",
      visited_property_for: "border-block-end-color",
      property_methods: ["ParseSingleValue"],
      logical_property_group: {
        name: "visited-border-color",
        resolver: "block-end",
      },
      valid_for_first_letter: true,
    },
    {
      name: "-internal-visited-fill",
      visited_property_for: "fill",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      inherited: true,
      field_group: "svg->fill",
      field_template: "external",
      type_name: "SVGPaint",
      include_paths: ["third_party/blink/renderer/core/style/svg_paint.h"],
      default_value: "SVGPaint(Color::kBlack)",
      name_for_methods: "InternalVisitedFillPaint",
      converter: "ConvertSVGPaint",
      style_builder_template: "visited_color",
      style_builder_template_args: {
        initial_color: "ComputedStyleInitialValues::InitialFillPaint",
      },
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
    },
    {
      name: "-internal-visited-outline-color",
      visited_property_for: "outline-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      field_group: "*->visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "visited_color",
      valid_for_cue: true,
      invalidate: ["border-outline-visited-color"],
    },
    {
      name: "-internal-visited-stroke",
      visited_property_for: "stroke",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      inherited: true,
      field_group: "svg->stroke",
      field_template: "external",
      type_name: "SVGPaint",
      include_paths: ["third_party/blink/renderer/core/style/svg_paint.h"],
      default_value: "SVGPaint()",
      name_for_methods: "InternalVisitedStrokePaint",
      converter: "ConvertSVGPaint",
      style_builder_template: "visited_color",
      style_builder_template_args: {
        initial_color: "ComputedStyleInitialValues::InitialStrokePaint",
      },
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["paint"],
    },
    {
      name: "-internal-visited-text-decoration-color",
      visited_property_for: "text-decoration-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      field_group: "*->visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "visited_color",
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["color"],
    },
    {
      name: "-internal-visited-text-emphasis-color",
      visited_property_for: "text-emphasis-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      inherited: true,
      field_group: "*->inherited_visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "visited_color",
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["color"],
    },
    {
      name: "-internal-visited-text-fill-color",
      visited_property_for: "-webkit-text-fill-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      inherited: true,
      field_group: "*->inherited_visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "visited_color",
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["color"],
    },
    {
      name: "-internal-visited-text-stroke-color",
      visited_property_for: "-webkit-text-stroke-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      inherited: true,
      field_group: "*->inherited_visited",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "visited_color",
      valid_for_highlight_legacy: true,
      valid_for_highlight: true,
      invalidate: ["color"],
    },

    // Forced colors properties.
    {
      name: "-internal-forced-background-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      field_group: "*->forced_colors",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css_value_keywords.h",
                      "third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor(CSSValueID::kCanvas)",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      style_builder_template_args: {
        initial_color: "ComputedStyleInitialValues::InitialInternalForcedBackgroundColor",
      },
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
    },
    {
      name: "-internal-forced-border-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      field_group: "*->forced_colors",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      valid_for_first_letter: true,
    },
    {
      name: "-internal-forced-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      inherited: true,
      field_group: "*->inherited_forced_colors",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css_value_keywords.h",
                      "third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor(CSSValueID::kCanvastext)",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      style_builder_custom_functions: ["initial", "inherit", "value"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
    },
    {
      name: "-internal-forced-outline-color",
      property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "ColorIncludingFallback"],
      field_group: "*->forced_colors",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor::CurrentColor()",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      converter: "ConvertStyleColor",
      style_builder_template: "color",
      valid_for_cue: true,
    },
    {
      name: "-internal-forced-visited-color",
      visited_property_for: "-internal-forced-color",
      property_methods: ["ParseSingleValue", "ColorIncludingFallback"],
      inherited: true,
      field_group: "*->inherited_forced_colors",
      field_template: "external",
      include_paths: ["third_party/blink/renderer/core/css_value_keywords.h",
                      "third_party/blink/renderer/core/css/style_color.h"],
      default_value: "StyleColor(CSSValueID::kCanvastext)",
      type_name: "StyleColor",
      computed_style_protected_functions: ["getter"],
      style_builder_custom_functions: ["initial", "inherit", "value"],
      valid_for_first_letter: true,
      valid_for_first_line: true,
      valid_for_cue: true,
      valid_for_marker: true,
    },

    // Name: -internal-empty-line-height:
    // Value: none | fabricated
    //    If the element is inline or contains visible text, this property has
    //    no effect.
    //
    // 'none'
    //   The box's intrinsic height is 0, and it defines no baseline.
    // 'fabricated'
    //   The box has intrinsic height and baseline, computed from the current
    //   font metrics.
    {
      name: "-internal-empty-line-height",
      property_methods: ["ParseSingleValue" ],
      inherited: true,
      field_group: "*",
      field_template: "primitive",
      type_name: "bool",
      default_value: "false",
      name_for_methods: "HasLineIfEmpty",
      converter: "ConvertInternalEmptyLineHeight",
    },
    {
      name: "-internal-align-content-block",
      property_methods: ["ParseSingleValue"],
      inherited: false,
      field_group: "*",
      field_template: "primitive",
      type_name: "bool",
      default_value: "false",
      name_for_methods: "AlignContentBlockCenter",
      converter: "ConvertInternalAlignContentBlock",
      invalidate: ["layout"],
    },
    // Aliases; these map to the same CSSPropertyID
    {
      name: "-epub-caption-side",
      alias_for: "caption-side",
    },
    {
      name: "-epub-text-combine",
      alias_for: "-webkit-text-combine",
    },
    {
      name: "-epub-text-emphasis",
      alias_for: "text-emphasis",
    },
    {
      name: "-epub-text-emphasis-color",
      alias_for: "text-emphasis-color",
    },
    {
      name: "-epub-text-emphasis-style",
      alias_for: "text-emphasis-style",
    },
    {
      name: "-epub-text-orientation",
      alias_for: "-webkit-text-orientation",
    },
    {
      name: "-epub-text-transform",
      alias_for: "text-transform",
    },
    {
      name: "-epub-word-break",
      alias_for: "word-break",
    },
    {
      name: "-epub-writing-mode",
      alias_for: "-webkit-writing-mode",
    },
    {
      name: "-webkit-align-content",
      alias_for: "align-content",
    },
    {
      name: "-webkit-align-items",
      alias_for: "align-items",
    },
    {
      name: "-webkit-align-self",
      alias_for: "align-self",
    },
    {
      name: "-webkit-animation",
      alias_for: "animation",
    },
    {
      // Since "animation" has an alternative property, "-webkit-animation"
      // also needs to have an alternative property that is an alias of
      // animation's alternative property. Unfortunately we can't just resolve
      // -webkit-animation directly to animation's alternative, because we have
      // to remember the -webkit-ness of the property to enable legacy parsing
      // behavior. (See CSSParserLocalContext::UseAliasParsing).
      name: "-webkit-alternative-animation-with-timeline",
      alias_for: "-alternative-animation-with-timeline",
      alternative_of: "-webkit-animation",
      runtime_flag: "ScrollTimeline",
    },
    {
      name: "-webkit-animation-delay",
      alias_for: "animation-delay",
    },
    {
      name: "-webkit-animation-direction",
      alias_for: "animation-direction",
    },
    {
      name: "-webkit-animation-duration",
      alias_for: "animation-duration",
    },
    {
      name: "-webkit-animation-fill-mode",
      alias_for: "animation-fill-mode",
    },
    {
      name: "-webkit-animation-iteration-count",
      alias_for: "animation-iteration-count",
    },
    {
      name: "-webkit-animation-name",
      alias_for: "animation-name",
    },
    {
      name: "-webkit-animation-play-state",
      alias_for: "animation-play-state",
    },
    {
      name: "-webkit-animation-timing-function",
      alias_for: "animation-timing-function",
    },
    {
      name: "-webkit-backface-visibility",
      alias_for: "backface-visibility",
    },
    {
      name: "-webkit-background-clip",
      alias_for: "background-clip",
    },
    // -webkit-background-origin accepts "content", "padding", and "border"
    // values. See crbug.com/604023
    {
      name: "-webkit-background-origin",
      alias_for: "background-origin"
    },
    // "-webkit-background-size: 10px" behaves as "background-size: 10px 10px"
    {
      name: "-webkit-background-size",
      alias_for: "background-size",
    },
    {
      name: "-webkit-border-bottom-left-radius",
      alias_for: "border-bottom-left-radius",
    },
    {
      name: "-webkit-border-bottom-right-radius",
      alias_for: "border-bottom-right-radius",
    },
    // "-webkit-border-radius: 1px 2px" behaves as "border-radius: 1px / 2px"
    {
      name: "-webkit-border-radius",
      alias_for: "border-radius",
    },
    {
      name: "-webkit-border-top-left-radius",
      alias_for: "border-top-left-radius",
    },
    {
      name: "-webkit-border-top-right-radius",
      alias_for: "border-top-right-radius",
    },
    {
      name: "-webkit-box-shadow",
      alias_for: "box-shadow",
    },
    {
      name: "-webkit-box-sizing",
      alias_for: "box-sizing",
    },
    {
      name: "-webkit-clip-path",
      alias_for: "clip-path",
    },
    {
      name: "-webkit-column-count",
      alias_for: "column-count",
    },
    {
      name: "-webkit-column-gap",
      alias_for: "column-gap",
    },
    {
      name: "-webkit-column-rule",
      alias_for: "column-rule",
    },
    {
      name: "-webkit-column-rule-color",
      alias_for: "column-rule-color",
    },
    {
      name: "-webkit-column-rule-style",
      alias_for: "column-rule-style",
    },
    {
      name: "-webkit-column-rule-width",
      alias_for: "column-rule-width",
    },
    {
      name: "-webkit-column-span",
      alias_for: "column-span",
    },
    {
      name: "-webkit-column-width",
      alias_for: "column-width",
    },
    {
      name: "-webkit-columns",
      alias_for: "columns",
    },
    {
      name: "-webkit-filter",
      alias_for: "filter",
    },
    {
      name: "-webkit-flex",
      alias_for: "flex",
    },
    {
      name: "-webkit-flex-basis",
      alias_for: "flex-basis",
    },
    {
      name: "-webkit-flex-direction",
      alias_for: "flex-direction",
    },
    {
      name: "-webkit-flex-flow",
      alias_for: "flex-flow",
    },
    {
      name: "-webkit-flex-grow",
      alias_for: "flex-grow",
    },
    {
      name: "-webkit-flex-shrink",
      alias_for: "flex-shrink",
    },
    {
      name: "-webkit-flex-wrap",
      alias_for: "flex-wrap",
    },
    {
      name: "-webkit-font-feature-settings",
      alias_for: "font-feature-settings",
    },
    {
      name: "-webkit-hyphenate-character",
      alias_for: "hyphenate-character",
    },
    {
      name: "-webkit-justify-content",
      alias_for: "justify-content",
    },
    {
      name: "-webkit-opacity",
      alias_for: "opacity",
    },
    {
      name: "-webkit-order",
      alias_for: "order",
    },
    {
      name: "-webkit-perspective",
      alias_for: "perspective",
    },
    {
      name: "-webkit-perspective-origin",
      alias_for: "perspective-origin",
    },
    {
      name: "-webkit-shape-image-threshold",
      alias_for: "shape-image-threshold",
    },
    {
      name: "-webkit-shape-margin",
      alias_for: "shape-margin",
    },
    {
      name: "-webkit-shape-outside",
      alias_for: "shape-outside",
    },
    {
      name: "-webkit-text-emphasis",
      alias_for: "text-emphasis",
    },
    {
      name: "-webkit-text-emphasis-color",
      alias_for: "text-emphasis-color",
    },
    {
      name: "-webkit-text-emphasis-position",
      alias_for: "text-emphasis-position",
    },
    {
      name: "-webkit-text-emphasis-style",
      alias_for: "text-emphasis-style",
    },
    {
      name: "-webkit-text-size-adjust",
      alias_for: "text-size-adjust",
    },
    {
      name: "-webkit-transform",
      alias_for: "transform",
    },
    {
      name: "-webkit-transform-origin",
      alias_for: "transform-origin",
    },
    {
      name: "-webkit-transform-style",
      alias_for: "transform-style",
    },
    {
      name: "-webkit-transition",
      alias_for: "transition",
    },
    {
      name: "-webkit-transition-delay",
      alias_for: "transition-delay",
    },
    {
      name: "-webkit-transition-duration",
      alias_for: "transition-duration",
    },
    {
      name: "-webkit-transition-property",
      alias_for: "transition-property",
    },
    {
      name: "-webkit-transition-timing-function",
      alias_for: "transition-timing-function",
    },
    {
      name: "-webkit-user-select",
      alias_for: "user-select",
    },
    {
      name: "word-wrap",
      alias_for: "overflow-wrap",
    },
    {
      name: "grid-column-gap",
      alias_for: "column-gap",
    },
    {
      name: "grid-row-gap",
      alias_for: "row-gap",
    },
    {
      name: "grid-gap",
      alias_for: "gap",
    },
  ],
}