/* This file is automatically generated from CSSPropertyNames.in by makeprop, do not edit */

#include "config.h"
#include "StyleBuilder.h"

#include "CSSPrimitiveValueMappings.h"
#include "CSSProperty.h"
#include "RenderStyle.h"
#include "StyleBuilderConverter.h"
#include "StyleBuilderCustom.h"
#include "StylePropertyShorthand.h"
#include "StyleResolver.h"

namespace WebCore {

class StyleBuilderFunctions {
public:
    static void applyInitialColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setColor(RenderStyle::initialColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkColor(RenderStyle::initialColor());
    }
    static void applyInheritColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->color();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkColor(color);
    }
    static void applyValueColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (primitiveValue.getValueID() == CSSValueCurrentcolor) {
            applyInheritColor(styleResolver);
            return;
        }
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialDirection(StyleResolver& styleResolver)
    {
        styleResolver.style()->setDirection(RenderStyle::initialDirection());
    }
    static void applyInheritDirection(StyleResolver& styleResolver)
    {
        styleResolver.style()->setDirection(styleResolver.parentStyle()->direction());
    }
    static void applyInitialDisplay(StyleResolver& styleResolver)
    {
        styleResolver.style()->setDisplay(RenderStyle::initialDisplay());
    }
    static void applyInitialFontStyle(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setItalic(FontCascadeDescription::initialItalic());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInheritFontStyle(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setItalic(styleResolver.parentFontDescription().italic());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyValueFontStyle(StyleResolver& styleResolver, CSSValue& value)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setItalic(downcast<CSSPrimitiveValue>(value));
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInitialTextRendering(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setTextRenderingMode(FontCascadeDescription::initialTextRenderingMode());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInheritTextRendering(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setTextRenderingMode(styleResolver.parentFontDescription().textRenderingMode());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyValueTextRendering(StyleResolver& styleResolver, CSSValue& value)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setTextRenderingMode(downcast<CSSPrimitiveValue>(value));
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyValueFontFeatureSettings(StyleResolver& styleResolver, CSSValue& value)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setFeatureSettings(StyleBuilderConverter::convertFontFeatureSettings(styleResolver, value));
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInitialWebkitFontKerning(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setKerning(FontCascadeDescription::initialKerning());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInheritWebkitFontKerning(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setKerning(styleResolver.parentFontDescription().kerning());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyValueWebkitFontKerning(StyleResolver& styleResolver, CSSValue& value)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setKerning(downcast<CSSPrimitiveValue>(value));
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInitialWebkitFontSmoothing(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setFontSmoothing(FontCascadeDescription::initialFontSmoothing());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInheritWebkitFontSmoothing(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setFontSmoothing(styleResolver.parentFontDescription().fontSmoothing());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyValueWebkitFontSmoothing(StyleResolver& styleResolver, CSSValue& value)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setFontSmoothing(downcast<CSSPrimitiveValue>(value));
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInitialFontVariantPosition(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setVariantPosition(FontCascadeDescription::initialVariantPosition());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInheritFontVariantPosition(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setVariantPosition(styleResolver.parentFontDescription().variantPosition());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyValueFontVariantPosition(StyleResolver& styleResolver, CSSValue& value)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setVariantPosition(downcast<CSSPrimitiveValue>(value));
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInitialFontVariantCaps(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setVariantCaps(FontCascadeDescription::initialVariantCaps());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInheritFontVariantCaps(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setVariantCaps(styleResolver.parentFontDescription().variantCaps());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyValueFontVariantCaps(StyleResolver& styleResolver, CSSValue& value)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setVariantCaps(downcast<CSSPrimitiveValue>(value));
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInitialFontVariantAlternates(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setVariantAlternates(FontCascadeDescription::initialVariantAlternates());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInheritFontVariantAlternates(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setVariantAlternates(styleResolver.parentFontDescription().variantAlternates());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyValueFontVariantAlternates(StyleResolver& styleResolver, CSSValue& value)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setVariantAlternates(downcast<CSSPrimitiveValue>(value));
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInitialWebkitLocale(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setLocale(FontCascadeDescription::initialLocale());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInheritWebkitLocale(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setLocale(styleResolver.parentFontDescription().locale());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInitialWebkitTextOrientation(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextOrientation(RenderStyle::initialTextOrientation());
    }
    static void applyInheritWebkitTextOrientation(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextOrientation(styleResolver.parentStyle()->textOrientation());
    }
    static void applyInitialWebkitWritingMode(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWritingMode(RenderStyle::initialWritingMode());
    }
    static void applyInheritWebkitWritingMode(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWritingMode(styleResolver.parentStyle()->writingMode());
    }
    static void applyInitialWebkitTextZoom(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextZoom(RenderStyle::initialTextZoom());
    }
    static void applyInheritWebkitTextZoom(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextZoom(styleResolver.parentStyle()->textZoom());
    }
    static void applyInitialFontSynthesis(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setFontSynthesis(FontCascadeDescription::initialFontSynthesis());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInheritFontSynthesis(StyleResolver& styleResolver)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setFontSynthesis(styleResolver.parentFontDescription().fontSynthesis());
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyValueFontSynthesis(StyleResolver& styleResolver, CSSValue& value)
    {
        auto fontDescription = styleResolver.fontDescription();
        fontDescription.setFontSynthesis(StyleBuilderConverter::convertFontSynthesis(styleResolver, value));
        styleResolver.setFontDescription(fontDescription);
    }
    static void applyInitialWebkitRubyPosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRubyPosition(RenderStyle::initialRubyPosition());
    }
    static void applyInheritWebkitRubyPosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRubyPosition(styleResolver.parentStyle()->rubyPosition());
    }
    static void applyValueWebkitRubyPosition(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setRubyPosition(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialAlignmentBaseline(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setAlignmentBaseline(SVGRenderStyle::initialAlignmentBaseline());
    }
    static void applyInheritAlignmentBaseline(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setAlignmentBaseline(styleResolver.parentStyle()->svgStyle().alignmentBaseline());
    }
    static void applyValueAlignmentBaseline(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setAlignmentBaseline(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialAnimationDelay(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setDelay(Animation::initialDelay());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearDelay();
    }
    static void applyInheritAnimationDelay(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        const AnimationList* parentList = styleResolver.parentStyle()->animations();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isDelaySet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setDelay(parentList->animation(i).delay());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearDelay();
    }
    static void applyValueAnimationDelay(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationDelay(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationDelay(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearDelay();
        }
    }
    static void applyInitialAnimationDirection(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setDirection(Animation::initialDirection());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearDirection();
    }
    static void applyInheritAnimationDirection(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        const AnimationList* parentList = styleResolver.parentStyle()->animations();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isDirectionSet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setDirection(parentList->animation(i).direction());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearDirection();
    }
    static void applyValueAnimationDirection(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationDirection(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationDirection(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearDirection();
        }
    }
    static void applyInitialAnimationDuration(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setDuration(Animation::initialDuration());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearDuration();
    }
    static void applyInheritAnimationDuration(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        const AnimationList* parentList = styleResolver.parentStyle()->animations();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isDurationSet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setDuration(parentList->animation(i).duration());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearDuration();
    }
    static void applyValueAnimationDuration(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationDuration(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationDuration(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearDuration();
        }
    }
    static void applyInitialAnimationFillMode(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setFillMode(Animation::initialFillMode());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearFillMode();
    }
    static void applyInheritAnimationFillMode(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        const AnimationList* parentList = styleResolver.parentStyle()->animations();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isFillModeSet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setFillMode(parentList->animation(i).fillMode());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearFillMode();
    }
    static void applyValueAnimationFillMode(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationFillMode(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationFillMode(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearFillMode();
        }
    }
    static void applyInitialAnimationIterationCount(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setIterationCount(Animation::initialIterationCount());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearIterationCount();
    }
    static void applyInheritAnimationIterationCount(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        const AnimationList* parentList = styleResolver.parentStyle()->animations();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isIterationCountSet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setIterationCount(parentList->animation(i).iterationCount());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearIterationCount();
    }
    static void applyValueAnimationIterationCount(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationIterationCount(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationIterationCount(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearIterationCount();
        }
    }
    static void applyInitialAnimationName(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setName(Animation::initialName());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearName();
    }
    static void applyInheritAnimationName(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        const AnimationList* parentList = styleResolver.parentStyle()->animations();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isNameSet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setName(parentList->animation(i).name());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearName();
    }
    static void applyValueAnimationName(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationName(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationName(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearName();
        }
    }
    static void applyInitialAnimationPlayState(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setPlayState(Animation::initialPlayState());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearPlayState();
    }
    static void applyInheritAnimationPlayState(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        const AnimationList* parentList = styleResolver.parentStyle()->animations();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isPlayStateSet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setPlayState(parentList->animation(i).playState());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearPlayState();
    }
    static void applyValueAnimationPlayState(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationPlayState(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationPlayState(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearPlayState();
        }
    }
    static void applyInitialAnimationTimingFunction(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setTimingFunction(Animation::initialTimingFunction());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearTimingFunction();
    }
    static void applyInheritAnimationTimingFunction(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        const AnimationList* parentList = styleResolver.parentStyle()->animations();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isTimingFunctionSet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setTimingFunction(parentList->animation(i).timingFunction());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearTimingFunction();
    }
    static void applyValueAnimationTimingFunction(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureAnimations();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationTimingFunction(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationTimingFunction(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearTimingFunction();
        }
    }
    static void applyInitialBackgroundAttachment(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isAttachmentSet() || layers.attachment() == FillLayer::initialFillAttachment(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setAttachment(FillLayer::initialFillAttachment(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearAttachment();
    }
    static void applyInheritBackgroundAttachment(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isAttachmentSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setAttachment(parent->attachment());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearAttachment();
    }
    static void applyValueBackgroundAttachment(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillAttachment(CSSPropertyBackgroundAttachment, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillAttachment(CSSPropertyBackgroundAttachment, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearAttachment();
    }
    static void applyInitialBackgroundBlendMode(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isBlendModeSet() || layers.blendMode() == FillLayer::initialFillBlendMode(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setBlendMode(FillLayer::initialFillBlendMode(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearBlendMode();
    }
    static void applyInheritBackgroundBlendMode(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isBlendModeSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setBlendMode(parent->blendMode());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearBlendMode();
    }
    static void applyValueBackgroundBlendMode(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillBlendMode(CSSPropertyBackgroundBlendMode, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillBlendMode(CSSPropertyBackgroundBlendMode, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearBlendMode();
    }
    static void applyInitialBackgroundClip(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isClipSet() || layers.clip() == FillLayer::initialFillClip(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setClip(FillLayer::initialFillClip(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearClip();
    }
    static void applyInheritBackgroundClip(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isClipSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setClip(parent->clip());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearClip();
    }
    static void applyValueBackgroundClip(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillClip(CSSPropertyBackgroundClip, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillClip(CSSPropertyBackgroundClip, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearClip();
    }
    static void applyInitialBackgroundColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBackgroundColor(RenderStyle::initialBackgroundColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBackgroundColor(RenderStyle::initialBackgroundColor());
    }
    static void applyInheritBackgroundColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->backgroundColor();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBackgroundColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBackgroundColor(color);
    }
    static void applyValueBackgroundColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBackgroundColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBackgroundColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialBackgroundImage(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isImageSet() || layers.image() == FillLayer::initialFillImage(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setImage(FillLayer::initialFillImage(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearImage();
    }
    static void applyInheritBackgroundImage(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isImageSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setImage(parent->image());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearImage();
    }
    static void applyValueBackgroundImage(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillImage(CSSPropertyBackgroundImage, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillImage(CSSPropertyBackgroundImage, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearImage();
    }
    static void applyInitialBackgroundOrigin(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isOriginSet() || layers.origin() == FillLayer::initialFillOrigin(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setOrigin(FillLayer::initialFillOrigin(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearOrigin();
    }
    static void applyInheritBackgroundOrigin(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isOriginSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setOrigin(parent->origin());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearOrigin();
    }
    static void applyValueBackgroundOrigin(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillOrigin(CSSPropertyBackgroundOrigin, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillOrigin(CSSPropertyBackgroundOrigin, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearOrigin();
    }
    static void applyInitialBackgroundPositionX(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isXPositionSet() || layers.xPosition() == FillLayer::initialFillXPosition(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setXPosition(FillLayer::initialFillXPosition(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearXPosition();
    }
    static void applyInheritBackgroundPositionX(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isXPositionSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setXPosition(parent->xPosition());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearXPosition();
    }
    static void applyValueBackgroundPositionX(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillXPosition(CSSPropertyBackgroundPositionX, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillXPosition(CSSPropertyBackgroundPositionX, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearXPosition();
    }
    static void applyInitialBackgroundPositionY(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isYPositionSet() || layers.yPosition() == FillLayer::initialFillYPosition(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setYPosition(FillLayer::initialFillYPosition(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearYPosition();
    }
    static void applyInheritBackgroundPositionY(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isYPositionSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setYPosition(parent->yPosition());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearYPosition();
    }
    static void applyValueBackgroundPositionY(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillYPosition(CSSPropertyBackgroundPositionY, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillYPosition(CSSPropertyBackgroundPositionY, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearYPosition();
    }
    static void applyInitialBackgroundRepeatX(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isRepeatXSet() || layers.repeatX() == FillLayer::initialFillRepeatX(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setRepeatX(FillLayer::initialFillRepeatX(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearRepeatX();
    }
    static void applyInheritBackgroundRepeatX(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isRepeatXSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setRepeatX(parent->repeatX());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearRepeatX();
    }
    static void applyValueBackgroundRepeatX(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillRepeatX(CSSPropertyBackgroundRepeatX, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillRepeatX(CSSPropertyBackgroundRepeatX, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearRepeatX();
    }
    static void applyInitialBackgroundRepeatY(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isRepeatYSet() || layers.repeatY() == FillLayer::initialFillRepeatY(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setRepeatY(FillLayer::initialFillRepeatY(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearRepeatY();
    }
    static void applyInheritBackgroundRepeatY(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isRepeatYSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setRepeatY(parent->repeatY());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearRepeatY();
    }
    static void applyValueBackgroundRepeatY(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillRepeatY(CSSPropertyBackgroundRepeatY, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillRepeatY(CSSPropertyBackgroundRepeatY, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearRepeatY();
    }
    static void applyInitialBackgroundSize(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isSizeSet() || layers.size() == FillLayer::initialFillSize(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setSize(FillLayer::initialFillSize(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearSize();
    }
    static void applyInheritBackgroundSize(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isSizeSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setSize(parent->size());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearSize();
    }
    static void applyValueBackgroundSize(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillSize(CSSPropertyBackgroundSize, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillSize(CSSPropertyBackgroundSize, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearSize();
    }
    static void applyInitialBaselineShift(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setBaselineShift(SVGRenderStyle::initialBaselineShift());
    }
    static void applyInheritBaselineShift(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setBaselineShift(styleResolver.parentStyle()->svgStyle().baselineShift());
    }
    static void applyInitialBorderBottomColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderBottomColor(RenderStyle::invalidColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderBottomColor(RenderStyle::invalidColor());
    }
    static void applyInheritBorderBottomColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->borderBottomColor();
        if (!color.isValid())
            color = styleResolver.parentStyle()->color();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderBottomColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderBottomColor(color);
    }
    static void applyValueBorderBottomColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderBottomColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderBottomColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialBorderBottomLeftRadius(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderBottomLeftRadius(RenderStyle::initialBorderRadius());
    }
    static void applyInheritBorderBottomLeftRadius(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderBottomLeftRadius(styleResolver.parentStyle()->borderBottomLeftRadius());
    }
    static void applyValueBorderBottomLeftRadius(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderBottomLeftRadius(StyleBuilderConverter::convertRadius(styleResolver, value));
    }
    static void applyInitialBorderBottomRightRadius(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderBottomRightRadius(RenderStyle::initialBorderRadius());
    }
    static void applyInheritBorderBottomRightRadius(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderBottomRightRadius(styleResolver.parentStyle()->borderBottomRightRadius());
    }
    static void applyValueBorderBottomRightRadius(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderBottomRightRadius(StyleBuilderConverter::convertRadius(styleResolver, value));
    }
    static void applyInitialBorderBottomStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderBottomStyle(RenderStyle::initialBorderStyle());
    }
    static void applyInheritBorderBottomStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderBottomStyle(styleResolver.parentStyle()->borderBottomStyle());
    }
    static void applyValueBorderBottomStyle(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderBottomStyle(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialBorderBottomWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderBottomWidth(RenderStyle::initialBorderWidth());
    }
    static void applyInheritBorderBottomWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderBottomWidth(styleResolver.parentStyle()->borderBottomWidth());
    }
    static void applyValueBorderBottomWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderBottomWidth(StyleBuilderConverter::convertLineWidth<float>(styleResolver, value));
    }
    static void applyInitialBorderCollapse(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderCollapse(RenderStyle::initialBorderCollapse());
    }
    static void applyInheritBorderCollapse(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderCollapse(styleResolver.parentStyle()->borderCollapse());
    }
    static void applyValueBorderCollapse(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderCollapse(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialBorderImageSource(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderImageSource(RenderStyle::initialBorderImageSource());
    }
    static void applyInheritBorderImageSource(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderImageSource(styleResolver.parentStyle()->borderImageSource());
    }
    static void applyValueBorderImageSource(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderImageSource(StyleBuilderConverter::convertStyleImage<CSSPropertyBorderImageSource>(styleResolver, value));
    }
    static void applyInitialBorderLeftColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderLeftColor(RenderStyle::invalidColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderLeftColor(RenderStyle::invalidColor());
    }
    static void applyInheritBorderLeftColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->borderLeftColor();
        if (!color.isValid())
            color = styleResolver.parentStyle()->color();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderLeftColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderLeftColor(color);
    }
    static void applyValueBorderLeftColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderLeftColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderLeftColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialBorderLeftStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderLeftStyle(RenderStyle::initialBorderStyle());
    }
    static void applyInheritBorderLeftStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderLeftStyle(styleResolver.parentStyle()->borderLeftStyle());
    }
    static void applyValueBorderLeftStyle(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderLeftStyle(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialBorderLeftWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderLeftWidth(RenderStyle::initialBorderWidth());
    }
    static void applyInheritBorderLeftWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderLeftWidth(styleResolver.parentStyle()->borderLeftWidth());
    }
    static void applyValueBorderLeftWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderLeftWidth(StyleBuilderConverter::convertLineWidth<float>(styleResolver, value));
    }
    static void applyInitialBorderRightColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderRightColor(RenderStyle::invalidColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderRightColor(RenderStyle::invalidColor());
    }
    static void applyInheritBorderRightColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->borderRightColor();
        if (!color.isValid())
            color = styleResolver.parentStyle()->color();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderRightColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderRightColor(color);
    }
    static void applyValueBorderRightColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderRightColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderRightColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialBorderRightStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderRightStyle(RenderStyle::initialBorderStyle());
    }
    static void applyInheritBorderRightStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderRightStyle(styleResolver.parentStyle()->borderRightStyle());
    }
    static void applyValueBorderRightStyle(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderRightStyle(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialBorderRightWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderRightWidth(RenderStyle::initialBorderWidth());
    }
    static void applyInheritBorderRightWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderRightWidth(styleResolver.parentStyle()->borderRightWidth());
    }
    static void applyValueBorderRightWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderRightWidth(StyleBuilderConverter::convertLineWidth<float>(styleResolver, value));
    }
    static void applyInitialBorderTopColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderTopColor(RenderStyle::invalidColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderTopColor(RenderStyle::invalidColor());
    }
    static void applyInheritBorderTopColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->borderTopColor();
        if (!color.isValid())
            color = styleResolver.parentStyle()->color();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderTopColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderTopColor(color);
    }
    static void applyValueBorderTopColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setBorderTopColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkBorderTopColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialBorderTopLeftRadius(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderTopLeftRadius(RenderStyle::initialBorderRadius());
    }
    static void applyInheritBorderTopLeftRadius(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderTopLeftRadius(styleResolver.parentStyle()->borderTopLeftRadius());
    }
    static void applyValueBorderTopLeftRadius(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderTopLeftRadius(StyleBuilderConverter::convertRadius(styleResolver, value));
    }
    static void applyInitialBorderTopRightRadius(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderTopRightRadius(RenderStyle::initialBorderRadius());
    }
    static void applyInheritBorderTopRightRadius(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderTopRightRadius(styleResolver.parentStyle()->borderTopRightRadius());
    }
    static void applyValueBorderTopRightRadius(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderTopRightRadius(StyleBuilderConverter::convertRadius(styleResolver, value));
    }
    static void applyInitialBorderTopStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderTopStyle(RenderStyle::initialBorderStyle());
    }
    static void applyInheritBorderTopStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderTopStyle(styleResolver.parentStyle()->borderTopStyle());
    }
    static void applyValueBorderTopStyle(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderTopStyle(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialBorderTopWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderTopWidth(RenderStyle::initialBorderWidth());
    }
    static void applyInheritBorderTopWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderTopWidth(styleResolver.parentStyle()->borderTopWidth());
    }
    static void applyValueBorderTopWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderTopWidth(StyleBuilderConverter::convertLineWidth<float>(styleResolver, value));
    }
    static void applyInitialBottom(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBottom(RenderStyle::initialOffset());
    }
    static void applyInheritBottom(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBottom(styleResolver.parentStyle()->bottom());
    }
    static void applyValueBottom(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBottom(StyleBuilderConverter::convertLengthOrAuto(styleResolver, value));
    }
    static void applyInitialBoxSizing(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxSizing(RenderStyle::initialBoxSizing());
    }
    static void applyInheritBoxSizing(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxSizing(styleResolver.parentStyle()->boxSizing());
    }
    static void applyValueBoxSizing(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBoxSizing(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialBreakAfter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakAfter(RenderStyle::initialBreakBetween());
    }
    static void applyInheritBreakAfter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakAfter(styleResolver.parentStyle()->breakAfter());
    }
    static void applyValueBreakAfter(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakAfter(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialBreakBefore(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakBefore(RenderStyle::initialBreakBetween());
    }
    static void applyInheritBreakBefore(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakBefore(styleResolver.parentStyle()->breakBefore());
    }
    static void applyValueBreakBefore(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakBefore(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialBreakInside(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakInside(RenderStyle::initialBreakInside());
    }
    static void applyInheritBreakInside(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakInside(styleResolver.parentStyle()->breakInside());
    }
    static void applyValueBreakInside(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakInside(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialBufferedRendering(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setBufferedRendering(SVGRenderStyle::initialBufferedRendering());
    }
    static void applyInheritBufferedRendering(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setBufferedRendering(styleResolver.parentStyle()->svgStyle().bufferedRendering());
    }
    static void applyValueBufferedRendering(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setBufferedRendering(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialCaptionSide(StyleResolver& styleResolver)
    {
        styleResolver.style()->setCaptionSide(RenderStyle::initialCaptionSide());
    }
    static void applyInheritCaptionSide(StyleResolver& styleResolver)
    {
        styleResolver.style()->setCaptionSide(styleResolver.parentStyle()->captionSide());
    }
    static void applyValueCaptionSide(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setCaptionSide(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialClear(StyleResolver& styleResolver)
    {
        styleResolver.style()->setClear(RenderStyle::initialClear());
    }
    static void applyInheritClear(StyleResolver& styleResolver)
    {
        styleResolver.style()->setClear(styleResolver.parentStyle()->clear());
    }
    static void applyValueClear(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setClear(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitClipPath(StyleResolver& styleResolver)
    {
        styleResolver.style()->setClipPath(RenderStyle::initialClipPath());
    }
    static void applyInheritWebkitClipPath(StyleResolver& styleResolver)
    {
        styleResolver.style()->setClipPath(styleResolver.parentStyle()->clipPath());
    }
    static void applyValueWebkitClipPath(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setClipPath(StyleBuilderConverter::convertClipPath(styleResolver, value));
    }
    static void applyInitialClipPath(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setClipperResource(SVGRenderStyle::initialClipperResource());
    }
    static void applyInheritClipPath(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setClipperResource(styleResolver.parentStyle()->svgStyle().clipperResource());
    }
    static void applyValueClipPath(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setClipperResource(StyleBuilderConverter::convertSVGURIReference(styleResolver, value));
    }
    static void applyInitialClipRule(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setClipRule(SVGRenderStyle::initialClipRule());
    }
    static void applyInheritClipRule(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setClipRule(styleResolver.parentStyle()->svgStyle().clipRule());
    }
    static void applyValueClipRule(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setClipRule(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialColorInterpolation(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setColorInterpolation(SVGRenderStyle::initialColorInterpolation());
    }
    static void applyInheritColorInterpolation(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setColorInterpolation(styleResolver.parentStyle()->svgStyle().colorInterpolation());
    }
    static void applyValueColorInterpolation(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setColorInterpolation(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialColorInterpolationFilters(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setColorInterpolationFilters(SVGRenderStyle::initialColorInterpolationFilters());
    }
    static void applyInheritColorInterpolationFilters(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setColorInterpolationFilters(styleResolver.parentStyle()->svgStyle().colorInterpolationFilters());
    }
    static void applyValueColorInterpolationFilters(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setColorInterpolationFilters(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialColorRendering(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setColorRendering(SVGRenderStyle::initialColorRendering());
    }
    static void applyInheritColorRendering(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setColorRendering(styleResolver.parentStyle()->svgStyle().colorRendering());
    }
    static void applyValueColorRendering(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setColorRendering(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitCursorVisibility(StyleResolver& styleResolver)
    {
        styleResolver.style()->setCursorVisibility(RenderStyle::initialCursorVisibility());
    }
    static void applyInheritWebkitCursorVisibility(StyleResolver& styleResolver)
    {
        styleResolver.style()->setCursorVisibility(styleResolver.parentStyle()->cursorVisibility());
    }
    static void applyValueWebkitCursorVisibility(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setCursorVisibility(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialCx(StyleResolver& styleResolver)
    {
        styleResolver.style()->setCx(RenderStyle::initialZeroLength());
    }
    static void applyInheritCx(StyleResolver& styleResolver)
    {
        styleResolver.style()->setCx(styleResolver.parentStyle()->cx());
    }
    static void applyValueCx(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setCx(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialCy(StyleResolver& styleResolver)
    {
        styleResolver.style()->setCy(RenderStyle::initialZeroLength());
    }
    static void applyInheritCy(StyleResolver& styleResolver)
    {
        styleResolver.style()->setCy(styleResolver.parentStyle()->cy());
    }
    static void applyValueCy(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setCy(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialDominantBaseline(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setDominantBaseline(SVGRenderStyle::initialDominantBaseline());
    }
    static void applyInheritDominantBaseline(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setDominantBaseline(styleResolver.parentStyle()->svgStyle().dominantBaseline());
    }
    static void applyValueDominantBaseline(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setDominantBaseline(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialEmptyCells(StyleResolver& styleResolver)
    {
        styleResolver.style()->setEmptyCells(RenderStyle::initialEmptyCells());
    }
    static void applyInheritEmptyCells(StyleResolver& styleResolver)
    {
        styleResolver.style()->setEmptyCells(styleResolver.parentStyle()->emptyCells());
    }
    static void applyValueEmptyCells(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setEmptyCells(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialFillOpacity(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setFillOpacity(SVGRenderStyle::initialFillOpacity());
    }
    static void applyInheritFillOpacity(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setFillOpacity(styleResolver.parentStyle()->svgStyle().fillOpacity());
    }
    static void applyValueFillOpacity(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setFillOpacity(StyleBuilderConverter::convertOpacity(styleResolver, value));
    }
    static void applyInitialFillRule(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setFillRule(SVGRenderStyle::initialFillRule());
    }
    static void applyInheritFillRule(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setFillRule(styleResolver.parentStyle()->svgStyle().fillRule());
    }
    static void applyValueFillRule(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setFillRule(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialFloat(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFloating(RenderStyle::initialFloating());
    }
    static void applyInheritFloat(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFloating(styleResolver.parentStyle()->floating());
    }
    static void applyValueFloat(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setFloating(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialFloodColor(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setFloodColor(SVGRenderStyle::initialFloodColor());
    }
    static void applyInheritFloodColor(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setFloodColor(styleResolver.parentStyle()->svgStyle().floodColor());
    }
    static void applyValueFloodColor(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setFloodColor(StyleBuilderConverter::convertSVGColor(styleResolver, value));
    }
    static void applyInitialFloodOpacity(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setFloodOpacity(SVGRenderStyle::initialFloodOpacity());
    }
    static void applyInheritFloodOpacity(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setFloodOpacity(styleResolver.parentStyle()->svgStyle().floodOpacity());
    }
    static void applyValueFloodOpacity(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setFloodOpacity(StyleBuilderConverter::convertOpacity(styleResolver, value));
    }
    static void applyInitialGlyphOrientationHorizontal(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setGlyphOrientationHorizontal(SVGRenderStyle::initialGlyphOrientationHorizontal());
    }
    static void applyInheritGlyphOrientationHorizontal(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setGlyphOrientationHorizontal(styleResolver.parentStyle()->svgStyle().glyphOrientationHorizontal());
    }
    static void applyValueGlyphOrientationHorizontal(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setGlyphOrientationHorizontal(StyleBuilderConverter::convertGlyphOrientation(styleResolver, value));
    }
    static void applyInitialGlyphOrientationVertical(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setGlyphOrientationVertical(SVGRenderStyle::initialGlyphOrientationVertical());
    }
    static void applyInheritGlyphOrientationVertical(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setGlyphOrientationVertical(styleResolver.parentStyle()->svgStyle().glyphOrientationVertical());
    }
    static void applyValueGlyphOrientationVertical(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setGlyphOrientationVertical(StyleBuilderConverter::convertGlyphOrientationOrAuto(styleResolver, value));
    }
    static void applyInitialHangingPunctuation(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHangingPunctuation(RenderStyle::initialHangingPunctuation());
    }
    static void applyInheritHangingPunctuation(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHangingPunctuation(styleResolver.parentStyle()->hangingPunctuation());
    }
    static void applyValueHangingPunctuation(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setHangingPunctuation(StyleBuilderConverter::convertHangingPunctuation(styleResolver, value));
    }
    static void applyInitialHeight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHeight(RenderStyle::initialSize());
    }
    static void applyInheritHeight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHeight(styleResolver.parentStyle()->height());
    }
    static void applyValueHeight(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setHeight(StyleBuilderConverter::convertLengthSizing(styleResolver, value));
    }
    static void applyInitialImageRendering(StyleResolver& styleResolver)
    {
        styleResolver.style()->setImageRendering(RenderStyle::initialImageRendering());
    }
    static void applyInheritImageRendering(StyleResolver& styleResolver)
    {
        styleResolver.style()->setImageRendering(styleResolver.parentStyle()->imageRendering());
    }
    static void applyValueImageRendering(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setImageRendering(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialKerning(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setKerning(SVGRenderStyle::initialKerning());
    }
    static void applyInheritKerning(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setKerning(styleResolver.parentStyle()->svgStyle().kerning());
    }
    static void applyValueKerning(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setKerning(StyleBuilderConverter::convertSVGLength(styleResolver, value));
    }
    static void applyInitialLeft(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLeft(RenderStyle::initialOffset());
    }
    static void applyInheritLeft(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLeft(styleResolver.parentStyle()->left());
    }
    static void applyValueLeft(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setLeft(StyleBuilderConverter::convertLengthOrAuto(styleResolver, value));
    }
    static void applyInitialLetterSpacing(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLetterSpacing(RenderStyle::initialLetterSpacing());
    }
    static void applyInheritLetterSpacing(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLetterSpacing(styleResolver.parentStyle()->letterSpacing());
    }
    static void applyValueLetterSpacing(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setLetterSpacing(StyleBuilderConverter::convertSpacing(styleResolver, value));
    }
    static void applyInitialLightingColor(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setLightingColor(SVGRenderStyle::initialLightingColor());
    }
    static void applyInheritLightingColor(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setLightingColor(styleResolver.parentStyle()->svgStyle().lightingColor());
    }
    static void applyValueLightingColor(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setLightingColor(StyleBuilderConverter::convertSVGColor(styleResolver, value));
    }
    static void applyInitialLineHeight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineHeight(RenderStyle::initialLineHeight());
    }
    static void applyInheritLineHeight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineHeight(styleResolver.parentStyle()->specifiedLineHeight());
    }
    static void applyValueLineHeight(StyleResolver& styleResolver, CSSValue& value)
    {
        auto convertedValue = StyleBuilderConverter::convertLineHeight(styleResolver, value);
        if (convertedValue)
            styleResolver.style()->setLineHeight(convertedValue.value());
    }
    static void applyInitialListStyleImage(StyleResolver& styleResolver)
    {
        styleResolver.style()->setListStyleImage(RenderStyle::initialListStyleImage());
    }
    static void applyInheritListStyleImage(StyleResolver& styleResolver)
    {
        styleResolver.style()->setListStyleImage(styleResolver.parentStyle()->listStyleImage());
    }
    static void applyValueListStyleImage(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setListStyleImage(StyleBuilderConverter::convertStyleImage<CSSPropertyListStyleImage>(styleResolver, value));
    }
    static void applyInitialListStylePosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setListStylePosition(RenderStyle::initialListStylePosition());
    }
    static void applyInheritListStylePosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setListStylePosition(styleResolver.parentStyle()->listStylePosition());
    }
    static void applyValueListStylePosition(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setListStylePosition(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialListStyleType(StyleResolver& styleResolver)
    {
        styleResolver.style()->setListStyleType(RenderStyle::initialListStyleType());
    }
    static void applyInheritListStyleType(StyleResolver& styleResolver)
    {
        styleResolver.style()->setListStyleType(styleResolver.parentStyle()->listStyleType());
    }
    static void applyValueListStyleType(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setListStyleType(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialMarginBottom(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginBottom(RenderStyle::initialMargin());
    }
    static void applyInheritMarginBottom(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginBottom(styleResolver.parentStyle()->marginBottom());
    }
    static void applyValueMarginBottom(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarginBottom(StyleBuilderConverter::convertLengthOrAuto(styleResolver, value));
    }
    static void applyInitialMarginLeft(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginLeft(RenderStyle::initialMargin());
    }
    static void applyInheritMarginLeft(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginLeft(styleResolver.parentStyle()->marginLeft());
    }
    static void applyValueMarginLeft(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarginLeft(StyleBuilderConverter::convertLengthOrAuto(styleResolver, value));
    }
    static void applyInitialMarginRight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginRight(RenderStyle::initialMargin());
    }
    static void applyInheritMarginRight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginRight(styleResolver.parentStyle()->marginRight());
    }
    static void applyValueMarginRight(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarginRight(StyleBuilderConverter::convertLengthOrAuto(styleResolver, value));
    }
    static void applyInitialMarginTop(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginTop(RenderStyle::initialMargin());
    }
    static void applyInheritMarginTop(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginTop(styleResolver.parentStyle()->marginTop());
    }
    static void applyValueMarginTop(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarginTop(StyleBuilderConverter::convertLengthOrAuto(styleResolver, value));
    }
    static void applyInitialMarkerEnd(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setMarkerEndResource(SVGRenderStyle::initialMarkerEndResource());
    }
    static void applyInheritMarkerEnd(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setMarkerEndResource(styleResolver.parentStyle()->svgStyle().markerEndResource());
    }
    static void applyValueMarkerEnd(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setMarkerEndResource(StyleBuilderConverter::convertSVGURIReference(styleResolver, value));
    }
    static void applyInitialMarkerMid(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setMarkerMidResource(SVGRenderStyle::initialMarkerMidResource());
    }
    static void applyInheritMarkerMid(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setMarkerMidResource(styleResolver.parentStyle()->svgStyle().markerMidResource());
    }
    static void applyValueMarkerMid(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setMarkerMidResource(StyleBuilderConverter::convertSVGURIReference(styleResolver, value));
    }
    static void applyInitialMarkerStart(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setMarkerStartResource(SVGRenderStyle::initialMarkerStartResource());
    }
    static void applyInheritMarkerStart(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setMarkerStartResource(styleResolver.parentStyle()->svgStyle().markerStartResource());
    }
    static void applyValueMarkerStart(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setMarkerStartResource(StyleBuilderConverter::convertSVGURIReference(styleResolver, value));
    }
    static void applyInitialMask(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setMaskerResource(SVGRenderStyle::initialMaskerResource());
    }
    static void applyInheritMask(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setMaskerResource(styleResolver.parentStyle()->svgStyle().maskerResource());
    }
    static void applyValueMask(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setMaskerResource(StyleBuilderConverter::convertSVGURIReference(styleResolver, value));
    }
    static void applyInitialMaskType(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setMaskType(SVGRenderStyle::initialMaskType());
    }
    static void applyInheritMaskType(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setMaskType(styleResolver.parentStyle()->svgStyle().maskType());
    }
    static void applyValueMaskType(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setMaskType(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialMaxHeight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMaxHeight(RenderStyle::initialMaxSize());
    }
    static void applyInheritMaxHeight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMaxHeight(styleResolver.parentStyle()->maxHeight());
    }
    static void applyValueMaxHeight(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMaxHeight(StyleBuilderConverter::convertLengthMaxSizing(styleResolver, value));
    }
    static void applyInitialMaxWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMaxWidth(RenderStyle::initialMaxSize());
    }
    static void applyInheritMaxWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMaxWidth(styleResolver.parentStyle()->maxWidth());
    }
    static void applyValueMaxWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMaxWidth(StyleBuilderConverter::convertLengthMaxSizing(styleResolver, value));
    }
    static void applyInitialMinHeight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMinHeight(RenderStyle::initialMinSize());
    }
    static void applyInheritMinHeight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMinHeight(styleResolver.parentStyle()->minHeight());
    }
    static void applyValueMinHeight(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMinHeight(StyleBuilderConverter::convertLengthSizing(styleResolver, value));
    }
    static void applyInitialMinWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMinWidth(RenderStyle::initialMinSize());
    }
    static void applyInheritMinWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMinWidth(styleResolver.parentStyle()->minWidth());
    }
    static void applyValueMinWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMinWidth(StyleBuilderConverter::convertLengthSizing(styleResolver, value));
    }
    static void applyInitialObjectFit(StyleResolver& styleResolver)
    {
        styleResolver.style()->setObjectFit(RenderStyle::initialObjectFit());
    }
    static void applyInheritObjectFit(StyleResolver& styleResolver)
    {
        styleResolver.style()->setObjectFit(styleResolver.parentStyle()->objectFit());
    }
    static void applyValueObjectFit(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setObjectFit(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialObjectPosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setObjectPosition(RenderStyle::initialObjectPosition());
    }
    static void applyInheritObjectPosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setObjectPosition(styleResolver.parentStyle()->objectPosition());
    }
    static void applyValueObjectPosition(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setObjectPosition(StyleBuilderConverter::convertObjectPosition(styleResolver, value));
    }
    static void applyInitialOpacity(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOpacity(RenderStyle::initialOpacity());
    }
    static void applyInheritOpacity(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOpacity(styleResolver.parentStyle()->opacity());
    }
    static void applyValueOpacity(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setOpacity(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialOrphans(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHasAutoOrphans();
    }
    static void applyInheritOrphans(StyleResolver& styleResolver)
    {
        if (styleResolver.parentStyle()->hasAutoOrphans()) {
            styleResolver.style()->setHasAutoOrphans();
            return;
        }
        styleResolver.style()->setOrphans(styleResolver.parentStyle()->orphans());
    }
    static void applyValueOrphans(StyleResolver& styleResolver, CSSValue& value)
    {
        if (downcast<CSSPrimitiveValue>(value).getValueID() == CSSValueAuto) {
            styleResolver.style()->setHasAutoOrphans();
            return;
        }
        styleResolver.style()->setOrphans(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialOutlineColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setOutlineColor(RenderStyle::invalidColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkOutlineColor(RenderStyle::invalidColor());
    }
    static void applyInheritOutlineColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->outlineColor();
        if (!color.isValid())
            color = styleResolver.parentStyle()->color();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setOutlineColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkOutlineColor(color);
    }
    static void applyValueOutlineColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setOutlineColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkOutlineColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialOutlineOffset(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOutlineOffset(RenderStyle::initialOutlineOffset());
    }
    static void applyInheritOutlineOffset(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOutlineOffset(styleResolver.parentStyle()->outlineOffset());
    }
    static void applyValueOutlineOffset(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setOutlineOffset(StyleBuilderConverter::convertComputedLength<float>(styleResolver, value));
    }
    static void applyInitialOutlineWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOutlineWidth(RenderStyle::initialOutlineWidth());
    }
    static void applyInheritOutlineWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOutlineWidth(styleResolver.parentStyle()->outlineWidth());
    }
    static void applyValueOutlineWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setOutlineWidth(StyleBuilderConverter::convertLineWidth<float>(styleResolver, value));
    }
    static void applyInitialOverflowWrap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOverflowWrap(RenderStyle::initialOverflowWrap());
    }
    static void applyInheritOverflowWrap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOverflowWrap(styleResolver.parentStyle()->overflowWrap());
    }
    static void applyValueOverflowWrap(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setOverflowWrap(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialOverflowX(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOverflowX(RenderStyle::initialOverflowX());
    }
    static void applyInheritOverflowX(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOverflowX(styleResolver.parentStyle()->overflowX());
    }
    static void applyValueOverflowX(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setOverflowX(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialOverflowY(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOverflowY(RenderStyle::initialOverflowY());
    }
    static void applyInheritOverflowY(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOverflowY(styleResolver.parentStyle()->overflowY());
    }
    static void applyValueOverflowY(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setOverflowY(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialPaddingBottom(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPaddingBottom(RenderStyle::initialPadding());
    }
    static void applyInheritPaddingBottom(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPaddingBottom(styleResolver.parentStyle()->paddingBottom());
    }
    static void applyValuePaddingBottom(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setPaddingBottom(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialPaddingLeft(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPaddingLeft(RenderStyle::initialPadding());
    }
    static void applyInheritPaddingLeft(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPaddingLeft(styleResolver.parentStyle()->paddingLeft());
    }
    static void applyValuePaddingLeft(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setPaddingLeft(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialPaddingRight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPaddingRight(RenderStyle::initialPadding());
    }
    static void applyInheritPaddingRight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPaddingRight(styleResolver.parentStyle()->paddingRight());
    }
    static void applyValuePaddingRight(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setPaddingRight(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialPaddingTop(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPaddingTop(RenderStyle::initialPadding());
    }
    static void applyInheritPaddingTop(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPaddingTop(styleResolver.parentStyle()->paddingTop());
    }
    static void applyValuePaddingTop(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setPaddingTop(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialPageBreakAfter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakAfter(RenderStyle::initialBreakBetween());
    }
    static void applyInheritPageBreakAfter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakAfter(styleResolver.parentStyle()->breakAfter());
    }
    static void applyValuePageBreakAfter(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakAfter(StyleBuilderConverter::convertPageBreakBetween(styleResolver, value));
    }
    static void applyInitialPageBreakBefore(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakBefore(RenderStyle::initialBreakBetween());
    }
    static void applyInheritPageBreakBefore(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakBefore(styleResolver.parentStyle()->breakBefore());
    }
    static void applyValuePageBreakBefore(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakBefore(StyleBuilderConverter::convertPageBreakBetween(styleResolver, value));
    }
    static void applyInitialPageBreakInside(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakInside(RenderStyle::initialBreakInside());
    }
    static void applyInheritPageBreakInside(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakInside(styleResolver.parentStyle()->breakInside());
    }
    static void applyValuePageBreakInside(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakInside(StyleBuilderConverter::convertPageBreakInside(styleResolver, value));
    }
    static void applyInitialPaintOrder(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setPaintOrder(SVGRenderStyle::initialPaintOrder());
    }
    static void applyInheritPaintOrder(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setPaintOrder(styleResolver.parentStyle()->svgStyle().paintOrder());
    }
    static void applyValuePaintOrder(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setPaintOrder(StyleBuilderConverter::convertPaintOrder(styleResolver, value));
    }
    static void applyInitialPointerEvents(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPointerEvents(RenderStyle::initialPointerEvents());
    }
    static void applyInheritPointerEvents(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPointerEvents(styleResolver.parentStyle()->pointerEvents());
    }
    static void applyValuePointerEvents(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setPointerEvents(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialPosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPosition(RenderStyle::initialPosition());
    }
    static void applyInheritPosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPosition(styleResolver.parentStyle()->position());
    }
    static void applyValuePosition(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setPosition(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialQuotes(StyleResolver& styleResolver)
    {
        styleResolver.style()->setQuotes(RenderStyle::initialQuotes());
    }
    static void applyInheritQuotes(StyleResolver& styleResolver)
    {
        styleResolver.style()->setQuotes(styleResolver.parentStyle()->quotes());
    }
    static void applyValueQuotes(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setQuotes(StyleBuilderConverter::convertQuotes(styleResolver, value));
    }
    static void applyInitialR(StyleResolver& styleResolver)
    {
        styleResolver.style()->setR(RenderStyle::initialZeroLength());
    }
    static void applyInheritR(StyleResolver& styleResolver)
    {
        styleResolver.style()->setR(styleResolver.parentStyle()->r());
    }
    static void applyValueR(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setR(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialResize(StyleResolver& styleResolver)
    {
        styleResolver.style()->setResize(RenderStyle::initialResize());
    }
    static void applyInheritResize(StyleResolver& styleResolver)
    {
        styleResolver.style()->setResize(styleResolver.parentStyle()->resize());
    }
    static void applyValueResize(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setResize(StyleBuilderConverter::convertResize(styleResolver, value));
    }
    static void applyInitialRight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRight(RenderStyle::initialOffset());
    }
    static void applyInheritRight(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRight(styleResolver.parentStyle()->right());
    }
    static void applyValueRight(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setRight(StyleBuilderConverter::convertLengthOrAuto(styleResolver, value));
    }
    static void applyInitialRx(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRx(RenderStyle::initialZeroLength());
    }
    static void applyInheritRx(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRx(styleResolver.parentStyle()->rx());
    }
    static void applyValueRx(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setRx(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialRy(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRy(RenderStyle::initialZeroLength());
    }
    static void applyInheritRy(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRy(styleResolver.parentStyle()->ry());
    }
    static void applyValueRy(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setRy(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialShapeRendering(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setShapeRendering(SVGRenderStyle::initialShapeRendering());
    }
    static void applyInheritShapeRendering(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setShapeRendering(styleResolver.parentStyle()->svgStyle().shapeRendering());
    }
    static void applyValueShapeRendering(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setShapeRendering(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialStopColor(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setStopColor(SVGRenderStyle::initialStopColor());
    }
    static void applyInheritStopColor(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setStopColor(styleResolver.parentStyle()->svgStyle().stopColor());
    }
    static void applyValueStopColor(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setStopColor(StyleBuilderConverter::convertSVGColor(styleResolver, value));
    }
    static void applyInitialStopOpacity(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setStopOpacity(SVGRenderStyle::initialStopOpacity());
    }
    static void applyInheritStopOpacity(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setStopOpacity(styleResolver.parentStyle()->svgStyle().stopOpacity());
    }
    static void applyValueStopOpacity(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setStopOpacity(StyleBuilderConverter::convertOpacity(styleResolver, value));
    }
    static void applyInitialStrokeDasharray(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setStrokeDashArray(SVGRenderStyle::initialStrokeDashArray());
    }
    static void applyInheritStrokeDasharray(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setStrokeDashArray(styleResolver.parentStyle()->svgStyle().strokeDashArray());
    }
    static void applyValueStrokeDasharray(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setStrokeDashArray(StyleBuilderConverter::convertStrokeDashArray(styleResolver, value));
    }
    static void applyInitialStrokeDashoffset(StyleResolver& styleResolver)
    {
        styleResolver.style()->setStrokeDashOffset(RenderStyle::initialZeroLength());
    }
    static void applyInheritStrokeDashoffset(StyleResolver& styleResolver)
    {
        styleResolver.style()->setStrokeDashOffset(styleResolver.parentStyle()->strokeDashOffset());
    }
    static void applyValueStrokeDashoffset(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setStrokeDashOffset(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialStrokeLinecap(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setCapStyle(SVGRenderStyle::initialCapStyle());
    }
    static void applyInheritStrokeLinecap(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setCapStyle(styleResolver.parentStyle()->svgStyle().capStyle());
    }
    static void applyValueStrokeLinecap(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setCapStyle(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialStrokeLinejoin(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setJoinStyle(SVGRenderStyle::initialJoinStyle());
    }
    static void applyInheritStrokeLinejoin(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setJoinStyle(styleResolver.parentStyle()->svgStyle().joinStyle());
    }
    static void applyValueStrokeLinejoin(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setJoinStyle(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialStrokeMiterlimit(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setStrokeMiterLimit(SVGRenderStyle::initialStrokeMiterLimit());
    }
    static void applyInheritStrokeMiterlimit(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setStrokeMiterLimit(styleResolver.parentStyle()->svgStyle().strokeMiterLimit());
    }
    static void applyValueStrokeMiterlimit(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setStrokeMiterLimit(StyleBuilderConverter::convertNumber<float>(styleResolver, value));
    }
    static void applyInitialStrokeOpacity(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setStrokeOpacity(SVGRenderStyle::initialStrokeOpacity());
    }
    static void applyInheritStrokeOpacity(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setStrokeOpacity(styleResolver.parentStyle()->svgStyle().strokeOpacity());
    }
    static void applyValueStrokeOpacity(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setStrokeOpacity(StyleBuilderConverter::convertOpacity(styleResolver, value));
    }
    static void applyInitialStrokeWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setStrokeWidth(RenderStyle::initialOneLength());
    }
    static void applyInheritStrokeWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setStrokeWidth(styleResolver.parentStyle()->strokeWidth());
    }
    static void applyValueStrokeWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setStrokeWidth(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialSpeak(StyleResolver& styleResolver)
    {
        styleResolver.style()->setSpeak(RenderStyle::initialSpeak());
    }
    static void applyInheritSpeak(StyleResolver& styleResolver)
    {
        styleResolver.style()->setSpeak(styleResolver.parentStyle()->speak());
    }
    static void applyValueSpeak(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setSpeak(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialTableLayout(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTableLayout(RenderStyle::initialTableLayout());
    }
    static void applyInheritTableLayout(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTableLayout(styleResolver.parentStyle()->tableLayout());
    }
    static void applyValueTableLayout(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTableLayout(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialTabSize(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTabSize(RenderStyle::initialTabSize());
    }
    static void applyInheritTabSize(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTabSize(styleResolver.parentStyle()->tabSize());
    }
    static void applyValueTabSize(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTabSize(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialTextAlign(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextAlign(RenderStyle::initialTextAlign());
    }
    static void applyInheritTextAlign(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextAlign(styleResolver.parentStyle()->textAlign());
    }
    static void applyValueTextAlign(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextAlign(StyleBuilderConverter::convertTextAlign(styleResolver, value));
    }
    static void applyInitialTextAnchor(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setTextAnchor(SVGRenderStyle::initialTextAnchor());
    }
    static void applyInheritTextAnchor(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setTextAnchor(styleResolver.parentStyle()->svgStyle().textAnchor());
    }
    static void applyValueTextAnchor(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setTextAnchor(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialTextDecoration(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextDecoration(RenderStyle::initialTextDecoration());
    }
    static void applyInheritTextDecoration(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextDecoration(styleResolver.parentStyle()->textDecoration());
    }
    static void applyValueTextDecoration(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextDecoration(StyleBuilderConverter::convertTextDecoration(styleResolver, value));
    }
    static void applyInitialTextOverflow(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextOverflow(RenderStyle::initialTextOverflow());
    }
    static void applyInheritTextOverflow(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextOverflow(styleResolver.parentStyle()->textOverflow());
    }
    static void applyValueTextOverflow(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextOverflow(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialTextTransform(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextTransform(RenderStyle::initialTextTransform());
    }
    static void applyInheritTextTransform(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextTransform(styleResolver.parentStyle()->textTransform());
    }
    static void applyValueTextTransform(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextTransform(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialTop(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTop(RenderStyle::initialOffset());
    }
    static void applyInheritTop(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTop(styleResolver.parentStyle()->top());
    }
    static void applyValueTop(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTop(StyleBuilderConverter::convertLengthOrAuto(styleResolver, value));
    }
    static void applyInitialTransitionDelay(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setDelay(Animation::initialDelay());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearDelay();
    }
    static void applyInheritTransitionDelay(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        const AnimationList* parentList = styleResolver.parentStyle()->transitions();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isDelaySet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setDelay(parentList->animation(i).delay());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearDelay();
    }
    static void applyValueTransitionDelay(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationDelay(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationDelay(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearDelay();
        }
    }
    static void applyInitialTransitionDuration(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setDuration(Animation::initialDuration());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearDuration();
    }
    static void applyInheritTransitionDuration(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        const AnimationList* parentList = styleResolver.parentStyle()->transitions();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isDurationSet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setDuration(parentList->animation(i).duration());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearDuration();
    }
    static void applyValueTransitionDuration(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationDuration(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationDuration(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearDuration();
        }
    }
    static void applyInitialTransitionProperty(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setProperty(Animation::initialProperty());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearProperty();
    }
    static void applyInheritTransitionProperty(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        const AnimationList* parentList = styleResolver.parentStyle()->transitions();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isPropertySet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setProperty(parentList->animation(i).property());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearProperty();
    }
    static void applyValueTransitionProperty(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationProperty(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationProperty(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearProperty();
        }
    }
    static void applyInitialTransitionTimingFunction(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        if (list.isEmpty())
            list.append(Animation::create());
        list.animation(0).setTimingFunction(Animation::initialTimingFunction());
        for (size_t i = 1; i < list.size(); ++i)
            list.animation(i).clearTimingFunction();
    }
    static void applyInheritTransitionTimingFunction(StyleResolver& styleResolver)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        const AnimationList* parentList = styleResolver.parentStyle()->transitions();
        size_t i = 0, parentSize = parentList ? parentList->size() : 0;
        for ( ; i < parentSize && parentList->animation(i).isTimingFunctionSet(); ++i) {
            if (list.size() <= i)
                list.append(Animation::create());
            list.animation(i).setTimingFunction(parentList->animation(i).timingFunction());
            list.animation(i).setAnimationMode(parentList->animation(i).animationMode());
        }

        /* Reset any remaining animations to not have the property set. */
        for ( ; i < list.size(); ++i)
            list.animation(i).clearTimingFunction();
    }
    static void applyValueTransitionTimingFunction(StyleResolver& styleResolver, CSSValue& value)
    {
        AnimationList& list = styleResolver.style()->ensureTransitions();
        size_t childIndex = 0;
        if (is<CSSValueList>(value)) {
            /* Walk each value and put it into an animation, creating new animations as needed. */
            for (auto& currentValue : downcast<CSSValueList>(value)) {
                if (childIndex <= list.size())
                    list.append(Animation::create());
                styleResolver.styleMap()->mapAnimationTimingFunction(list.animation(childIndex), currentValue);
                ++childIndex;
            }
        } else {
            if (list.isEmpty())
                list.append(Animation::create());
            styleResolver.styleMap()->mapAnimationTimingFunction(list.animation(childIndex), value);
            childIndex = 1;
        }
        for ( ; childIndex < list.size(); ++childIndex) {
            /* Reset all remaining animations to not have the property set. */
            list.animation(childIndex).clearTimingFunction();
        }
    }
    static void applyInitialUnicodeBidi(StyleResolver& styleResolver)
    {
        styleResolver.style()->setUnicodeBidi(RenderStyle::initialUnicodeBidi());
    }
    static void applyInheritUnicodeBidi(StyleResolver& styleResolver)
    {
        styleResolver.style()->setUnicodeBidi(styleResolver.parentStyle()->unicodeBidi());
    }
    static void applyValueUnicodeBidi(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setUnicodeBidi(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialVectorEffect(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setVectorEffect(SVGRenderStyle::initialVectorEffect());
    }
    static void applyInheritVectorEffect(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setVectorEffect(styleResolver.parentStyle()->svgStyle().vectorEffect());
    }
    static void applyValueVectorEffect(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setVectorEffect(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialVerticalAlign(StyleResolver& styleResolver)
    {
        styleResolver.style()->setVerticalAlign(RenderStyle::initialVerticalAlign());
    }
    static void applyInheritVerticalAlign(StyleResolver& styleResolver)
    {
        styleResolver.style()->setVerticalAlign(styleResolver.parentStyle()->verticalAlign());
    }
    static void applyInitialVisibility(StyleResolver& styleResolver)
    {
        styleResolver.style()->setVisibility(RenderStyle::initialVisibility());
    }
    static void applyInheritVisibility(StyleResolver& styleResolver)
    {
        styleResolver.style()->setVisibility(styleResolver.parentStyle()->visibility());
    }
    static void applyValueVisibility(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setVisibility(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWhiteSpace(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWhiteSpace(RenderStyle::initialWhiteSpace());
    }
    static void applyInheritWhiteSpace(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWhiteSpace(styleResolver.parentStyle()->whiteSpace());
    }
    static void applyValueWhiteSpace(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setWhiteSpace(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWidows(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHasAutoWidows();
    }
    static void applyInheritWidows(StyleResolver& styleResolver)
    {
        if (styleResolver.parentStyle()->hasAutoWidows()) {
            styleResolver.style()->setHasAutoWidows();
            return;
        }
        styleResolver.style()->setWidows(styleResolver.parentStyle()->widows());
    }
    static void applyValueWidows(StyleResolver& styleResolver, CSSValue& value)
    {
        if (downcast<CSSPrimitiveValue>(value).getValueID() == CSSValueAuto) {
            styleResolver.style()->setHasAutoWidows();
            return;
        }
        styleResolver.style()->setWidows(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWidth(RenderStyle::initialSize());
    }
    static void applyInheritWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWidth(styleResolver.parentStyle()->width());
    }
    static void applyValueWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setWidth(StyleBuilderConverter::convertLengthSizing(styleResolver, value));
    }
    static void applyInitialWillChange(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWillChange(RenderStyle::initialWillChange());
    }
    static void applyInheritWillChange(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWillChange(styleResolver.parentStyle()->willChange());
    }
    static void applyInitialWordBreak(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWordBreak(RenderStyle::initialWordBreak());
    }
    static void applyInheritWordBreak(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWordBreak(styleResolver.parentStyle()->wordBreak());
    }
    static void applyValueWordBreak(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setWordBreak(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWordSpacing(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWordSpacing(RenderStyle::initialWordSpacing());
    }
    static void applyInheritWordSpacing(StyleResolver& styleResolver)
    {
        styleResolver.style()->setWordSpacing(styleResolver.parentStyle()->wordSpacing());
    }
    static void applyValueWordSpacing(StyleResolver& styleResolver, CSSValue& value)
    {
        auto convertedValue = StyleBuilderConverter::convertWordSpacing(styleResolver, value);
        if (convertedValue)
            styleResolver.style()->setWordSpacing(convertedValue.value());
    }
    static void applyInitialWordWrap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOverflowWrap(RenderStyle::initialOverflowWrap());
    }
    static void applyInheritWordWrap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOverflowWrap(styleResolver.parentStyle()->overflowWrap());
    }
    static void applyValueWordWrap(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setOverflowWrap(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWritingMode(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setWritingMode(SVGRenderStyle::initialWritingMode());
    }
    static void applyInheritWritingMode(StyleResolver& styleResolver)
    {
        styleResolver.style()->accessSVGStyle().setWritingMode(styleResolver.parentStyle()->svgStyle().writingMode());
    }
    static void applyValueWritingMode(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->accessSVGStyle().setWritingMode(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialX(StyleResolver& styleResolver)
    {
        styleResolver.style()->setX(RenderStyle::initialZeroLength());
    }
    static void applyInheritX(StyleResolver& styleResolver)
    {
        styleResolver.style()->setX(styleResolver.parentStyle()->x());
    }
    static void applyValueX(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setX(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialY(StyleResolver& styleResolver)
    {
        styleResolver.style()->setY(RenderStyle::initialZeroLength());
    }
    static void applyInheritY(StyleResolver& styleResolver)
    {
        styleResolver.style()->setY(styleResolver.parentStyle()->y());
    }
    static void applyValueY(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setY(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialZIndex(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHasAutoZIndex();
    }
    static void applyInheritZIndex(StyleResolver& styleResolver)
    {
        if (styleResolver.parentStyle()->hasAutoZIndex()) {
            styleResolver.style()->setHasAutoZIndex();
            return;
        }
        styleResolver.style()->setZIndex(styleResolver.parentStyle()->zIndex());
    }
    static void applyValueZIndex(StyleResolver& styleResolver, CSSValue& value)
    {
        if (downcast<CSSPrimitiveValue>(value).getValueID() == CSSValueAuto) {
            styleResolver.style()->setHasAutoZIndex();
            return;
        }
        styleResolver.style()->setZIndex(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialAlt(StyleResolver& styleResolver)
    {
        styleResolver.style()->setContentAltText(RenderStyle::initialContentAltText());
    }
    static void applyInheritAlt(StyleResolver& styleResolver)
    {
        styleResolver.style()->setContentAltText(styleResolver.parentStyle()->contentAltText());
    }
    static void applyInitialWebkitAppearance(StyleResolver& styleResolver)
    {
        styleResolver.style()->setAppearance(RenderStyle::initialAppearance());
    }
    static void applyInheritWebkitAppearance(StyleResolver& styleResolver)
    {
        styleResolver.style()->setAppearance(styleResolver.parentStyle()->appearance());
    }
    static void applyValueWebkitAppearance(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setAppearance(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitBackfaceVisibility(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBackfaceVisibility(RenderStyle::initialBackfaceVisibility());
    }
    static void applyInheritWebkitBackfaceVisibility(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBackfaceVisibility(styleResolver.parentStyle()->backfaceVisibility());
    }
    static void applyValueWebkitBackfaceVisibility(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBackfaceVisibility(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitBackgroundClip(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isClipSet() || layers.clip() == FillLayer::initialFillClip(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setClip(FillLayer::initialFillClip(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearClip();
    }
    static void applyInheritWebkitBackgroundClip(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isClipSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setClip(parent->clip());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearClip();
    }
    static void applyValueWebkitBackgroundClip(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillClip(CSSPropertyWebkitBackgroundClip, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillClip(CSSPropertyWebkitBackgroundClip, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearClip();
    }
    static void applyInitialWebkitBackgroundComposite(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isCompositeSet() || layers.composite() == FillLayer::initialFillComposite(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setComposite(FillLayer::initialFillComposite(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearComposite();
    }
    static void applyInheritWebkitBackgroundComposite(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isCompositeSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setComposite(parent->composite());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearComposite();
    }
    static void applyValueWebkitBackgroundComposite(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillComposite(CSSPropertyWebkitBackgroundComposite, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillComposite(CSSPropertyWebkitBackgroundComposite, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearComposite();
    }
    static void applyInitialWebkitBackgroundOrigin(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isOriginSet() || layers.origin() == FillLayer::initialFillOrigin(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setOrigin(FillLayer::initialFillOrigin(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearOrigin();
    }
    static void applyInheritWebkitBackgroundOrigin(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isOriginSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setOrigin(parent->origin());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearOrigin();
    }
    static void applyValueWebkitBackgroundOrigin(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillOrigin(CSSPropertyWebkitBackgroundOrigin, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillOrigin(CSSPropertyWebkitBackgroundOrigin, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearOrigin();
    }
    static void applyInitialWebkitBackgroundSize(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->backgroundLayers();
        if (!layers.next() && (!layers.isSizeSet() || layers.size() == FillLayer::initialFillSize(BackgroundFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        child->setSize(FillLayer::initialFillSize(BackgroundFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearSize();
    }
    static void applyInheritWebkitBackgroundSize(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->backgroundLayers() == *styleResolver.style()->backgroundLayers())
            return;

        auto* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->backgroundLayers(); parent && parent->isSizeSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                child = previousChild->next();
            }
            child->setSize(parent->size());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearSize();
    }
    static void applyValueWebkitBackgroundSize(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureBackgroundLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(BackgroundFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillSize(CSSPropertyWebkitBackgroundSize, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillSize(CSSPropertyWebkitBackgroundSize, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearSize();
    }
    static void applyInitialWebkitBorderFit(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderFit(RenderStyle::initialBorderFit());
    }
    static void applyInheritWebkitBorderFit(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderFit(styleResolver.parentStyle()->borderFit());
    }
    static void applyValueWebkitBorderFit(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderFit(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitBorderHorizontalSpacing(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHorizontalBorderSpacing(RenderStyle::initialHorizontalBorderSpacing());
    }
    static void applyInheritWebkitBorderHorizontalSpacing(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHorizontalBorderSpacing(styleResolver.parentStyle()->horizontalBorderSpacing());
    }
    static void applyValueWebkitBorderHorizontalSpacing(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setHorizontalBorderSpacing(StyleBuilderConverter::convertComputedLength<float>(styleResolver, value));
    }
    static void applyInitialWebkitBorderImage(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderImage(RenderStyle::initialNinePieceImage());
    }
    static void applyInheritWebkitBorderImage(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBorderImage(styleResolver.parentStyle()->borderImage());
    }
    static void applyValueWebkitBorderImage(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBorderImage(StyleBuilderConverter::convertBorderImage<CSSPropertyWebkitBorderImage>(styleResolver, value));
    }
    static void applyInitialWebkitBorderVerticalSpacing(StyleResolver& styleResolver)
    {
        styleResolver.style()->setVerticalBorderSpacing(RenderStyle::initialVerticalBorderSpacing());
    }
    static void applyInheritWebkitBorderVerticalSpacing(StyleResolver& styleResolver)
    {
        styleResolver.style()->setVerticalBorderSpacing(styleResolver.parentStyle()->verticalBorderSpacing());
    }
    static void applyValueWebkitBorderVerticalSpacing(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setVerticalBorderSpacing(StyleBuilderConverter::convertComputedLength<float>(styleResolver, value));
    }
    static void applyInitialWebkitBoxAlign(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxAlign(RenderStyle::initialBoxAlign());
    }
    static void applyInheritWebkitBoxAlign(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxAlign(styleResolver.parentStyle()->boxAlign());
    }
    static void applyValueWebkitBoxAlign(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBoxAlign(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitBoxDirection(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxDirection(RenderStyle::initialBoxDirection());
    }
    static void applyInheritWebkitBoxDirection(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxDirection(styleResolver.parentStyle()->boxDirection());
    }
    static void applyValueWebkitBoxDirection(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBoxDirection(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitBoxFlex(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxFlex(RenderStyle::initialBoxFlex());
    }
    static void applyInheritWebkitBoxFlex(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxFlex(styleResolver.parentStyle()->boxFlex());
    }
    static void applyValueWebkitBoxFlex(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBoxFlex(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitBoxFlexGroup(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxFlexGroup(RenderStyle::initialBoxFlexGroup());
    }
    static void applyInheritWebkitBoxFlexGroup(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxFlexGroup(styleResolver.parentStyle()->boxFlexGroup());
    }
    static void applyValueWebkitBoxFlexGroup(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBoxFlexGroup(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitBoxLines(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxLines(RenderStyle::initialBoxLines());
    }
    static void applyInheritWebkitBoxLines(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxLines(styleResolver.parentStyle()->boxLines());
    }
    static void applyValueWebkitBoxLines(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBoxLines(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitBoxOrdinalGroup(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxOrdinalGroup(RenderStyle::initialBoxOrdinalGroup());
    }
    static void applyInheritWebkitBoxOrdinalGroup(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxOrdinalGroup(styleResolver.parentStyle()->boxOrdinalGroup());
    }
    static void applyValueWebkitBoxOrdinalGroup(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBoxOrdinalGroup(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitBoxOrient(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxOrient(RenderStyle::initialBoxOrient());
    }
    static void applyInheritWebkitBoxOrient(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxOrient(styleResolver.parentStyle()->boxOrient());
    }
    static void applyValueWebkitBoxOrient(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBoxOrient(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitBoxPack(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxPack(RenderStyle::initialBoxPack());
    }
    static void applyInheritWebkitBoxPack(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxPack(styleResolver.parentStyle()->boxPack());
    }
    static void applyValueWebkitBoxPack(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBoxPack(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitBoxReflect(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxReflect(RenderStyle::initialBoxReflect());
    }
    static void applyInheritWebkitBoxReflect(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxReflect(styleResolver.parentStyle()->boxReflect());
    }
    static void applyValueWebkitBoxReflect(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBoxReflect(StyleBuilderConverter::convertReflection(styleResolver, value));
    }
    static void applyInitialWebkitColumnAxis(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnAxis(RenderStyle::initialColumnAxis());
    }
    static void applyInheritWebkitColumnAxis(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnAxis(styleResolver.parentStyle()->columnAxis());
    }
    static void applyValueWebkitColumnAxis(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setColumnAxis(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitColumnBreakAfter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakAfter(RenderStyle::initialBreakBetween());
    }
    static void applyInheritWebkitColumnBreakAfter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakAfter(styleResolver.parentStyle()->breakAfter());
    }
    static void applyValueWebkitColumnBreakAfter(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakAfter(StyleBuilderConverter::convertColumnBreakBetween(styleResolver, value));
    }
    static void applyInitialWebkitColumnBreakBefore(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakBefore(RenderStyle::initialBreakBetween());
    }
    static void applyInheritWebkitColumnBreakBefore(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakBefore(styleResolver.parentStyle()->breakBefore());
    }
    static void applyValueWebkitColumnBreakBefore(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakBefore(StyleBuilderConverter::convertColumnBreakBetween(styleResolver, value));
    }
    static void applyInitialWebkitColumnBreakInside(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakInside(RenderStyle::initialBreakInside());
    }
    static void applyInheritWebkitColumnBreakInside(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakInside(styleResolver.parentStyle()->breakInside());
    }
    static void applyValueWebkitColumnBreakInside(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakInside(StyleBuilderConverter::convertColumnBreakInside(styleResolver, value));
    }
    static void applyInitialColumnCount(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHasAutoColumnCount();
    }
    static void applyInheritColumnCount(StyleResolver& styleResolver)
    {
        if (styleResolver.parentStyle()->hasAutoColumnCount()) {
            styleResolver.style()->setHasAutoColumnCount();
            return;
        }
        styleResolver.style()->setColumnCount(styleResolver.parentStyle()->columnCount());
    }
    static void applyValueColumnCount(StyleResolver& styleResolver, CSSValue& value)
    {
        if (downcast<CSSPrimitiveValue>(value).getValueID() == CSSValueAuto) {
            styleResolver.style()->setHasAutoColumnCount();
            return;
        }
        styleResolver.style()->setColumnCount(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialColumnFill(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnFill(RenderStyle::initialColumnFill());
    }
    static void applyInheritColumnFill(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnFill(styleResolver.parentStyle()->columnFill());
    }
    static void applyValueColumnFill(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setColumnFill(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialColumnProgression(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnProgression(RenderStyle::initialColumnProgression());
    }
    static void applyInheritColumnProgression(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnProgression(styleResolver.parentStyle()->columnProgression());
    }
    static void applyValueColumnProgression(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setColumnProgression(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialColumnRuleColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setColumnRuleColor(RenderStyle::invalidColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkColumnRuleColor(RenderStyle::invalidColor());
    }
    static void applyInheritColumnRuleColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->columnRuleColor();
        if (!color.isValid())
            color = styleResolver.parentStyle()->color();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setColumnRuleColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkColumnRuleColor(color);
    }
    static void applyValueColumnRuleColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setColumnRuleColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkColumnRuleColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialColumnRuleStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnRuleStyle(RenderStyle::initialBorderStyle());
    }
    static void applyInheritColumnRuleStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnRuleStyle(styleResolver.parentStyle()->columnRuleStyle());
    }
    static void applyValueColumnRuleStyle(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setColumnRuleStyle(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialColumnRuleWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnRuleWidth(RenderStyle::initialColumnRuleWidth());
    }
    static void applyInheritColumnRuleWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnRuleWidth(styleResolver.parentStyle()->columnRuleWidth());
    }
    static void applyValueColumnRuleWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setColumnRuleWidth(StyleBuilderConverter::convertLineWidth<unsigned short>(styleResolver, value));
    }
    static void applyInitialColumnSpan(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnSpan(RenderStyle::initialColumnSpan());
    }
    static void applyInheritColumnSpan(StyleResolver& styleResolver)
    {
        styleResolver.style()->setColumnSpan(styleResolver.parentStyle()->columnSpan());
    }
    static void applyValueColumnSpan(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setColumnSpan(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialColumnWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHasAutoColumnWidth();
    }
    static void applyInheritColumnWidth(StyleResolver& styleResolver)
    {
        if (styleResolver.parentStyle()->hasAutoColumnWidth()) {
            styleResolver.style()->setHasAutoColumnWidth();
            return;
        }
        styleResolver.style()->setColumnWidth(styleResolver.parentStyle()->columnWidth());
    }
    static void applyValueColumnWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        if (downcast<CSSPrimitiveValue>(value).getValueID() == CSSValueAuto) {
            styleResolver.style()->setHasAutoColumnWidth();
            return;
        }
        styleResolver.style()->setColumnWidth(StyleBuilderConverter::convertComputedLength<float>(styleResolver, value));
    }
    static void applyInitialWebkitBoxDecorationBreak(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxDecorationBreak(RenderStyle::initialBoxDecorationBreak());
    }
    static void applyInheritWebkitBoxDecorationBreak(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBoxDecorationBreak(styleResolver.parentStyle()->boxDecorationBreak());
    }
    static void applyValueWebkitBoxDecorationBreak(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBoxDecorationBreak(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialFilter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFilter(RenderStyle::initialFilter());
    }
    static void applyInheritFilter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFilter(styleResolver.parentStyle()->filter());
    }
    static void applyValueFilter(StyleResolver& styleResolver, CSSValue& value)
    {
        auto convertedValue = StyleBuilderConverter::convertFilterOperations(styleResolver, value);
        if (convertedValue)
            styleResolver.style()->setFilter(convertedValue.value());
    }
    static void applyInitialAlignContent(StyleResolver& styleResolver)
    {
        styleResolver.style()->setAlignContent(RenderStyle::initialContentAlignment());
    }
    static void applyInheritAlignContent(StyleResolver& styleResolver)
    {
        styleResolver.style()->setAlignContent(styleResolver.parentStyle()->alignContent());
    }
    static void applyValueAlignContent(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setAlignContent(StyleBuilderConverter::convertContentAlignmentData(styleResolver, value));
    }
    static void applyInitialAlignItems(StyleResolver& styleResolver)
    {
        styleResolver.style()->setAlignItems(RenderStyle::initialDefaultAlignment());
    }
    static void applyInheritAlignItems(StyleResolver& styleResolver)
    {
        styleResolver.style()->setAlignItems(styleResolver.parentStyle()->alignItems());
    }
    static void applyValueAlignItems(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setAlignItems(StyleBuilderConverter::convertSelfOrDefaultAlignmentData(styleResolver, value));
    }
    static void applyInitialAlignSelf(StyleResolver& styleResolver)
    {
        styleResolver.style()->setAlignSelf(RenderStyle::initialSelfAlignment());
    }
    static void applyInheritAlignSelf(StyleResolver& styleResolver)
    {
        styleResolver.style()->setAlignSelf(styleResolver.parentStyle()->alignSelf());
    }
    static void applyValueAlignSelf(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setAlignSelf(StyleBuilderConverter::convertSelfOrDefaultAlignmentData(styleResolver, value));
    }
    static void applyInitialFlexBasis(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlexBasis(RenderStyle::initialFlexBasis());
    }
    static void applyInheritFlexBasis(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlexBasis(styleResolver.parentStyle()->flexBasis());
    }
    static void applyValueFlexBasis(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setFlexBasis(StyleBuilderConverter::convertLengthOrAuto(styleResolver, value));
    }
    static void applyInitialFlexDirection(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlexDirection(RenderStyle::initialFlexDirection());
    }
    static void applyInheritFlexDirection(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlexDirection(styleResolver.parentStyle()->flexDirection());
    }
    static void applyValueFlexDirection(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setFlexDirection(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialFlexGrow(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlexGrow(RenderStyle::initialFlexGrow());
    }
    static void applyInheritFlexGrow(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlexGrow(styleResolver.parentStyle()->flexGrow());
    }
    static void applyValueFlexGrow(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setFlexGrow(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialFlexShrink(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlexShrink(RenderStyle::initialFlexShrink());
    }
    static void applyInheritFlexShrink(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlexShrink(styleResolver.parentStyle()->flexShrink());
    }
    static void applyValueFlexShrink(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setFlexShrink(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialFlexWrap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlexWrap(RenderStyle::initialFlexWrap());
    }
    static void applyInheritFlexWrap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlexWrap(styleResolver.parentStyle()->flexWrap());
    }
    static void applyValueFlexWrap(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setFlexWrap(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialJustifyContent(StyleResolver& styleResolver)
    {
        styleResolver.style()->setJustifyContent(RenderStyle::initialContentAlignment());
    }
    static void applyInheritJustifyContent(StyleResolver& styleResolver)
    {
        styleResolver.style()->setJustifyContent(styleResolver.parentStyle()->justifyContent());
    }
    static void applyValueJustifyContent(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setJustifyContent(StyleBuilderConverter::convertContentAlignmentData(styleResolver, value));
    }
    static void applyInitialWebkitBackdropFilter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBackdropFilter(RenderStyle::initialBackdropFilter());
    }
    static void applyInheritWebkitBackdropFilter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBackdropFilter(styleResolver.parentStyle()->backdropFilter());
    }
    static void applyValueWebkitBackdropFilter(StyleResolver& styleResolver, CSSValue& value)
    {
        auto convertedValue = StyleBuilderConverter::convertFilterOperations(styleResolver, value);
        if (convertedValue)
            styleResolver.style()->setBackdropFilter(convertedValue.value());
    }
    static void applyInitialJustifySelf(StyleResolver& styleResolver)
    {
        styleResolver.style()->setJustifySelf(RenderStyle::initialSelfAlignment());
    }
    static void applyInheritJustifySelf(StyleResolver& styleResolver)
    {
        styleResolver.style()->setJustifySelf(styleResolver.parentStyle()->justifySelf());
    }
    static void applyValueJustifySelf(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setJustifySelf(StyleBuilderConverter::convertSelfOrDefaultAlignmentData(styleResolver, value));
    }
    static void applyInitialJustifyItems(StyleResolver& styleResolver)
    {
        styleResolver.style()->setJustifyItems(RenderStyle::initialSelfAlignment());
    }
    static void applyInheritJustifyItems(StyleResolver& styleResolver)
    {
        styleResolver.style()->setJustifyItems(styleResolver.parentStyle()->justifyItems());
    }
    static void applyValueJustifyItems(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setJustifyItems(StyleBuilderConverter::convertSelfOrDefaultAlignmentData(styleResolver, value));
    }
    static void applyInitialGridAutoColumns(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridAutoColumns(RenderStyle::initialGridAutoColumns());
    }
    static void applyInheritGridAutoColumns(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridAutoColumns(styleResolver.parentStyle()->gridAutoColumns());
    }
    static void applyValueGridAutoColumns(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setGridAutoColumns(StyleBuilderConverter::convertGridTrackSizeList(styleResolver, value));
    }
    static void applyInitialGridAutoRows(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridAutoRows(RenderStyle::initialGridAutoRows());
    }
    static void applyInheritGridAutoRows(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridAutoRows(styleResolver.parentStyle()->gridAutoRows());
    }
    static void applyValueGridAutoRows(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setGridAutoRows(StyleBuilderConverter::convertGridTrackSizeList(styleResolver, value));
    }
    static void applyInitialGridColumnEnd(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridItemColumnEnd(RenderStyle::initialGridItemColumnEnd());
    }
    static void applyInheritGridColumnEnd(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridItemColumnEnd(styleResolver.parentStyle()->gridItemColumnEnd());
    }
    static void applyValueGridColumnEnd(StyleResolver& styleResolver, CSSValue& value)
    {
        auto convertedValue = StyleBuilderConverter::convertGridPosition(styleResolver, value);
        if (convertedValue)
            styleResolver.style()->setGridItemColumnEnd(convertedValue.value());
    }
    static void applyInitialGridColumnGap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridColumnGap(RenderStyle::initialZeroLength());
    }
    static void applyInheritGridColumnGap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridColumnGap(styleResolver.parentStyle()->gridColumnGap());
    }
    static void applyValueGridColumnGap(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setGridColumnGap(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialGridColumnStart(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridItemColumnStart(RenderStyle::initialGridItemColumnStart());
    }
    static void applyInheritGridColumnStart(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridItemColumnStart(styleResolver.parentStyle()->gridItemColumnStart());
    }
    static void applyValueGridColumnStart(StyleResolver& styleResolver, CSSValue& value)
    {
        auto convertedValue = StyleBuilderConverter::convertGridPosition(styleResolver, value);
        if (convertedValue)
            styleResolver.style()->setGridItemColumnStart(convertedValue.value());
    }
    static void applyInitialGridRowEnd(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridItemRowEnd(RenderStyle::initialGridItemRowEnd());
    }
    static void applyInheritGridRowEnd(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridItemRowEnd(styleResolver.parentStyle()->gridItemRowEnd());
    }
    static void applyValueGridRowEnd(StyleResolver& styleResolver, CSSValue& value)
    {
        auto convertedValue = StyleBuilderConverter::convertGridPosition(styleResolver, value);
        if (convertedValue)
            styleResolver.style()->setGridItemRowEnd(convertedValue.value());
    }
    static void applyInitialGridRowGap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridRowGap(RenderStyle::initialZeroLength());
    }
    static void applyInheritGridRowGap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridRowGap(styleResolver.parentStyle()->gridRowGap());
    }
    static void applyValueGridRowGap(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setGridRowGap(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialGridRowStart(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridItemRowStart(RenderStyle::initialGridItemRowStart());
    }
    static void applyInheritGridRowStart(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridItemRowStart(styleResolver.parentStyle()->gridItemRowStart());
    }
    static void applyValueGridRowStart(StyleResolver& styleResolver, CSSValue& value)
    {
        auto convertedValue = StyleBuilderConverter::convertGridPosition(styleResolver, value);
        if (convertedValue)
            styleResolver.style()->setGridItemRowStart(convertedValue.value());
    }
    static void applyInitialGridAutoFlow(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridAutoFlow(RenderStyle::initialGridAutoFlow());
    }
    static void applyInheritGridAutoFlow(StyleResolver& styleResolver)
    {
        styleResolver.style()->setGridAutoFlow(styleResolver.parentStyle()->gridAutoFlow());
    }
    static void applyValueGridAutoFlow(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setGridAutoFlow(StyleBuilderConverter::convertGridAutoFlow(styleResolver, value));
    }
    static void applyInitialWebkitHyphenateCharacter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHyphenationString(RenderStyle::initialHyphenationString());
    }
    static void applyInheritWebkitHyphenateCharacter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHyphenationString(styleResolver.parentStyle()->hyphenationString());
    }
    static void applyValueWebkitHyphenateCharacter(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setHyphenationString(StyleBuilderConverter::convertStringOrAuto(styleResolver, value));
    }
    static void applyInitialWebkitHyphenateLimitAfter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHyphenationLimitAfter(RenderStyle::initialHyphenationLimitAfter());
    }
    static void applyInheritWebkitHyphenateLimitAfter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHyphenationLimitAfter(styleResolver.parentStyle()->hyphenationLimitAfter());
    }
    static void applyValueWebkitHyphenateLimitAfter(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setHyphenationLimitAfter(StyleBuilderConverter::convertNumberOrAuto<short>(styleResolver, value));
    }
    static void applyInitialWebkitHyphenateLimitBefore(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHyphenationLimitBefore(RenderStyle::initialHyphenationLimitBefore());
    }
    static void applyInheritWebkitHyphenateLimitBefore(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHyphenationLimitBefore(styleResolver.parentStyle()->hyphenationLimitBefore());
    }
    static void applyValueWebkitHyphenateLimitBefore(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setHyphenationLimitBefore(StyleBuilderConverter::convertNumberOrAuto<short>(styleResolver, value));
    }
    static void applyInitialWebkitHyphenateLimitLines(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHyphenationLimitLines(RenderStyle::initialHyphenationLimitLines());
    }
    static void applyInheritWebkitHyphenateLimitLines(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHyphenationLimitLines(styleResolver.parentStyle()->hyphenationLimitLines());
    }
    static void applyValueWebkitHyphenateLimitLines(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setHyphenationLimitLines(StyleBuilderConverter::convertWebkitHyphenateLimitLines(styleResolver, value));
    }
    static void applyInitialWebkitHyphens(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHyphens(RenderStyle::initialHyphens());
    }
    static void applyInheritWebkitHyphens(StyleResolver& styleResolver)
    {
        styleResolver.style()->setHyphens(styleResolver.parentStyle()->hyphens());
    }
    static void applyValueWebkitHyphens(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setHyphens(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitInitialLetter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setInitialLetter(RenderStyle::initialInitialLetter());
    }
    static void applyInheritWebkitInitialLetter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setInitialLetter(styleResolver.parentStyle()->initialLetter());
    }
    static void applyValueWebkitInitialLetter(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setInitialLetter(StyleBuilderConverter::convertInitialLetter(styleResolver, value));
    }
    static void applyInitialWebkitLineBoxContain(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineBoxContain(RenderStyle::initialLineBoxContain());
    }
    static void applyInheritWebkitLineBoxContain(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineBoxContain(styleResolver.parentStyle()->lineBoxContain());
    }
    static void applyValueWebkitLineBoxContain(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setLineBoxContain(StyleBuilderConverter::convertLineBoxContain(styleResolver, value));
    }
    static void applyInitialWebkitLineAlign(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineAlign(RenderStyle::initialLineAlign());
    }
    static void applyInheritWebkitLineAlign(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineAlign(styleResolver.parentStyle()->lineAlign());
    }
    static void applyValueWebkitLineAlign(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setLineAlign(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitLineBreak(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineBreak(RenderStyle::initialLineBreak());
    }
    static void applyInheritWebkitLineBreak(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineBreak(styleResolver.parentStyle()->lineBreak());
    }
    static void applyValueWebkitLineBreak(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setLineBreak(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitLineClamp(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineClamp(RenderStyle::initialLineClamp());
    }
    static void applyInheritWebkitLineClamp(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineClamp(styleResolver.parentStyle()->lineClamp());
    }
    static void applyValueWebkitLineClamp(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setLineClamp(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitLineGrid(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineGrid(RenderStyle::initialLineGrid());
    }
    static void applyInheritWebkitLineGrid(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineGrid(styleResolver.parentStyle()->lineGrid());
    }
    static void applyValueWebkitLineGrid(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setLineGrid(StyleBuilderConverter::convertStringOrNone(styleResolver, value));
    }
    static void applyInitialWebkitLineSnap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineSnap(RenderStyle::initialLineSnap());
    }
    static void applyInheritWebkitLineSnap(StyleResolver& styleResolver)
    {
        styleResolver.style()->setLineSnap(styleResolver.parentStyle()->lineSnap());
    }
    static void applyValueWebkitLineSnap(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setLineSnap(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitMarginAfterCollapse(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginAfterCollapse(RenderStyle::initialMarginAfterCollapse());
    }
    static void applyInheritWebkitMarginAfterCollapse(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginAfterCollapse(styleResolver.parentStyle()->marginAfterCollapse());
    }
    static void applyValueWebkitMarginAfterCollapse(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarginAfterCollapse(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitMarginBeforeCollapse(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginBeforeCollapse(RenderStyle::initialMarginBeforeCollapse());
    }
    static void applyInheritWebkitMarginBeforeCollapse(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginBeforeCollapse(styleResolver.parentStyle()->marginBeforeCollapse());
    }
    static void applyValueWebkitMarginBeforeCollapse(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarginBeforeCollapse(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitMarginBottomCollapse(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginAfterCollapse(RenderStyle::initialMarginAfterCollapse());
    }
    static void applyInheritWebkitMarginBottomCollapse(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginAfterCollapse(styleResolver.parentStyle()->marginAfterCollapse());
    }
    static void applyValueWebkitMarginBottomCollapse(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarginAfterCollapse(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitMarginTopCollapse(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginBeforeCollapse(RenderStyle::initialMarginBeforeCollapse());
    }
    static void applyInheritWebkitMarginTopCollapse(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarginBeforeCollapse(styleResolver.parentStyle()->marginBeforeCollapse());
    }
    static void applyValueWebkitMarginTopCollapse(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarginBeforeCollapse(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitMarqueeDirection(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarqueeDirection(RenderStyle::initialMarqueeDirection());
    }
    static void applyInheritWebkitMarqueeDirection(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarqueeDirection(styleResolver.parentStyle()->marqueeDirection());
    }
    static void applyValueWebkitMarqueeDirection(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarqueeDirection(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitMarqueeIncrement(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarqueeIncrement(RenderStyle::initialMarqueeIncrement());
    }
    static void applyInheritWebkitMarqueeIncrement(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarqueeIncrement(styleResolver.parentStyle()->marqueeIncrement());
    }
    static void applyValueWebkitMarqueeIncrement(StyleResolver& styleResolver, CSSValue& value)
    {
        auto convertedValue = StyleBuilderConverter::convertMarqueeIncrement(styleResolver, value);
        if (convertedValue)
            styleResolver.style()->setMarqueeIncrement(convertedValue.value());
    }
    static void applyInitialWebkitMarqueeRepetition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarqueeLoopCount(RenderStyle::initialMarqueeLoopCount());
    }
    static void applyInheritWebkitMarqueeRepetition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarqueeLoopCount(styleResolver.parentStyle()->marqueeLoopCount());
    }
    static void applyValueWebkitMarqueeRepetition(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarqueeLoopCount(StyleBuilderConverter::convertMarqueeRepetition(styleResolver, value));
    }
    static void applyInitialWebkitMarqueeSpeed(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarqueeSpeed(RenderStyle::initialMarqueeSpeed());
    }
    static void applyInheritWebkitMarqueeSpeed(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarqueeSpeed(styleResolver.parentStyle()->marqueeSpeed());
    }
    static void applyValueWebkitMarqueeSpeed(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarqueeSpeed(StyleBuilderConverter::convertMarqueeSpeed(styleResolver, value));
    }
    static void applyInitialWebkitMarqueeStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarqueeBehavior(RenderStyle::initialMarqueeBehavior());
    }
    static void applyInheritWebkitMarqueeStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMarqueeBehavior(styleResolver.parentStyle()->marqueeBehavior());
    }
    static void applyValueWebkitMarqueeStyle(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMarqueeBehavior(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitMaskBoxImage(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMaskBoxImage(RenderStyle::initialNinePieceImage());
    }
    static void applyInheritWebkitMaskBoxImage(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMaskBoxImage(styleResolver.parentStyle()->maskBoxImage());
    }
    static void applyValueWebkitMaskBoxImage(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMaskBoxImage(StyleBuilderConverter::convertBorderMask<CSSPropertyWebkitMaskBoxImage>(styleResolver, value));
    }
    static void applyInitialWebkitMaskBoxImageSource(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMaskBoxImageSource(RenderStyle::initialMaskBoxImageSource());
    }
    static void applyInheritWebkitMaskBoxImageSource(StyleResolver& styleResolver)
    {
        styleResolver.style()->setMaskBoxImageSource(styleResolver.parentStyle()->maskBoxImageSource());
    }
    static void applyValueWebkitMaskBoxImageSource(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setMaskBoxImageSource(StyleBuilderConverter::convertStyleImage<CSSPropertyWebkitMaskBoxImageSource>(styleResolver, value));
    }
    static void applyInitialWebkitMaskClip(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->maskLayers();
        if (!layers.next() && (!layers.isClipSet() || layers.clip() == FillLayer::initialFillClip(MaskFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        child->setClip(FillLayer::initialFillClip(MaskFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearClip();
    }
    static void applyInheritWebkitMaskClip(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->maskLayers() == *styleResolver.style()->maskLayers())
            return;

        auto* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->maskLayers(); parent && parent->isClipSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                child = previousChild->next();
            }
            child->setClip(parent->clip());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearClip();
    }
    static void applyValueWebkitMaskClip(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillClip(CSSPropertyWebkitMaskClip, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillClip(CSSPropertyWebkitMaskClip, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearClip();
    }
    static void applyInitialWebkitMaskComposite(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->maskLayers();
        if (!layers.next() && (!layers.isCompositeSet() || layers.composite() == FillLayer::initialFillComposite(MaskFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        child->setComposite(FillLayer::initialFillComposite(MaskFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearComposite();
    }
    static void applyInheritWebkitMaskComposite(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->maskLayers() == *styleResolver.style()->maskLayers())
            return;

        auto* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->maskLayers(); parent && parent->isCompositeSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                child = previousChild->next();
            }
            child->setComposite(parent->composite());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearComposite();
    }
    static void applyValueWebkitMaskComposite(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillComposite(CSSPropertyWebkitMaskComposite, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillComposite(CSSPropertyWebkitMaskComposite, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearComposite();
    }
    static void applyInitialWebkitMaskImage(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->maskLayers();
        if (!layers.next() && (!layers.isImageSet() || layers.image() == FillLayer::initialFillImage(MaskFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        child->setImage(FillLayer::initialFillImage(MaskFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearImage();
    }
    static void applyInheritWebkitMaskImage(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->maskLayers() == *styleResolver.style()->maskLayers())
            return;

        auto* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->maskLayers(); parent && parent->isImageSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                child = previousChild->next();
            }
            child->setImage(parent->image());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearImage();
    }
    static void applyValueWebkitMaskImage(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillImage(CSSPropertyWebkitMaskImage, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillImage(CSSPropertyWebkitMaskImage, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearImage();
    }
    static void applyInitialWebkitMaskOrigin(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->maskLayers();
        if (!layers.next() && (!layers.isOriginSet() || layers.origin() == FillLayer::initialFillOrigin(MaskFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        child->setOrigin(FillLayer::initialFillOrigin(MaskFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearOrigin();
    }
    static void applyInheritWebkitMaskOrigin(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->maskLayers() == *styleResolver.style()->maskLayers())
            return;

        auto* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->maskLayers(); parent && parent->isOriginSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                child = previousChild->next();
            }
            child->setOrigin(parent->origin());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearOrigin();
    }
    static void applyValueWebkitMaskOrigin(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillOrigin(CSSPropertyWebkitMaskOrigin, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillOrigin(CSSPropertyWebkitMaskOrigin, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearOrigin();
    }
    static void applyInitialWebkitMaskPositionX(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->maskLayers();
        if (!layers.next() && (!layers.isXPositionSet() || layers.xPosition() == FillLayer::initialFillXPosition(MaskFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        child->setXPosition(FillLayer::initialFillXPosition(MaskFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearXPosition();
    }
    static void applyInheritWebkitMaskPositionX(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->maskLayers() == *styleResolver.style()->maskLayers())
            return;

        auto* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->maskLayers(); parent && parent->isXPositionSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                child = previousChild->next();
            }
            child->setXPosition(parent->xPosition());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearXPosition();
    }
    static void applyValueWebkitMaskPositionX(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillXPosition(CSSPropertyWebkitMaskPositionX, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillXPosition(CSSPropertyWebkitMaskPositionX, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearXPosition();
    }
    static void applyInitialWebkitMaskPositionY(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->maskLayers();
        if (!layers.next() && (!layers.isYPositionSet() || layers.yPosition() == FillLayer::initialFillYPosition(MaskFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        child->setYPosition(FillLayer::initialFillYPosition(MaskFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearYPosition();
    }
    static void applyInheritWebkitMaskPositionY(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->maskLayers() == *styleResolver.style()->maskLayers())
            return;

        auto* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->maskLayers(); parent && parent->isYPositionSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                child = previousChild->next();
            }
            child->setYPosition(parent->yPosition());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearYPosition();
    }
    static void applyValueWebkitMaskPositionY(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillYPosition(CSSPropertyWebkitMaskPositionY, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillYPosition(CSSPropertyWebkitMaskPositionY, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearYPosition();
    }
    static void applyInitialWebkitMaskRepeatX(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->maskLayers();
        if (!layers.next() && (!layers.isRepeatXSet() || layers.repeatX() == FillLayer::initialFillRepeatX(MaskFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        child->setRepeatX(FillLayer::initialFillRepeatX(MaskFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearRepeatX();
    }
    static void applyInheritWebkitMaskRepeatX(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->maskLayers() == *styleResolver.style()->maskLayers())
            return;

        auto* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->maskLayers(); parent && parent->isRepeatXSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                child = previousChild->next();
            }
            child->setRepeatX(parent->repeatX());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearRepeatX();
    }
    static void applyValueWebkitMaskRepeatX(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillRepeatX(CSSPropertyWebkitMaskRepeatX, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillRepeatX(CSSPropertyWebkitMaskRepeatX, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearRepeatX();
    }
    static void applyInitialWebkitMaskRepeatY(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->maskLayers();
        if (!layers.next() && (!layers.isRepeatYSet() || layers.repeatY() == FillLayer::initialFillRepeatY(MaskFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        child->setRepeatY(FillLayer::initialFillRepeatY(MaskFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearRepeatY();
    }
    static void applyInheritWebkitMaskRepeatY(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->maskLayers() == *styleResolver.style()->maskLayers())
            return;

        auto* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->maskLayers(); parent && parent->isRepeatYSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                child = previousChild->next();
            }
            child->setRepeatY(parent->repeatY());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearRepeatY();
    }
    static void applyValueWebkitMaskRepeatY(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillRepeatY(CSSPropertyWebkitMaskRepeatY, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillRepeatY(CSSPropertyWebkitMaskRepeatY, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearRepeatY();
    }
    static void applyInitialWebkitMaskSize(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->maskLayers();
        if (!layers.next() && (!layers.isSizeSet() || layers.size() == FillLayer::initialFillSize(MaskFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        child->setSize(FillLayer::initialFillSize(MaskFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearSize();
    }
    static void applyInheritWebkitMaskSize(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->maskLayers() == *styleResolver.style()->maskLayers())
            return;

        auto* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->maskLayers(); parent && parent->isSizeSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                child = previousChild->next();
            }
            child->setSize(parent->size());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearSize();
    }
    static void applyValueWebkitMaskSize(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillSize(CSSPropertyWebkitMaskSize, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillSize(CSSPropertyWebkitMaskSize, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearSize();
    }
    static void applyInitialWebkitMaskSourceType(StyleResolver& styleResolver)
    {
        // Check for (single-layer) no-op before clearing anything.
        const FillLayer& layers = *styleResolver.style()->maskLayers();
        if (!layers.next() && (!layers.isMaskSourceTypeSet() || layers.maskSourceType() == FillLayer::initialFillMaskSourceType(MaskFillLayer)))
            return;

        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        child->setMaskSourceType(FillLayer::initialFillMaskSourceType(MaskFillLayer));
        for (child = child->next(); child; child = child->next())
            child->clearMaskSourceType();
    }
    static void applyInheritWebkitMaskSourceType(StyleResolver& styleResolver)
    {
        // Check for no-op before copying anything.
        if (*styleResolver.parentStyle()->maskLayers() == *styleResolver.style()->maskLayers())
            return;

        auto* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        for (auto* parent = styleResolver.parentStyle()->maskLayers(); parent && parent->isMaskSourceTypeSet(); parent = parent->next()) {
            if (!child) {
                previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                child = previousChild->next();
            }
            child->setMaskSourceType(parent->maskSourceType());
            previousChild = child;
            child = previousChild->next();
        }
        for (; child; child = child->next())
            child->clearMaskSourceType();
    }
    static void applyValueWebkitMaskSourceType(StyleResolver& styleResolver, CSSValue& value)
    {
        FillLayer* child = &styleResolver.style()->ensureMaskLayers();
        FillLayer* previousChild = nullptr;
        if (is<CSSValueList>(value) && !is<CSSImageSetValue>(value)) {
            // Walk each value and put it into a layer, creating new layers as needed.
            for (auto& item : downcast<CSSValueList>(value)) {
                if (!child) {
                    previousChild->setNext(std::make_unique<FillLayer>(MaskFillLayer));
                    child = previousChild->next();
                }
                styleResolver.styleMap()->mapFillMaskSourceType(CSSPropertyWebkitMaskSourceType, *child, item);
                previousChild = child;
                child = child->next();
            }
        } else {
            styleResolver.styleMap()->mapFillMaskSourceType(CSSPropertyWebkitMaskSourceType, *child, value);
            child = child->next();
        }
        for (; child; child = child->next())
            child->clearMaskSourceType();
    }
    static void applyInitialWebkitNbspMode(StyleResolver& styleResolver)
    {
        styleResolver.style()->setNBSPMode(RenderStyle::initialNBSPMode());
    }
    static void applyInheritWebkitNbspMode(StyleResolver& styleResolver)
    {
        styleResolver.style()->setNBSPMode(styleResolver.parentStyle()->nbspMode());
    }
    static void applyValueWebkitNbspMode(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setNBSPMode(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialOrder(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOrder(RenderStyle::initialOrder());
    }
    static void applyInheritOrder(StyleResolver& styleResolver)
    {
        styleResolver.style()->setOrder(styleResolver.parentStyle()->order());
    }
    static void applyValueOrder(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setOrder(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialPerspective(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPerspective(RenderStyle::initialPerspective());
    }
    static void applyInheritPerspective(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPerspective(styleResolver.parentStyle()->perspective());
    }
    static void applyValuePerspective(StyleResolver& styleResolver, CSSValue& value)
    {
        auto convertedValue = StyleBuilderConverter::convertPerspective(styleResolver, value);
        if (convertedValue)
            styleResolver.style()->setPerspective(convertedValue.value());
    }
    static void applyInitialPerspectiveOriginX(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPerspectiveOriginX(RenderStyle::initialPerspectiveOriginX());
    }
    static void applyInheritPerspectiveOriginX(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPerspectiveOriginX(styleResolver.parentStyle()->perspectiveOriginX());
    }
    static void applyValuePerspectiveOriginX(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setPerspectiveOriginX(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialPerspectiveOriginY(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPerspectiveOriginY(RenderStyle::initialPerspectiveOriginY());
    }
    static void applyInheritPerspectiveOriginY(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPerspectiveOriginY(styleResolver.parentStyle()->perspectiveOriginY());
    }
    static void applyValuePerspectiveOriginY(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setPerspectiveOriginY(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialWebkitPrintColorAdjust(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPrintColorAdjust(RenderStyle::initialPrintColorAdjust());
    }
    static void applyInheritWebkitPrintColorAdjust(StyleResolver& styleResolver)
    {
        styleResolver.style()->setPrintColorAdjust(styleResolver.parentStyle()->printColorAdjust());
    }
    static void applyValueWebkitPrintColorAdjust(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setPrintColorAdjust(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitRtlOrdering(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRTLOrdering(RenderStyle::initialRTLOrdering());
    }
    static void applyInheritWebkitRtlOrdering(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRTLOrdering(styleResolver.parentStyle()->rtlOrdering());
    }
    static void applyValueWebkitRtlOrdering(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setRTLOrdering(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitTextCombine(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextCombine(RenderStyle::initialTextCombine());
    }
    static void applyInheritWebkitTextCombine(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextCombine(styleResolver.parentStyle()->textCombine());
    }
    static void applyValueWebkitTextCombine(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextCombine(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitTextDecorationLine(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextDecoration(RenderStyle::initialTextDecoration());
    }
    static void applyInheritWebkitTextDecorationLine(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextDecoration(styleResolver.parentStyle()->textDecoration());
    }
    static void applyValueWebkitTextDecorationLine(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextDecoration(StyleBuilderConverter::convertTextDecoration(styleResolver, value));
    }
    static void applyInitialWebkitTextDecorationStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextDecorationStyle(RenderStyle::initialTextDecorationStyle());
    }
    static void applyInheritWebkitTextDecorationStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextDecorationStyle(styleResolver.parentStyle()->textDecorationStyle());
    }
    static void applyValueWebkitTextDecorationStyle(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextDecorationStyle(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitTextDecorationColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextDecorationColor(RenderStyle::invalidColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextDecorationColor(RenderStyle::invalidColor());
    }
    static void applyInheritWebkitTextDecorationColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->textDecorationColor();
        if (!color.isValid())
            color = styleResolver.parentStyle()->color();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextDecorationColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextDecorationColor(color);
    }
    static void applyValueWebkitTextDecorationColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextDecorationColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextDecorationColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialWebkitTextDecorationSkip(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextDecorationSkip(RenderStyle::initialTextDecorationSkip());
    }
    static void applyInheritWebkitTextDecorationSkip(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextDecorationSkip(styleResolver.parentStyle()->textDecorationSkip());
    }
    static void applyValueWebkitTextDecorationSkip(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextDecorationSkip(StyleBuilderConverter::convertTextDecorationSkip(styleResolver, value));
    }
    static void applyInitialWebkitTextUnderlinePosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextUnderlinePosition(RenderStyle::initialTextUnderlinePosition());
    }
    static void applyInheritWebkitTextUnderlinePosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextUnderlinePosition(styleResolver.parentStyle()->textUnderlinePosition());
    }
    static void applyValueWebkitTextUnderlinePosition(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextUnderlinePosition(StyleBuilderConverter::convertTextUnderlinePosition(styleResolver, value));
    }
    static void applyInitialWebkitTextEmphasisColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextEmphasisColor(RenderStyle::invalidColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextEmphasisColor(RenderStyle::invalidColor());
    }
    static void applyInheritWebkitTextEmphasisColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->textEmphasisColor();
        if (!color.isValid())
            color = styleResolver.parentStyle()->color();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextEmphasisColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextEmphasisColor(color);
    }
    static void applyValueWebkitTextEmphasisColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextEmphasisColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextEmphasisColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialWebkitTextEmphasisPosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextEmphasisPosition(RenderStyle::initialTextEmphasisPosition());
    }
    static void applyInheritWebkitTextEmphasisPosition(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextEmphasisPosition(styleResolver.parentStyle()->textEmphasisPosition());
    }
    static void applyValueWebkitTextEmphasisPosition(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextEmphasisPosition(StyleBuilderConverter::convertTextEmphasisPosition(styleResolver, value));
    }
    static void applyInitialWebkitTextFillColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextFillColor(RenderStyle::invalidColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextFillColor(RenderStyle::invalidColor());
    }
    static void applyInheritWebkitTextFillColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->textFillColor();
        if (!color.isValid())
            color = styleResolver.parentStyle()->color();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextFillColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextFillColor(color);
    }
    static void applyValueWebkitTextFillColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextFillColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextFillColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialWebkitTextSecurity(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextSecurity(RenderStyle::initialTextSecurity());
    }
    static void applyInheritWebkitTextSecurity(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextSecurity(styleResolver.parentStyle()->textSecurity());
    }
    static void applyValueWebkitTextSecurity(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextSecurity(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitTextStrokeColor(StyleResolver& styleResolver)
    {
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextStrokeColor(RenderStyle::invalidColor());
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextStrokeColor(RenderStyle::invalidColor());
    }
    static void applyInheritWebkitTextStrokeColor(StyleResolver& styleResolver)
    {
        Color color = styleResolver.parentStyle()->textStrokeColor();
        if (!color.isValid())
            color = styleResolver.parentStyle()->color();
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextStrokeColor(color);
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextStrokeColor(color);
    }
    static void applyValueWebkitTextStrokeColor(StyleResolver& styleResolver, CSSValue& value)
    {
        auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
        if (styleResolver.applyPropertyToRegularStyle())
            styleResolver.style()->setTextStrokeColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ false));
        if (styleResolver.applyPropertyToVisitedLinkStyle())
            styleResolver.style()->setVisitedLinkTextStrokeColor(styleResolver.colorFromPrimitiveValue(primitiveValue, /* forVisitedLink */ true));
    }
    static void applyInitialWebkitTextStrokeWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextStrokeWidth(RenderStyle::initialTextStrokeWidth());
    }
    static void applyInheritWebkitTextStrokeWidth(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTextStrokeWidth(styleResolver.parentStyle()->textStrokeWidth());
    }
    static void applyValueWebkitTextStrokeWidth(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTextStrokeWidth(StyleBuilderConverter::convertTextStrokeWidth(styleResolver, value));
    }
    static void applyInitialTransform(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransform(RenderStyle::initialTransform());
    }
    static void applyInheritTransform(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransform(styleResolver.parentStyle()->transform());
    }
    static void applyValueTransform(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTransform(StyleBuilderConverter::convertTransform(styleResolver, value));
    }
    static void applyInitialTransformOriginX(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransformOriginX(RenderStyle::initialTransformOriginX());
    }
    static void applyInheritTransformOriginX(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransformOriginX(styleResolver.parentStyle()->transformOriginX());
    }
    static void applyValueTransformOriginX(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTransformOriginX(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialTransformOriginY(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransformOriginY(RenderStyle::initialTransformOriginY());
    }
    static void applyInheritTransformOriginY(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransformOriginY(styleResolver.parentStyle()->transformOriginY());
    }
    static void applyValueTransformOriginY(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTransformOriginY(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialTransformOriginZ(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransformOriginZ(RenderStyle::initialTransformOriginZ());
    }
    static void applyInheritTransformOriginZ(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransformOriginZ(styleResolver.parentStyle()->transformOriginZ());
    }
    static void applyValueTransformOriginZ(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTransformOriginZ(StyleBuilderConverter::convertComputedLength<float>(styleResolver, value));
    }
    static void applyInitialTransformStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransformStyle3D(RenderStyle::initialTransformStyle3D());
    }
    static void applyInheritTransformStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransformStyle3D(styleResolver.parentStyle()->transformStyle3D());
    }
    static void applyValueTransformStyle(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTransformStyle3D(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitTransformStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransformStyle3D(RenderStyle::initialTransformStyle3D());
    }
    static void applyInheritWebkitTransformStyle(StyleResolver& styleResolver)
    {
        styleResolver.style()->setTransformStyle3D(styleResolver.parentStyle()->transformStyle3D());
    }
    static void applyValueWebkitTransformStyle(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setTransformStyle3D(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitUserDrag(StyleResolver& styleResolver)
    {
        styleResolver.style()->setUserDrag(RenderStyle::initialUserDrag());
    }
    static void applyInheritWebkitUserDrag(StyleResolver& styleResolver)
    {
        styleResolver.style()->setUserDrag(styleResolver.parentStyle()->userDrag());
    }
    static void applyValueWebkitUserDrag(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setUserDrag(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitUserModify(StyleResolver& styleResolver)
    {
        styleResolver.style()->setUserModify(RenderStyle::initialUserModify());
    }
    static void applyInheritWebkitUserModify(StyleResolver& styleResolver)
    {
        styleResolver.style()->setUserModify(styleResolver.parentStyle()->userModify());
    }
    static void applyValueWebkitUserModify(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setUserModify(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitUserSelect(StyleResolver& styleResolver)
    {
        styleResolver.style()->setUserSelect(RenderStyle::initialUserSelect());
    }
    static void applyInheritWebkitUserSelect(StyleResolver& styleResolver)
    {
        styleResolver.style()->setUserSelect(styleResolver.parentStyle()->userSelect());
    }
    static void applyValueWebkitUserSelect(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setUserSelect(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitFlowInto(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlowThread(RenderStyle::initialFlowThread());
    }
    static void applyInheritWebkitFlowInto(StyleResolver& styleResolver)
    {
        styleResolver.style()->setFlowThread(styleResolver.parentStyle()->flowThread());
    }
    static void applyValueWebkitFlowInto(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setFlowThread(StyleBuilderConverter::convertStringOrNone(styleResolver, value));
    }
    static void applyInitialWebkitFlowFrom(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRegionThread(RenderStyle::initialRegionThread());
    }
    static void applyInheritWebkitFlowFrom(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRegionThread(styleResolver.parentStyle()->regionThread());
    }
    static void applyValueWebkitFlowFrom(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setRegionThread(StyleBuilderConverter::convertStringOrNone(styleResolver, value));
    }
    static void applyInitialWebkitRegionFragment(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRegionFragment(RenderStyle::initialRegionFragment());
    }
    static void applyInheritWebkitRegionFragment(StyleResolver& styleResolver)
    {
        styleResolver.style()->setRegionFragment(styleResolver.parentStyle()->regionFragment());
    }
    static void applyValueWebkitRegionFragment(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setRegionFragment(downcast<CSSPrimitiveValue>(value));
    }
    static void applyInitialWebkitRegionBreakAfter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakAfter(RenderStyle::initialBreakBetween());
    }
    static void applyInheritWebkitRegionBreakAfter(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakAfter(styleResolver.parentStyle()->breakAfter());
    }
    static void applyValueWebkitRegionBreakAfter(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakAfter(StyleBuilderConverter::convertRegionBreakBetween(styleResolver, value));
    }
    static void applyInitialWebkitRegionBreakBefore(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakBefore(RenderStyle::initialBreakBetween());
    }
    static void applyInheritWebkitRegionBreakBefore(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakBefore(styleResolver.parentStyle()->breakBefore());
    }
    static void applyValueWebkitRegionBreakBefore(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakBefore(StyleBuilderConverter::convertRegionBreakBetween(styleResolver, value));
    }
    static void applyInitialWebkitRegionBreakInside(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakInside(RenderStyle::initialBreakInside());
    }
    static void applyInheritWebkitRegionBreakInside(StyleResolver& styleResolver)
    {
        styleResolver.style()->setBreakInside(styleResolver.parentStyle()->breakInside());
    }
    static void applyValueWebkitRegionBreakInside(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setBreakInside(StyleBuilderConverter::convertRegionBreakInside(styleResolver, value));
    }
    static void applyInitialWebkitShapeOutside(StyleResolver& styleResolver)
    {
        styleResolver.style()->setShapeOutside(RenderStyle::initialShapeOutside());
    }
    static void applyInheritWebkitShapeOutside(StyleResolver& styleResolver)
    {
        styleResolver.style()->setShapeOutside(styleResolver.parentStyle()->shapeOutside());
    }
    static void applyValueWebkitShapeOutside(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setShapeOutside(StyleBuilderConverter::convertShapeValue(styleResolver, value));
    }
    static void applyInitialWebkitShapeMargin(StyleResolver& styleResolver)
    {
        styleResolver.style()->setShapeMargin(RenderStyle::initialShapeMargin());
    }
    static void applyInheritWebkitShapeMargin(StyleResolver& styleResolver)
    {
        styleResolver.style()->setShapeMargin(styleResolver.parentStyle()->shapeMargin());
    }
    static void applyValueWebkitShapeMargin(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setShapeMargin(StyleBuilderConverter::convertLength(styleResolver, value));
    }
    static void applyInitialWebkitShapeImageThreshold(StyleResolver& styleResolver)
    {
        styleResolver.style()->setShapeImageThreshold(RenderStyle::initialShapeImageThreshold());
    }
    static void applyInheritWebkitShapeImageThreshold(StyleResolver& styleResolver)
    {
        styleResolver.style()->setShapeImageThreshold(styleResolver.parentStyle()->shapeImageThreshold());
    }
    static void applyValueWebkitShapeImageThreshold(StyleResolver& styleResolver, CSSValue& value)
    {
        styleResolver.style()->setShapeImageThreshold(StyleBuilderConverter::convertNumberOrAuto<float>(styleResolver, value));
    }
    static void applyInitialWebkitDashboardRegion(StyleResolver& styleResolver)
    {
        styleResolver.style()->setDashboardRegions(RenderStyle::initialDashboardRegions());
    }
    static void applyInheritWebkitDashboardRegion(StyleResolver& styleResolver)
    {
        styleResolver.style()->setDashboardRegions(styleResolver.parentStyle()->dashboardRegions());
    }
};

void StyleBuilder::applyProperty(CSSPropertyID property, StyleResolver& styleResolver, CSSValue& value, bool isInitial, bool isInherit)
{
    switch (property) {
    case CSSPropertyInvalid:
    case CSSPropertyCustom:
        break;
    case CSSPropertyColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueColor(styleResolver, value);
        break;
    case CSSPropertyDirection:
        if (isInitial)
            StyleBuilderFunctions::applyInitialDirection(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritDirection(styleResolver);
        else
            StyleBuilderCustom::applyValueDirection(styleResolver, value);
        break;
    case CSSPropertyDisplay:
        if (isInitial)
            StyleBuilderFunctions::applyInitialDisplay(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritDisplay(styleResolver);
        else
            StyleBuilderCustom::applyValueDisplay(styleResolver, value);
        break;
    case CSSPropertyFontFamily:
        if (isInitial)
            StyleBuilderCustom::applyInitialFontFamily(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritFontFamily(styleResolver);
        else
            StyleBuilderCustom::applyValueFontFamily(styleResolver, value);
        break;
    case CSSPropertyFontSize:
        if (isInitial)
            StyleBuilderCustom::applyInitialFontSize(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritFontSize(styleResolver);
        else
            StyleBuilderCustom::applyValueFontSize(styleResolver, value);
        break;
    case CSSPropertyFontStyle:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFontStyle(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFontStyle(styleResolver);
        else
            StyleBuilderFunctions::applyValueFontStyle(styleResolver, value);
        break;
    case CSSPropertyFontWeight:
        if (isInitial)
            StyleBuilderCustom::applyInitialFontWeight(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritFontWeight(styleResolver);
        else
            StyleBuilderCustom::applyValueFontWeight(styleResolver, value);
        break;
    case CSSPropertyTextRendering:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTextRendering(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTextRendering(styleResolver);
        else
            StyleBuilderFunctions::applyValueTextRendering(styleResolver, value);
        break;
    case CSSPropertyFontFeatureSettings:
        if (isInitial)
            StyleBuilderCustom::applyInitialFontFeatureSettings(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritFontFeatureSettings(styleResolver);
        else
            StyleBuilderFunctions::applyValueFontFeatureSettings(styleResolver, value);
        break;
    case CSSPropertyWebkitFontKerning:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitFontKerning(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitFontKerning(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitFontKerning(styleResolver, value);
        break;
    case CSSPropertyWebkitFontSmoothing:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitFontSmoothing(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitFontSmoothing(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitFontSmoothing(styleResolver, value);
        break;
    case CSSPropertyFontVariantLigatures:
        if (isInitial)
            StyleBuilderCustom::applyInitialFontVariantLigatures(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritFontVariantLigatures(styleResolver);
        else
            StyleBuilderCustom::applyValueFontVariantLigatures(styleResolver, value);
        break;
    case CSSPropertyFontVariantPosition:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFontVariantPosition(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFontVariantPosition(styleResolver);
        else
            StyleBuilderFunctions::applyValueFontVariantPosition(styleResolver, value);
        break;
    case CSSPropertyFontVariantCaps:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFontVariantCaps(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFontVariantCaps(styleResolver);
        else
            StyleBuilderFunctions::applyValueFontVariantCaps(styleResolver, value);
        break;
    case CSSPropertyFontVariantNumeric:
        if (isInitial)
            StyleBuilderCustom::applyInitialFontVariantNumeric(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritFontVariantNumeric(styleResolver);
        else
            StyleBuilderCustom::applyValueFontVariantNumeric(styleResolver, value);
        break;
    case CSSPropertyFontVariantAlternates:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFontVariantAlternates(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFontVariantAlternates(styleResolver);
        else
            StyleBuilderFunctions::applyValueFontVariantAlternates(styleResolver, value);
        break;
    case CSSPropertyFontVariantEastAsian:
        if (isInitial)
            StyleBuilderCustom::applyInitialFontVariantEastAsian(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritFontVariantEastAsian(styleResolver);
        else
            StyleBuilderCustom::applyValueFontVariantEastAsian(styleResolver, value);
        break;
    case CSSPropertyWebkitLocale:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitLocale(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitLocale(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitLocale(styleResolver, value);
        break;
    case CSSPropertyWebkitTextOrientation:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextOrientation(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextOrientation(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitTextOrientation(styleResolver, value);
        break;
    case CSSPropertyWebkitWritingMode:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitWritingMode(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitWritingMode(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitWritingMode(styleResolver, value);
        break;
    case CSSPropertyWebkitTextZoom:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextZoom(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextZoom(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitTextZoom(styleResolver, value);
        break;
    case CSSPropertyZoom:
        if (isInitial)
            StyleBuilderCustom::applyInitialZoom(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritZoom(styleResolver);
        else
            StyleBuilderCustom::applyValueZoom(styleResolver, value);
        break;
    case CSSPropertyFontSynthesis:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFontSynthesis(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFontSynthesis(styleResolver);
        else
            StyleBuilderFunctions::applyValueFontSynthesis(styleResolver, value);
        break;
    case CSSPropertyWebkitRubyPosition:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitRubyPosition(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitRubyPosition(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitRubyPosition(styleResolver, value);
        break;
    case CSSPropertyAlignmentBaseline:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAlignmentBaseline(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAlignmentBaseline(styleResolver);
        else
            StyleBuilderFunctions::applyValueAlignmentBaseline(styleResolver, value);
        break;
    case CSSPropertyAll:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyAnimation:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyAnimationDelay:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAnimationDelay(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAnimationDelay(styleResolver);
        else
            StyleBuilderFunctions::applyValueAnimationDelay(styleResolver, value);
        break;
    case CSSPropertyAnimationDirection:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAnimationDirection(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAnimationDirection(styleResolver);
        else
            StyleBuilderFunctions::applyValueAnimationDirection(styleResolver, value);
        break;
    case CSSPropertyAnimationDuration:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAnimationDuration(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAnimationDuration(styleResolver);
        else
            StyleBuilderFunctions::applyValueAnimationDuration(styleResolver, value);
        break;
    case CSSPropertyAnimationFillMode:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAnimationFillMode(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAnimationFillMode(styleResolver);
        else
            StyleBuilderFunctions::applyValueAnimationFillMode(styleResolver, value);
        break;
    case CSSPropertyAnimationIterationCount:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAnimationIterationCount(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAnimationIterationCount(styleResolver);
        else
            StyleBuilderFunctions::applyValueAnimationIterationCount(styleResolver, value);
        break;
    case CSSPropertyAnimationName:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAnimationName(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAnimationName(styleResolver);
        else
            StyleBuilderFunctions::applyValueAnimationName(styleResolver, value);
        break;
    case CSSPropertyAnimationPlayState:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAnimationPlayState(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAnimationPlayState(styleResolver);
        else
            StyleBuilderFunctions::applyValueAnimationPlayState(styleResolver, value);
        break;
    case CSSPropertyAnimationTimingFunction:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAnimationTimingFunction(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAnimationTimingFunction(styleResolver);
        else
            StyleBuilderFunctions::applyValueAnimationTimingFunction(styleResolver, value);
        break;
    case CSSPropertyBackground:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBackgroundAttachment:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBackgroundAttachment(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBackgroundAttachment(styleResolver);
        else
            StyleBuilderFunctions::applyValueBackgroundAttachment(styleResolver, value);
        break;
    case CSSPropertyBackgroundBlendMode:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBackgroundBlendMode(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBackgroundBlendMode(styleResolver);
        else
            StyleBuilderFunctions::applyValueBackgroundBlendMode(styleResolver, value);
        break;
    case CSSPropertyBackgroundClip:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBackgroundClip(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBackgroundClip(styleResolver);
        else
            StyleBuilderFunctions::applyValueBackgroundClip(styleResolver, value);
        break;
    case CSSPropertyBackgroundColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBackgroundColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBackgroundColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueBackgroundColor(styleResolver, value);
        break;
    case CSSPropertyBackgroundImage:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBackgroundImage(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBackgroundImage(styleResolver);
        else
            StyleBuilderFunctions::applyValueBackgroundImage(styleResolver, value);
        break;
    case CSSPropertyBackgroundOrigin:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBackgroundOrigin(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBackgroundOrigin(styleResolver);
        else
            StyleBuilderFunctions::applyValueBackgroundOrigin(styleResolver, value);
        break;
    case CSSPropertyBackgroundPosition:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBackgroundPositionX:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBackgroundPositionX(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBackgroundPositionX(styleResolver);
        else
            StyleBuilderFunctions::applyValueBackgroundPositionX(styleResolver, value);
        break;
    case CSSPropertyBackgroundPositionY:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBackgroundPositionY(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBackgroundPositionY(styleResolver);
        else
            StyleBuilderFunctions::applyValueBackgroundPositionY(styleResolver, value);
        break;
    case CSSPropertyBackgroundRepeat:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBackgroundRepeatX:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBackgroundRepeatX(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBackgroundRepeatX(styleResolver);
        else
            StyleBuilderFunctions::applyValueBackgroundRepeatX(styleResolver, value);
        break;
    case CSSPropertyBackgroundRepeatY:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBackgroundRepeatY(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBackgroundRepeatY(styleResolver);
        else
            StyleBuilderFunctions::applyValueBackgroundRepeatY(styleResolver, value);
        break;
    case CSSPropertyBackgroundSize:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBackgroundSize(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBackgroundSize(styleResolver);
        else
            StyleBuilderFunctions::applyValueBackgroundSize(styleResolver, value);
        break;
    case CSSPropertyBaselineShift:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBaselineShift(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBaselineShift(styleResolver);
        else
            StyleBuilderCustom::applyValueBaselineShift(styleResolver, value);
        break;
    case CSSPropertyBorder:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBorderBottom:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBorderBottomColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderBottomColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderBottomColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderBottomColor(styleResolver, value);
        break;
    case CSSPropertyBorderBottomLeftRadius:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderBottomLeftRadius(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderBottomLeftRadius(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderBottomLeftRadius(styleResolver, value);
        break;
    case CSSPropertyBorderBottomRightRadius:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderBottomRightRadius(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderBottomRightRadius(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderBottomRightRadius(styleResolver, value);
        break;
    case CSSPropertyBorderBottomStyle:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderBottomStyle(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderBottomStyle(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderBottomStyle(styleResolver, value);
        break;
    case CSSPropertyBorderBottomWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderBottomWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderBottomWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderBottomWidth(styleResolver, value);
        break;
    case CSSPropertyBorderCollapse:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderCollapse(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderCollapse(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderCollapse(styleResolver, value);
        break;
    case CSSPropertyBorderColor:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBorderImage:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBorderImageOutset:
        if (isInitial)
            StyleBuilderCustom::applyInitialBorderImageOutset(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritBorderImageOutset(styleResolver);
        else
            StyleBuilderCustom::applyValueBorderImageOutset(styleResolver, value);
        break;
    case CSSPropertyBorderImageRepeat:
        if (isInitial)
            StyleBuilderCustom::applyInitialBorderImageRepeat(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritBorderImageRepeat(styleResolver);
        else
            StyleBuilderCustom::applyValueBorderImageRepeat(styleResolver, value);
        break;
    case CSSPropertyBorderImageSlice:
        if (isInitial)
            StyleBuilderCustom::applyInitialBorderImageSlice(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritBorderImageSlice(styleResolver);
        else
            StyleBuilderCustom::applyValueBorderImageSlice(styleResolver, value);
        break;
    case CSSPropertyBorderImageSource:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderImageSource(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderImageSource(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderImageSource(styleResolver, value);
        break;
    case CSSPropertyBorderImageWidth:
        if (isInitial)
            StyleBuilderCustom::applyInitialBorderImageWidth(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritBorderImageWidth(styleResolver);
        else
            StyleBuilderCustom::applyValueBorderImageWidth(styleResolver, value);
        break;
    case CSSPropertyBorderLeft:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBorderLeftColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderLeftColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderLeftColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderLeftColor(styleResolver, value);
        break;
    case CSSPropertyBorderLeftStyle:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderLeftStyle(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderLeftStyle(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderLeftStyle(styleResolver, value);
        break;
    case CSSPropertyBorderLeftWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderLeftWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderLeftWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderLeftWidth(styleResolver, value);
        break;
    case CSSPropertyBorderRadius:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBorderRight:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBorderRightColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderRightColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderRightColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderRightColor(styleResolver, value);
        break;
    case CSSPropertyBorderRightStyle:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderRightStyle(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderRightStyle(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderRightStyle(styleResolver, value);
        break;
    case CSSPropertyBorderRightWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderRightWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderRightWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderRightWidth(styleResolver, value);
        break;
    case CSSPropertyBorderSpacing:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBorderStyle:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBorderTop:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBorderTopColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderTopColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderTopColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderTopColor(styleResolver, value);
        break;
    case CSSPropertyBorderTopLeftRadius:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderTopLeftRadius(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderTopLeftRadius(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderTopLeftRadius(styleResolver, value);
        break;
    case CSSPropertyBorderTopRightRadius:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderTopRightRadius(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderTopRightRadius(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderTopRightRadius(styleResolver, value);
        break;
    case CSSPropertyBorderTopStyle:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderTopStyle(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderTopStyle(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderTopStyle(styleResolver, value);
        break;
    case CSSPropertyBorderTopWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBorderTopWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBorderTopWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueBorderTopWidth(styleResolver, value);
        break;
    case CSSPropertyBorderWidth:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyBottom:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBottom(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBottom(styleResolver);
        else
            StyleBuilderFunctions::applyValueBottom(styleResolver, value);
        break;
    case CSSPropertyBoxShadow:
        if (isInitial)
            StyleBuilderCustom::applyInitialBoxShadow(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritBoxShadow(styleResolver);
        else
            StyleBuilderCustom::applyValueBoxShadow(styleResolver, value);
        break;
    case CSSPropertyBoxSizing:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBoxSizing(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBoxSizing(styleResolver);
        else
            StyleBuilderFunctions::applyValueBoxSizing(styleResolver, value);
        break;
    case CSSPropertyBreakAfter:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBreakAfter(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBreakAfter(styleResolver);
        else
            StyleBuilderFunctions::applyValueBreakAfter(styleResolver, value);
        break;
    case CSSPropertyBreakBefore:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBreakBefore(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBreakBefore(styleResolver);
        else
            StyleBuilderFunctions::applyValueBreakBefore(styleResolver, value);
        break;
    case CSSPropertyBreakInside:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBreakInside(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBreakInside(styleResolver);
        else
            StyleBuilderFunctions::applyValueBreakInside(styleResolver, value);
        break;
    case CSSPropertyBufferedRendering:
        if (isInitial)
            StyleBuilderFunctions::applyInitialBufferedRendering(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritBufferedRendering(styleResolver);
        else
            StyleBuilderFunctions::applyValueBufferedRendering(styleResolver, value);
        break;
    case CSSPropertyCaptionSide:
        if (isInitial)
            StyleBuilderFunctions::applyInitialCaptionSide(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritCaptionSide(styleResolver);
        else
            StyleBuilderFunctions::applyValueCaptionSide(styleResolver, value);
        break;
    case CSSPropertyClear:
        if (isInitial)
            StyleBuilderFunctions::applyInitialClear(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritClear(styleResolver);
        else
            StyleBuilderFunctions::applyValueClear(styleResolver, value);
        break;
    case CSSPropertyClip:
        if (isInitial)
            StyleBuilderCustom::applyInitialClip(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritClip(styleResolver);
        else
            StyleBuilderCustom::applyValueClip(styleResolver, value);
        break;
    case CSSPropertyWebkitClipPath:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitClipPath(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitClipPath(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitClipPath(styleResolver, value);
        break;
    case CSSPropertyClipPath:
        if (isInitial)
            StyleBuilderFunctions::applyInitialClipPath(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritClipPath(styleResolver);
        else
            StyleBuilderFunctions::applyValueClipPath(styleResolver, value);
        break;
    case CSSPropertyClipRule:
        if (isInitial)
            StyleBuilderFunctions::applyInitialClipRule(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritClipRule(styleResolver);
        else
            StyleBuilderFunctions::applyValueClipRule(styleResolver, value);
        break;
    case CSSPropertyColorInterpolation:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColorInterpolation(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColorInterpolation(styleResolver);
        else
            StyleBuilderFunctions::applyValueColorInterpolation(styleResolver, value);
        break;
    case CSSPropertyColorInterpolationFilters:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColorInterpolationFilters(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColorInterpolationFilters(styleResolver);
        else
            StyleBuilderFunctions::applyValueColorInterpolationFilters(styleResolver, value);
        break;
    case CSSPropertyColorProfile:
        break;
    case CSSPropertyColorRendering:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColorRendering(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColorRendering(styleResolver);
        else
            StyleBuilderFunctions::applyValueColorRendering(styleResolver, value);
        break;
    case CSSPropertyContent:
        if (isInitial)
            StyleBuilderCustom::applyInitialContent(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritContent(styleResolver);
        else
            StyleBuilderCustom::applyValueContent(styleResolver, value);
        break;
    case CSSPropertyCounterIncrement:
        if (isInitial)
            StyleBuilderCustom::applyInitialCounterIncrement(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritCounterIncrement(styleResolver);
        else
            StyleBuilderCustom::applyValueCounterIncrement(styleResolver, value);
        break;
    case CSSPropertyCounterReset:
        if (isInitial)
            StyleBuilderCustom::applyInitialCounterReset(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritCounterReset(styleResolver);
        else
            StyleBuilderCustom::applyValueCounterReset(styleResolver, value);
        break;
    case CSSPropertyCursor:
        if (isInitial)
            StyleBuilderCustom::applyInitialCursor(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritCursor(styleResolver);
        else
            StyleBuilderCustom::applyValueCursor(styleResolver, value);
        break;
    case CSSPropertyWebkitCursorVisibility:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitCursorVisibility(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitCursorVisibility(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitCursorVisibility(styleResolver, value);
        break;
    case CSSPropertyCx:
        if (isInitial)
            StyleBuilderFunctions::applyInitialCx(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritCx(styleResolver);
        else
            StyleBuilderFunctions::applyValueCx(styleResolver, value);
        break;
    case CSSPropertyCy:
        if (isInitial)
            StyleBuilderFunctions::applyInitialCy(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritCy(styleResolver);
        else
            StyleBuilderFunctions::applyValueCy(styleResolver, value);
        break;
    case CSSPropertyDominantBaseline:
        if (isInitial)
            StyleBuilderFunctions::applyInitialDominantBaseline(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritDominantBaseline(styleResolver);
        else
            StyleBuilderFunctions::applyValueDominantBaseline(styleResolver, value);
        break;
    case CSSPropertyEmptyCells:
        if (isInitial)
            StyleBuilderFunctions::applyInitialEmptyCells(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritEmptyCells(styleResolver);
        else
            StyleBuilderFunctions::applyValueEmptyCells(styleResolver, value);
        break;
    case CSSPropertyEnableBackground:
        break;
    case CSSPropertyFill:
        if (isInitial)
            StyleBuilderCustom::applyInitialFill(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritFill(styleResolver);
        else
            StyleBuilderCustom::applyValueFill(styleResolver, value);
        break;
    case CSSPropertyFillOpacity:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFillOpacity(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFillOpacity(styleResolver);
        else
            StyleBuilderFunctions::applyValueFillOpacity(styleResolver, value);
        break;
    case CSSPropertyFillRule:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFillRule(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFillRule(styleResolver);
        else
            StyleBuilderFunctions::applyValueFillRule(styleResolver, value);
        break;
    case CSSPropertyFloat:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFloat(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFloat(styleResolver);
        else
            StyleBuilderFunctions::applyValueFloat(styleResolver, value);
        break;
    case CSSPropertyFloodColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFloodColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFloodColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueFloodColor(styleResolver, value);
        break;
    case CSSPropertyFloodOpacity:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFloodOpacity(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFloodOpacity(styleResolver);
        else
            StyleBuilderFunctions::applyValueFloodOpacity(styleResolver, value);
        break;
    case CSSPropertyFont:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyFontVariant:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyFontStretch:
        break;
    case CSSPropertyGlyphOrientationHorizontal:
        if (isInitial)
            StyleBuilderFunctions::applyInitialGlyphOrientationHorizontal(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritGlyphOrientationHorizontal(styleResolver);
        else
            StyleBuilderFunctions::applyValueGlyphOrientationHorizontal(styleResolver, value);
        break;
    case CSSPropertyGlyphOrientationVertical:
        if (isInitial)
            StyleBuilderFunctions::applyInitialGlyphOrientationVertical(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritGlyphOrientationVertical(styleResolver);
        else
            StyleBuilderFunctions::applyValueGlyphOrientationVertical(styleResolver, value);
        break;
    case CSSPropertyHangingPunctuation:
        if (isInitial)
            StyleBuilderFunctions::applyInitialHangingPunctuation(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritHangingPunctuation(styleResolver);
        else
            StyleBuilderFunctions::applyValueHangingPunctuation(styleResolver, value);
        break;
    case CSSPropertyHeight:
        if (isInitial)
            StyleBuilderFunctions::applyInitialHeight(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritHeight(styleResolver);
        else
            StyleBuilderFunctions::applyValueHeight(styleResolver, value);
        break;
    case CSSPropertyImageRendering:
        if (isInitial)
            StyleBuilderFunctions::applyInitialImageRendering(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritImageRendering(styleResolver);
        else
            StyleBuilderFunctions::applyValueImageRendering(styleResolver, value);
        break;
    case CSSPropertyKerning:
        if (isInitial)
            StyleBuilderFunctions::applyInitialKerning(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritKerning(styleResolver);
        else
            StyleBuilderFunctions::applyValueKerning(styleResolver, value);
        break;
    case CSSPropertyLeft:
        if (isInitial)
            StyleBuilderFunctions::applyInitialLeft(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritLeft(styleResolver);
        else
            StyleBuilderFunctions::applyValueLeft(styleResolver, value);
        break;
    case CSSPropertyLetterSpacing:
        if (isInitial)
            StyleBuilderFunctions::applyInitialLetterSpacing(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritLetterSpacing(styleResolver);
        else
            StyleBuilderFunctions::applyValueLetterSpacing(styleResolver, value);
        break;
    case CSSPropertyLightingColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialLightingColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritLightingColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueLightingColor(styleResolver, value);
        break;
    case CSSPropertyLineHeight:
        if (isInitial)
            StyleBuilderFunctions::applyInitialLineHeight(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritLineHeight(styleResolver);
        else
            StyleBuilderFunctions::applyValueLineHeight(styleResolver, value);
        break;
    case CSSPropertyListStyle:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyListStyleImage:
        if (isInitial)
            StyleBuilderFunctions::applyInitialListStyleImage(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritListStyleImage(styleResolver);
        else
            StyleBuilderFunctions::applyValueListStyleImage(styleResolver, value);
        break;
    case CSSPropertyListStylePosition:
        if (isInitial)
            StyleBuilderFunctions::applyInitialListStylePosition(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritListStylePosition(styleResolver);
        else
            StyleBuilderFunctions::applyValueListStylePosition(styleResolver, value);
        break;
    case CSSPropertyListStyleType:
        if (isInitial)
            StyleBuilderFunctions::applyInitialListStyleType(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritListStyleType(styleResolver);
        else
            StyleBuilderFunctions::applyValueListStyleType(styleResolver, value);
        break;
    case CSSPropertyMargin:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyMarginBottom:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMarginBottom(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMarginBottom(styleResolver);
        else
            StyleBuilderFunctions::applyValueMarginBottom(styleResolver, value);
        break;
    case CSSPropertyMarginLeft:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMarginLeft(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMarginLeft(styleResolver);
        else
            StyleBuilderFunctions::applyValueMarginLeft(styleResolver, value);
        break;
    case CSSPropertyMarginRight:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMarginRight(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMarginRight(styleResolver);
        else
            StyleBuilderFunctions::applyValueMarginRight(styleResolver, value);
        break;
    case CSSPropertyMarginTop:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMarginTop(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMarginTop(styleResolver);
        else
            StyleBuilderFunctions::applyValueMarginTop(styleResolver, value);
        break;
    case CSSPropertyMarker:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyMarkerEnd:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMarkerEnd(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMarkerEnd(styleResolver);
        else
            StyleBuilderFunctions::applyValueMarkerEnd(styleResolver, value);
        break;
    case CSSPropertyMarkerMid:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMarkerMid(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMarkerMid(styleResolver);
        else
            StyleBuilderFunctions::applyValueMarkerMid(styleResolver, value);
        break;
    case CSSPropertyMarkerStart:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMarkerStart(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMarkerStart(styleResolver);
        else
            StyleBuilderFunctions::applyValueMarkerStart(styleResolver, value);
        break;
    case CSSPropertyMask:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMask(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMask(styleResolver);
        else
            StyleBuilderFunctions::applyValueMask(styleResolver, value);
        break;
    case CSSPropertyMaskType:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMaskType(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMaskType(styleResolver);
        else
            StyleBuilderFunctions::applyValueMaskType(styleResolver, value);
        break;
    case CSSPropertyMaxHeight:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMaxHeight(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMaxHeight(styleResolver);
        else
            StyleBuilderFunctions::applyValueMaxHeight(styleResolver, value);
        break;
    case CSSPropertyMaxWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMaxWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMaxWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueMaxWidth(styleResolver, value);
        break;
    case CSSPropertyMinHeight:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMinHeight(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMinHeight(styleResolver);
        else
            StyleBuilderFunctions::applyValueMinHeight(styleResolver, value);
        break;
    case CSSPropertyMinWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialMinWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritMinWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueMinWidth(styleResolver, value);
        break;
    case CSSPropertyObjectFit:
        if (isInitial)
            StyleBuilderFunctions::applyInitialObjectFit(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritObjectFit(styleResolver);
        else
            StyleBuilderFunctions::applyValueObjectFit(styleResolver, value);
        break;
    case CSSPropertyObjectPosition:
        if (isInitial)
            StyleBuilderFunctions::applyInitialObjectPosition(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritObjectPosition(styleResolver);
        else
            StyleBuilderFunctions::applyValueObjectPosition(styleResolver, value);
        break;
    case CSSPropertyOpacity:
        if (isInitial)
            StyleBuilderFunctions::applyInitialOpacity(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritOpacity(styleResolver);
        else
            StyleBuilderFunctions::applyValueOpacity(styleResolver, value);
        break;
    case CSSPropertyOrphans:
        if (isInitial)
            StyleBuilderFunctions::applyInitialOrphans(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritOrphans(styleResolver);
        else
            StyleBuilderFunctions::applyValueOrphans(styleResolver, value);
        break;
    case CSSPropertyOutline:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyOutlineColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialOutlineColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritOutlineColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueOutlineColor(styleResolver, value);
        break;
    case CSSPropertyOutlineOffset:
        if (isInitial)
            StyleBuilderFunctions::applyInitialOutlineOffset(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritOutlineOffset(styleResolver);
        else
            StyleBuilderFunctions::applyValueOutlineOffset(styleResolver, value);
        break;
    case CSSPropertyOutlineStyle:
        if (isInitial)
            StyleBuilderCustom::applyInitialOutlineStyle(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritOutlineStyle(styleResolver);
        else
            StyleBuilderCustom::applyValueOutlineStyle(styleResolver, value);
        break;
    case CSSPropertyOutlineWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialOutlineWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritOutlineWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueOutlineWidth(styleResolver, value);
        break;
    case CSSPropertyOverflow:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyOverflowWrap:
        if (isInitial)
            StyleBuilderFunctions::applyInitialOverflowWrap(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritOverflowWrap(styleResolver);
        else
            StyleBuilderFunctions::applyValueOverflowWrap(styleResolver, value);
        break;
    case CSSPropertyOverflowX:
        if (isInitial)
            StyleBuilderFunctions::applyInitialOverflowX(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritOverflowX(styleResolver);
        else
            StyleBuilderFunctions::applyValueOverflowX(styleResolver, value);
        break;
    case CSSPropertyOverflowY:
        if (isInitial)
            StyleBuilderFunctions::applyInitialOverflowY(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritOverflowY(styleResolver);
        else
            StyleBuilderFunctions::applyValueOverflowY(styleResolver, value);
        break;
    case CSSPropertyPadding:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyPaddingBottom:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPaddingBottom(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPaddingBottom(styleResolver);
        else
            StyleBuilderFunctions::applyValuePaddingBottom(styleResolver, value);
        break;
    case CSSPropertyPaddingLeft:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPaddingLeft(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPaddingLeft(styleResolver);
        else
            StyleBuilderFunctions::applyValuePaddingLeft(styleResolver, value);
        break;
    case CSSPropertyPaddingRight:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPaddingRight(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPaddingRight(styleResolver);
        else
            StyleBuilderFunctions::applyValuePaddingRight(styleResolver, value);
        break;
    case CSSPropertyPaddingTop:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPaddingTop(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPaddingTop(styleResolver);
        else
            StyleBuilderFunctions::applyValuePaddingTop(styleResolver, value);
        break;
    case CSSPropertyPage:
        break;
    case CSSPropertyPageBreakAfter:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPageBreakAfter(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPageBreakAfter(styleResolver);
        else
            StyleBuilderFunctions::applyValuePageBreakAfter(styleResolver, value);
        break;
    case CSSPropertyPageBreakBefore:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPageBreakBefore(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPageBreakBefore(styleResolver);
        else
            StyleBuilderFunctions::applyValuePageBreakBefore(styleResolver, value);
        break;
    case CSSPropertyPageBreakInside:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPageBreakInside(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPageBreakInside(styleResolver);
        else
            StyleBuilderFunctions::applyValuePageBreakInside(styleResolver, value);
        break;
    case CSSPropertyPaintOrder:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPaintOrder(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPaintOrder(styleResolver);
        else
            StyleBuilderFunctions::applyValuePaintOrder(styleResolver, value);
        break;
    case CSSPropertyPointerEvents:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPointerEvents(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPointerEvents(styleResolver);
        else
            StyleBuilderFunctions::applyValuePointerEvents(styleResolver, value);
        break;
    case CSSPropertyPosition:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPosition(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPosition(styleResolver);
        else
            StyleBuilderFunctions::applyValuePosition(styleResolver, value);
        break;
    case CSSPropertyQuotes:
        if (isInitial)
            StyleBuilderFunctions::applyInitialQuotes(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritQuotes(styleResolver);
        else
            StyleBuilderFunctions::applyValueQuotes(styleResolver, value);
        break;
    case CSSPropertyR:
        if (isInitial)
            StyleBuilderFunctions::applyInitialR(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritR(styleResolver);
        else
            StyleBuilderFunctions::applyValueR(styleResolver, value);
        break;
    case CSSPropertyResize:
        if (isInitial)
            StyleBuilderFunctions::applyInitialResize(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritResize(styleResolver);
        else
            StyleBuilderFunctions::applyValueResize(styleResolver, value);
        break;
    case CSSPropertyRight:
        if (isInitial)
            StyleBuilderFunctions::applyInitialRight(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritRight(styleResolver);
        else
            StyleBuilderFunctions::applyValueRight(styleResolver, value);
        break;
    case CSSPropertyRx:
        if (isInitial)
            StyleBuilderFunctions::applyInitialRx(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritRx(styleResolver);
        else
            StyleBuilderFunctions::applyValueRx(styleResolver, value);
        break;
    case CSSPropertyRy:
        if (isInitial)
            StyleBuilderFunctions::applyInitialRy(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritRy(styleResolver);
        else
            StyleBuilderFunctions::applyValueRy(styleResolver, value);
        break;
    case CSSPropertyShapeRendering:
        if (isInitial)
            StyleBuilderFunctions::applyInitialShapeRendering(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritShapeRendering(styleResolver);
        else
            StyleBuilderFunctions::applyValueShapeRendering(styleResolver, value);
        break;
    case CSSPropertySize:
        if (isInitial)
            StyleBuilderCustom::applyInitialSize(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritSize(styleResolver);
        else
            StyleBuilderCustom::applyValueSize(styleResolver, value);
        break;
    case CSSPropertySrc:
        break;
    case CSSPropertyStopColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialStopColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritStopColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueStopColor(styleResolver, value);
        break;
    case CSSPropertyStopOpacity:
        if (isInitial)
            StyleBuilderFunctions::applyInitialStopOpacity(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritStopOpacity(styleResolver);
        else
            StyleBuilderFunctions::applyValueStopOpacity(styleResolver, value);
        break;
    case CSSPropertyStroke:
        if (isInitial)
            StyleBuilderCustom::applyInitialStroke(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritStroke(styleResolver);
        else
            StyleBuilderCustom::applyValueStroke(styleResolver, value);
        break;
    case CSSPropertyStrokeDasharray:
        if (isInitial)
            StyleBuilderFunctions::applyInitialStrokeDasharray(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritStrokeDasharray(styleResolver);
        else
            StyleBuilderFunctions::applyValueStrokeDasharray(styleResolver, value);
        break;
    case CSSPropertyStrokeDashoffset:
        if (isInitial)
            StyleBuilderFunctions::applyInitialStrokeDashoffset(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritStrokeDashoffset(styleResolver);
        else
            StyleBuilderFunctions::applyValueStrokeDashoffset(styleResolver, value);
        break;
    case CSSPropertyStrokeLinecap:
        if (isInitial)
            StyleBuilderFunctions::applyInitialStrokeLinecap(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritStrokeLinecap(styleResolver);
        else
            StyleBuilderFunctions::applyValueStrokeLinecap(styleResolver, value);
        break;
    case CSSPropertyStrokeLinejoin:
        if (isInitial)
            StyleBuilderFunctions::applyInitialStrokeLinejoin(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritStrokeLinejoin(styleResolver);
        else
            StyleBuilderFunctions::applyValueStrokeLinejoin(styleResolver, value);
        break;
    case CSSPropertyStrokeMiterlimit:
        if (isInitial)
            StyleBuilderFunctions::applyInitialStrokeMiterlimit(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritStrokeMiterlimit(styleResolver);
        else
            StyleBuilderFunctions::applyValueStrokeMiterlimit(styleResolver, value);
        break;
    case CSSPropertyStrokeOpacity:
        if (isInitial)
            StyleBuilderFunctions::applyInitialStrokeOpacity(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritStrokeOpacity(styleResolver);
        else
            StyleBuilderFunctions::applyValueStrokeOpacity(styleResolver, value);
        break;
    case CSSPropertyStrokeWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialStrokeWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritStrokeWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueStrokeWidth(styleResolver, value);
        break;
    case CSSPropertySpeak:
        if (isInitial)
            StyleBuilderFunctions::applyInitialSpeak(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritSpeak(styleResolver);
        else
            StyleBuilderFunctions::applyValueSpeak(styleResolver, value);
        break;
    case CSSPropertyTableLayout:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTableLayout(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTableLayout(styleResolver);
        else
            StyleBuilderFunctions::applyValueTableLayout(styleResolver, value);
        break;
    case CSSPropertyTabSize:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTabSize(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTabSize(styleResolver);
        else
            StyleBuilderFunctions::applyValueTabSize(styleResolver, value);
        break;
    case CSSPropertyTextAlign:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTextAlign(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTextAlign(styleResolver);
        else
            StyleBuilderFunctions::applyValueTextAlign(styleResolver, value);
        break;
    case CSSPropertyTextAnchor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTextAnchor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTextAnchor(styleResolver);
        else
            StyleBuilderFunctions::applyValueTextAnchor(styleResolver, value);
        break;
    case CSSPropertyTextDecoration:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTextDecoration(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTextDecoration(styleResolver);
        else
            StyleBuilderFunctions::applyValueTextDecoration(styleResolver, value);
        break;
    case CSSPropertyTextIndent:
        if (isInitial)
            StyleBuilderCustom::applyInitialTextIndent(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritTextIndent(styleResolver);
        else
            StyleBuilderCustom::applyValueTextIndent(styleResolver, value);
        break;
    case CSSPropertyTextLineThrough:
        break;
    case CSSPropertyTextLineThroughColor:
        break;
    case CSSPropertyTextLineThroughMode:
        break;
    case CSSPropertyTextLineThroughStyle:
        break;
    case CSSPropertyTextLineThroughWidth:
        break;
    case CSSPropertyTextOverflow:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTextOverflow(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTextOverflow(styleResolver);
        else
            StyleBuilderFunctions::applyValueTextOverflow(styleResolver, value);
        break;
    case CSSPropertyTextOverline:
        break;
    case CSSPropertyTextOverlineColor:
        break;
    case CSSPropertyTextOverlineMode:
        break;
    case CSSPropertyTextOverlineStyle:
        break;
    case CSSPropertyTextOverlineWidth:
        break;
    case CSSPropertyTextShadow:
        if (isInitial)
            StyleBuilderCustom::applyInitialTextShadow(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritTextShadow(styleResolver);
        else
            StyleBuilderCustom::applyValueTextShadow(styleResolver, value);
        break;
    case CSSPropertyTextTransform:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTextTransform(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTextTransform(styleResolver);
        else
            StyleBuilderFunctions::applyValueTextTransform(styleResolver, value);
        break;
    case CSSPropertyTextUnderline:
        break;
    case CSSPropertyTextUnderlineColor:
        break;
    case CSSPropertyTextUnderlineMode:
        break;
    case CSSPropertyTextUnderlineStyle:
        break;
    case CSSPropertyTextUnderlineWidth:
        break;
    case CSSPropertyTop:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTop(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTop(styleResolver);
        else
            StyleBuilderFunctions::applyValueTop(styleResolver, value);
        break;
    case CSSPropertyTransition:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyTransitionDelay:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTransitionDelay(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTransitionDelay(styleResolver);
        else
            StyleBuilderFunctions::applyValueTransitionDelay(styleResolver, value);
        break;
    case CSSPropertyTransitionDuration:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTransitionDuration(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTransitionDuration(styleResolver);
        else
            StyleBuilderFunctions::applyValueTransitionDuration(styleResolver, value);
        break;
    case CSSPropertyTransitionProperty:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTransitionProperty(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTransitionProperty(styleResolver);
        else
            StyleBuilderFunctions::applyValueTransitionProperty(styleResolver, value);
        break;
    case CSSPropertyTransitionTimingFunction:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTransitionTimingFunction(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTransitionTimingFunction(styleResolver);
        else
            StyleBuilderFunctions::applyValueTransitionTimingFunction(styleResolver, value);
        break;
    case CSSPropertyUnicodeBidi:
        if (isInitial)
            StyleBuilderFunctions::applyInitialUnicodeBidi(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritUnicodeBidi(styleResolver);
        else
            StyleBuilderFunctions::applyValueUnicodeBidi(styleResolver, value);
        break;
    case CSSPropertyUnicodeRange:
        break;
    case CSSPropertyVectorEffect:
        if (isInitial)
            StyleBuilderFunctions::applyInitialVectorEffect(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritVectorEffect(styleResolver);
        else
            StyleBuilderFunctions::applyValueVectorEffect(styleResolver, value);
        break;
    case CSSPropertyVerticalAlign:
        if (isInitial)
            StyleBuilderFunctions::applyInitialVerticalAlign(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritVerticalAlign(styleResolver);
        else
            StyleBuilderCustom::applyValueVerticalAlign(styleResolver, value);
        break;
    case CSSPropertyVisibility:
        if (isInitial)
            StyleBuilderFunctions::applyInitialVisibility(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritVisibility(styleResolver);
        else
            StyleBuilderFunctions::applyValueVisibility(styleResolver, value);
        break;
    case CSSPropertyWhiteSpace:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWhiteSpace(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWhiteSpace(styleResolver);
        else
            StyleBuilderFunctions::applyValueWhiteSpace(styleResolver, value);
        break;
    case CSSPropertyWidows:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWidows(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWidows(styleResolver);
        else
            StyleBuilderFunctions::applyValueWidows(styleResolver, value);
        break;
    case CSSPropertyWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueWidth(styleResolver, value);
        break;
    case CSSPropertyWillChange:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWillChange(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWillChange(styleResolver);
        else
            StyleBuilderCustom::applyValueWillChange(styleResolver, value);
        break;
    case CSSPropertyWordBreak:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWordBreak(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWordBreak(styleResolver);
        else
            StyleBuilderFunctions::applyValueWordBreak(styleResolver, value);
        break;
    case CSSPropertyWordSpacing:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWordSpacing(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWordSpacing(styleResolver);
        else
            StyleBuilderFunctions::applyValueWordSpacing(styleResolver, value);
        break;
    case CSSPropertyWordWrap:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWordWrap(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWordWrap(styleResolver);
        else
            StyleBuilderFunctions::applyValueWordWrap(styleResolver, value);
        break;
    case CSSPropertyWritingMode:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWritingMode(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWritingMode(styleResolver);
        else
            StyleBuilderFunctions::applyValueWritingMode(styleResolver, value);
        break;
    case CSSPropertyX:
        if (isInitial)
            StyleBuilderFunctions::applyInitialX(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritX(styleResolver);
        else
            StyleBuilderFunctions::applyValueX(styleResolver, value);
        break;
    case CSSPropertyY:
        if (isInitial)
            StyleBuilderFunctions::applyInitialY(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritY(styleResolver);
        else
            StyleBuilderFunctions::applyValueY(styleResolver, value);
        break;
    case CSSPropertyZIndex:
        if (isInitial)
            StyleBuilderFunctions::applyInitialZIndex(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritZIndex(styleResolver);
        else
            StyleBuilderFunctions::applyValueZIndex(styleResolver, value);
        break;
    case CSSPropertyAlt:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAlt(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAlt(styleResolver);
        else
            StyleBuilderCustom::applyValueAlt(styleResolver, value);
        break;
    case CSSPropertyWebkitAppearance:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitAppearance(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitAppearance(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitAppearance(styleResolver, value);
        break;
    case CSSPropertyWebkitAspectRatio:
        if (isInitial)
            StyleBuilderCustom::applyInitialWebkitAspectRatio(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritWebkitAspectRatio(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitAspectRatio(styleResolver, value);
        break;
    case CSSPropertyWebkitBackfaceVisibility:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBackfaceVisibility(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBackfaceVisibility(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBackfaceVisibility(styleResolver, value);
        break;
    case CSSPropertyWebkitBackgroundClip:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBackgroundClip(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBackgroundClip(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBackgroundClip(styleResolver, value);
        break;
    case CSSPropertyWebkitBackgroundComposite:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBackgroundComposite(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBackgroundComposite(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBackgroundComposite(styleResolver, value);
        break;
    case CSSPropertyWebkitBackgroundOrigin:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBackgroundOrigin(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBackgroundOrigin(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBackgroundOrigin(styleResolver, value);
        break;
    case CSSPropertyWebkitBackgroundSize:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBackgroundSize(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBackgroundSize(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBackgroundSize(styleResolver, value);
        break;
    case CSSPropertyWebkitBorderAfter:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitBorderAfterColor:
        break;
    case CSSPropertyWebkitBorderAfterStyle:
        break;
    case CSSPropertyWebkitBorderAfterWidth:
        break;
    case CSSPropertyWebkitBorderBefore:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitBorderBeforeColor:
        break;
    case CSSPropertyWebkitBorderBeforeStyle:
        break;
    case CSSPropertyWebkitBorderBeforeWidth:
        break;
    case CSSPropertyWebkitBorderEnd:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitBorderEndColor:
        break;
    case CSSPropertyWebkitBorderEndStyle:
        break;
    case CSSPropertyWebkitBorderEndWidth:
        break;
    case CSSPropertyWebkitBorderFit:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBorderFit(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBorderFit(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBorderFit(styleResolver, value);
        break;
    case CSSPropertyWebkitBorderHorizontalSpacing:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBorderHorizontalSpacing(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBorderHorizontalSpacing(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBorderHorizontalSpacing(styleResolver, value);
        break;
    case CSSPropertyWebkitBorderImage:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBorderImage(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBorderImage(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBorderImage(styleResolver, value);
        break;
    case CSSPropertyWebkitBorderRadius:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitBorderStart:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitBorderStartColor:
        break;
    case CSSPropertyWebkitBorderStartStyle:
        break;
    case CSSPropertyWebkitBorderStartWidth:
        break;
    case CSSPropertyWebkitBorderVerticalSpacing:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBorderVerticalSpacing(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBorderVerticalSpacing(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBorderVerticalSpacing(styleResolver, value);
        break;
    case CSSPropertyWebkitBoxAlign:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBoxAlign(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBoxAlign(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBoxAlign(styleResolver, value);
        break;
    case CSSPropertyWebkitBoxDirection:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBoxDirection(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBoxDirection(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBoxDirection(styleResolver, value);
        break;
    case CSSPropertyWebkitBoxFlex:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBoxFlex(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBoxFlex(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBoxFlex(styleResolver, value);
        break;
    case CSSPropertyWebkitBoxFlexGroup:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBoxFlexGroup(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBoxFlexGroup(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBoxFlexGroup(styleResolver, value);
        break;
    case CSSPropertyWebkitBoxLines:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBoxLines(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBoxLines(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBoxLines(styleResolver, value);
        break;
    case CSSPropertyWebkitBoxOrdinalGroup:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBoxOrdinalGroup(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBoxOrdinalGroup(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBoxOrdinalGroup(styleResolver, value);
        break;
    case CSSPropertyWebkitBoxOrient:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBoxOrient(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBoxOrient(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBoxOrient(styleResolver, value);
        break;
    case CSSPropertyWebkitBoxPack:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBoxPack(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBoxPack(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBoxPack(styleResolver, value);
        break;
    case CSSPropertyWebkitBoxReflect:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBoxReflect(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBoxReflect(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBoxReflect(styleResolver, value);
        break;
    case CSSPropertyWebkitBoxShadow:
        if (isInitial)
            StyleBuilderCustom::applyInitialWebkitBoxShadow(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritWebkitBoxShadow(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitBoxShadow(styleResolver, value);
        break;
    case CSSPropertyWebkitColumnAxis:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitColumnAxis(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitColumnAxis(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitColumnAxis(styleResolver, value);
        break;
    case CSSPropertyWebkitColumnBreakAfter:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitColumnBreakAfter(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitColumnBreakAfter(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitColumnBreakAfter(styleResolver, value);
        break;
    case CSSPropertyWebkitColumnBreakBefore:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitColumnBreakBefore(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitColumnBreakBefore(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitColumnBreakBefore(styleResolver, value);
        break;
    case CSSPropertyWebkitColumnBreakInside:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitColumnBreakInside(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitColumnBreakInside(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitColumnBreakInside(styleResolver, value);
        break;
    case CSSPropertyColumnCount:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColumnCount(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColumnCount(styleResolver);
        else
            StyleBuilderFunctions::applyValueColumnCount(styleResolver, value);
        break;
    case CSSPropertyColumnFill:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColumnFill(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColumnFill(styleResolver);
        else
            StyleBuilderFunctions::applyValueColumnFill(styleResolver, value);
        break;
    case CSSPropertyColumnGap:
        if (isInitial)
            StyleBuilderCustom::applyInitialColumnGap(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritColumnGap(styleResolver);
        else
            StyleBuilderCustom::applyValueColumnGap(styleResolver, value);
        break;
    case CSSPropertyColumnProgression:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColumnProgression(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColumnProgression(styleResolver);
        else
            StyleBuilderFunctions::applyValueColumnProgression(styleResolver, value);
        break;
    case CSSPropertyColumnRule:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyColumnRuleColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColumnRuleColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColumnRuleColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueColumnRuleColor(styleResolver, value);
        break;
    case CSSPropertyColumnRuleStyle:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColumnRuleStyle(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColumnRuleStyle(styleResolver);
        else
            StyleBuilderFunctions::applyValueColumnRuleStyle(styleResolver, value);
        break;
    case CSSPropertyColumnRuleWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColumnRuleWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColumnRuleWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueColumnRuleWidth(styleResolver, value);
        break;
    case CSSPropertyColumnSpan:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColumnSpan(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColumnSpan(styleResolver);
        else
            StyleBuilderFunctions::applyValueColumnSpan(styleResolver, value);
        break;
    case CSSPropertyColumnWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialColumnWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritColumnWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueColumnWidth(styleResolver, value);
        break;
    case CSSPropertyColumns:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitBoxDecorationBreak:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBoxDecorationBreak(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBoxDecorationBreak(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBoxDecorationBreak(styleResolver, value);
        break;
    case CSSPropertyFilter:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFilter(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFilter(styleResolver);
        else
            StyleBuilderFunctions::applyValueFilter(styleResolver, value);
        break;
    case CSSPropertyAlignContent:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAlignContent(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAlignContent(styleResolver);
        else
            StyleBuilderFunctions::applyValueAlignContent(styleResolver, value);
        break;
    case CSSPropertyAlignItems:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAlignItems(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAlignItems(styleResolver);
        else
            StyleBuilderFunctions::applyValueAlignItems(styleResolver, value);
        break;
    case CSSPropertyAlignSelf:
        if (isInitial)
            StyleBuilderFunctions::applyInitialAlignSelf(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritAlignSelf(styleResolver);
        else
            StyleBuilderFunctions::applyValueAlignSelf(styleResolver, value);
        break;
    case CSSPropertyFlex:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyFlexBasis:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFlexBasis(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFlexBasis(styleResolver);
        else
            StyleBuilderFunctions::applyValueFlexBasis(styleResolver, value);
        break;
    case CSSPropertyFlexDirection:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFlexDirection(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFlexDirection(styleResolver);
        else
            StyleBuilderFunctions::applyValueFlexDirection(styleResolver, value);
        break;
    case CSSPropertyFlexFlow:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyFlexGrow:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFlexGrow(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFlexGrow(styleResolver);
        else
            StyleBuilderFunctions::applyValueFlexGrow(styleResolver, value);
        break;
    case CSSPropertyFlexShrink:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFlexShrink(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFlexShrink(styleResolver);
        else
            StyleBuilderFunctions::applyValueFlexShrink(styleResolver, value);
        break;
    case CSSPropertyFlexWrap:
        if (isInitial)
            StyleBuilderFunctions::applyInitialFlexWrap(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritFlexWrap(styleResolver);
        else
            StyleBuilderFunctions::applyValueFlexWrap(styleResolver, value);
        break;
    case CSSPropertyJustifyContent:
        if (isInitial)
            StyleBuilderFunctions::applyInitialJustifyContent(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritJustifyContent(styleResolver);
        else
            StyleBuilderFunctions::applyValueJustifyContent(styleResolver, value);
        break;
    case CSSPropertyWebkitBackdropFilter:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitBackdropFilter(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitBackdropFilter(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitBackdropFilter(styleResolver, value);
        break;
    case CSSPropertyWebkitFontSizeDelta:
        break;
    case CSSPropertyJustifySelf:
        if (isInitial)
            StyleBuilderFunctions::applyInitialJustifySelf(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritJustifySelf(styleResolver);
        else
            StyleBuilderFunctions::applyValueJustifySelf(styleResolver, value);
        break;
    case CSSPropertyJustifyItems:
        if (isInitial)
            StyleBuilderFunctions::applyInitialJustifyItems(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritJustifyItems(styleResolver);
        else
            StyleBuilderFunctions::applyValueJustifyItems(styleResolver, value);
        break;
    case CSSPropertyGrid:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyGridArea:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyGridAutoColumns:
        if (isInitial)
            StyleBuilderFunctions::applyInitialGridAutoColumns(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritGridAutoColumns(styleResolver);
        else
            StyleBuilderFunctions::applyValueGridAutoColumns(styleResolver, value);
        break;
    case CSSPropertyGridAutoRows:
        if (isInitial)
            StyleBuilderFunctions::applyInitialGridAutoRows(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritGridAutoRows(styleResolver);
        else
            StyleBuilderFunctions::applyValueGridAutoRows(styleResolver, value);
        break;
    case CSSPropertyGridColumnEnd:
        if (isInitial)
            StyleBuilderFunctions::applyInitialGridColumnEnd(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritGridColumnEnd(styleResolver);
        else
            StyleBuilderFunctions::applyValueGridColumnEnd(styleResolver, value);
        break;
    case CSSPropertyGridColumnGap:
        if (isInitial)
            StyleBuilderFunctions::applyInitialGridColumnGap(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritGridColumnGap(styleResolver);
        else
            StyleBuilderFunctions::applyValueGridColumnGap(styleResolver, value);
        break;
    case CSSPropertyGridColumnStart:
        if (isInitial)
            StyleBuilderFunctions::applyInitialGridColumnStart(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritGridColumnStart(styleResolver);
        else
            StyleBuilderFunctions::applyValueGridColumnStart(styleResolver, value);
        break;
    case CSSPropertyGridTemplate:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyGridTemplateColumns:
        if (isInitial)
            StyleBuilderCustom::applyInitialGridTemplateColumns(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritGridTemplateColumns(styleResolver);
        else
            StyleBuilderCustom::applyValueGridTemplateColumns(styleResolver, value);
        break;
    case CSSPropertyGridTemplateRows:
        if (isInitial)
            StyleBuilderCustom::applyInitialGridTemplateRows(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritGridTemplateRows(styleResolver);
        else
            StyleBuilderCustom::applyValueGridTemplateRows(styleResolver, value);
        break;
    case CSSPropertyGridRowEnd:
        if (isInitial)
            StyleBuilderFunctions::applyInitialGridRowEnd(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritGridRowEnd(styleResolver);
        else
            StyleBuilderFunctions::applyValueGridRowEnd(styleResolver, value);
        break;
    case CSSPropertyGridRowGap:
        if (isInitial)
            StyleBuilderFunctions::applyInitialGridRowGap(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritGridRowGap(styleResolver);
        else
            StyleBuilderFunctions::applyValueGridRowGap(styleResolver, value);
        break;
    case CSSPropertyGridRowStart:
        if (isInitial)
            StyleBuilderFunctions::applyInitialGridRowStart(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritGridRowStart(styleResolver);
        else
            StyleBuilderFunctions::applyValueGridRowStart(styleResolver, value);
        break;
    case CSSPropertyGridColumn:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyGridGap:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyGridRow:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyGridTemplateAreas:
        if (isInitial)
            StyleBuilderCustom::applyInitialGridTemplateAreas(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritGridTemplateAreas(styleResolver);
        else
            StyleBuilderCustom::applyValueGridTemplateAreas(styleResolver, value);
        break;
    case CSSPropertyGridAutoFlow:
        if (isInitial)
            StyleBuilderFunctions::applyInitialGridAutoFlow(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritGridAutoFlow(styleResolver);
        else
            StyleBuilderFunctions::applyValueGridAutoFlow(styleResolver, value);
        break;
    case CSSPropertyWebkitHyphenateCharacter:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitHyphenateCharacter(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitHyphenateCharacter(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitHyphenateCharacter(styleResolver, value);
        break;
    case CSSPropertyWebkitHyphenateLimitAfter:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitHyphenateLimitAfter(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitHyphenateLimitAfter(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitHyphenateLimitAfter(styleResolver, value);
        break;
    case CSSPropertyWebkitHyphenateLimitBefore:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitHyphenateLimitBefore(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitHyphenateLimitBefore(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitHyphenateLimitBefore(styleResolver, value);
        break;
    case CSSPropertyWebkitHyphenateLimitLines:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitHyphenateLimitLines(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitHyphenateLimitLines(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitHyphenateLimitLines(styleResolver, value);
        break;
    case CSSPropertyWebkitHyphens:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitHyphens(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitHyphens(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitHyphens(styleResolver, value);
        break;
    case CSSPropertyWebkitInitialLetter:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitInitialLetter(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitInitialLetter(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitInitialLetter(styleResolver, value);
        break;
    case CSSPropertyWebkitLineBoxContain:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitLineBoxContain(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitLineBoxContain(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitLineBoxContain(styleResolver, value);
        break;
    case CSSPropertyWebkitLineAlign:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitLineAlign(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitLineAlign(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitLineAlign(styleResolver, value);
        break;
    case CSSPropertyWebkitLineBreak:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitLineBreak(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitLineBreak(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitLineBreak(styleResolver, value);
        break;
    case CSSPropertyWebkitLineClamp:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitLineClamp(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitLineClamp(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitLineClamp(styleResolver, value);
        break;
    case CSSPropertyWebkitLineGrid:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitLineGrid(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitLineGrid(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitLineGrid(styleResolver, value);
        break;
    case CSSPropertyWebkitLineSnap:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitLineSnap(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitLineSnap(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitLineSnap(styleResolver, value);
        break;
    case CSSPropertyWebkitLogicalWidth:
        break;
    case CSSPropertyWebkitLogicalHeight:
        break;
    case CSSPropertyWebkitMarginAfterCollapse:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMarginAfterCollapse(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMarginAfterCollapse(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMarginAfterCollapse(styleResolver, value);
        break;
    case CSSPropertyWebkitMarginBeforeCollapse:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMarginBeforeCollapse(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMarginBeforeCollapse(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMarginBeforeCollapse(styleResolver, value);
        break;
    case CSSPropertyWebkitMarginBottomCollapse:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMarginBottomCollapse(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMarginBottomCollapse(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMarginBottomCollapse(styleResolver, value);
        break;
    case CSSPropertyWebkitMarginTopCollapse:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMarginTopCollapse(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMarginTopCollapse(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMarginTopCollapse(styleResolver, value);
        break;
    case CSSPropertyWebkitMarginCollapse:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitMarginAfter:
        break;
    case CSSPropertyWebkitMarginBefore:
        break;
    case CSSPropertyWebkitMarginEnd:
        break;
    case CSSPropertyWebkitMarginStart:
        break;
    case CSSPropertyWebkitMarquee:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitMarqueeDirection:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMarqueeDirection(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMarqueeDirection(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMarqueeDirection(styleResolver, value);
        break;
    case CSSPropertyWebkitMarqueeIncrement:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMarqueeIncrement(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMarqueeIncrement(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMarqueeIncrement(styleResolver, value);
        break;
    case CSSPropertyWebkitMarqueeRepetition:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMarqueeRepetition(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMarqueeRepetition(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMarqueeRepetition(styleResolver, value);
        break;
    case CSSPropertyWebkitMarqueeSpeed:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMarqueeSpeed(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMarqueeSpeed(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMarqueeSpeed(styleResolver, value);
        break;
    case CSSPropertyWebkitMarqueeStyle:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMarqueeStyle(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMarqueeStyle(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMarqueeStyle(styleResolver, value);
        break;
    case CSSPropertyWebkitMask:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitMaskBoxImage:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskBoxImage(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskBoxImage(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskBoxImage(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskBoxImageOutset:
        if (isInitial)
            StyleBuilderCustom::applyInitialWebkitMaskBoxImageOutset(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritWebkitMaskBoxImageOutset(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitMaskBoxImageOutset(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskBoxImageRepeat:
        if (isInitial)
            StyleBuilderCustom::applyInitialWebkitMaskBoxImageRepeat(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritWebkitMaskBoxImageRepeat(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitMaskBoxImageRepeat(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskBoxImageSlice:
        if (isInitial)
            StyleBuilderCustom::applyInitialWebkitMaskBoxImageSlice(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritWebkitMaskBoxImageSlice(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitMaskBoxImageSlice(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskBoxImageSource:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskBoxImageSource(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskBoxImageSource(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskBoxImageSource(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskBoxImageWidth:
        if (isInitial)
            StyleBuilderCustom::applyInitialWebkitMaskBoxImageWidth(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritWebkitMaskBoxImageWidth(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitMaskBoxImageWidth(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskClip:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskClip(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskClip(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskClip(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskComposite:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskComposite(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskComposite(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskComposite(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskImage:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskImage(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskImage(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskImage(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskOrigin:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskOrigin(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskOrigin(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskOrigin(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskPosition:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitMaskPositionX:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskPositionX(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskPositionX(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskPositionX(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskPositionY:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskPositionY(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskPositionY(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskPositionY(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskRepeat:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitMaskRepeatX:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskRepeatX(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskRepeatX(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskRepeatX(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskRepeatY:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskRepeatY(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskRepeatY(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskRepeatY(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskSize:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskSize(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskSize(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskSize(styleResolver, value);
        break;
    case CSSPropertyWebkitMaskSourceType:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitMaskSourceType(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitMaskSourceType(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitMaskSourceType(styleResolver, value);
        break;
    case CSSPropertyWebkitMaxLogicalWidth:
        break;
    case CSSPropertyWebkitMaxLogicalHeight:
        break;
    case CSSPropertyWebkitMinLogicalWidth:
        break;
    case CSSPropertyWebkitMinLogicalHeight:
        break;
    case CSSPropertyWebkitNbspMode:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitNbspMode(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitNbspMode(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitNbspMode(styleResolver, value);
        break;
    case CSSPropertyOrder:
        if (isInitial)
            StyleBuilderFunctions::applyInitialOrder(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritOrder(styleResolver);
        else
            StyleBuilderFunctions::applyValueOrder(styleResolver, value);
        break;
    case CSSPropertyWebkitPaddingAfter:
        break;
    case CSSPropertyWebkitPaddingBefore:
        break;
    case CSSPropertyWebkitPaddingEnd:
        break;
    case CSSPropertyWebkitPaddingStart:
        break;
    case CSSPropertyPerspective:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPerspective(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPerspective(styleResolver);
        else
            StyleBuilderFunctions::applyValuePerspective(styleResolver, value);
        break;
    case CSSPropertyPerspectiveOrigin:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyPerspectiveOriginX:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPerspectiveOriginX(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPerspectiveOriginX(styleResolver);
        else
            StyleBuilderFunctions::applyValuePerspectiveOriginX(styleResolver, value);
        break;
    case CSSPropertyPerspectiveOriginY:
        if (isInitial)
            StyleBuilderFunctions::applyInitialPerspectiveOriginY(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritPerspectiveOriginY(styleResolver);
        else
            StyleBuilderFunctions::applyValuePerspectiveOriginY(styleResolver, value);
        break;
    case CSSPropertyWebkitPrintColorAdjust:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitPrintColorAdjust(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitPrintColorAdjust(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitPrintColorAdjust(styleResolver, value);
        break;
    case CSSPropertyWebkitRtlOrdering:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitRtlOrdering(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitRtlOrdering(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitRtlOrdering(styleResolver, value);
        break;
    case CSSPropertyWebkitSvgShadow:
        if (isInitial)
            StyleBuilderCustom::applyInitialWebkitSvgShadow(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritWebkitSvgShadow(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitSvgShadow(styleResolver, value);
        break;
    case CSSPropertyWebkitTextCombine:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextCombine(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextCombine(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextCombine(styleResolver, value);
        break;
    case CSSPropertyWebkitTextDecoration:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitTextDecorationLine:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextDecorationLine(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextDecorationLine(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextDecorationLine(styleResolver, value);
        break;
    case CSSPropertyWebkitTextDecorationStyle:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextDecorationStyle(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextDecorationStyle(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextDecorationStyle(styleResolver, value);
        break;
    case CSSPropertyWebkitTextDecorationColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextDecorationColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextDecorationColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextDecorationColor(styleResolver, value);
        break;
    case CSSPropertyWebkitTextDecorationSkip:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextDecorationSkip(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextDecorationSkip(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextDecorationSkip(styleResolver, value);
        break;
    case CSSPropertyWebkitTextUnderlinePosition:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextUnderlinePosition(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextUnderlinePosition(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextUnderlinePosition(styleResolver, value);
        break;
    case CSSPropertyWebkitTextDecorationsInEffect:
        break;
    case CSSPropertyWebkitTextEmphasis:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitTextEmphasisColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextEmphasisColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextEmphasisColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextEmphasisColor(styleResolver, value);
        break;
    case CSSPropertyWebkitTextEmphasisPosition:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextEmphasisPosition(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextEmphasisPosition(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextEmphasisPosition(styleResolver, value);
        break;
    case CSSPropertyWebkitTextEmphasisStyle:
        if (isInitial)
            StyleBuilderCustom::applyInitialWebkitTextEmphasisStyle(styleResolver);
        else if (isInherit)
            StyleBuilderCustom::applyInheritWebkitTextEmphasisStyle(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitTextEmphasisStyle(styleResolver, value);
        break;
    case CSSPropertyWebkitTextFillColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextFillColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextFillColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextFillColor(styleResolver, value);
        break;
    case CSSPropertyWebkitTextSecurity:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextSecurity(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextSecurity(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextSecurity(styleResolver, value);
        break;
    case CSSPropertyWebkitTextStroke:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyWebkitTextStrokeColor:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextStrokeColor(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextStrokeColor(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextStrokeColor(styleResolver, value);
        break;
    case CSSPropertyWebkitTextStrokeWidth:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTextStrokeWidth(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTextStrokeWidth(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTextStrokeWidth(styleResolver, value);
        break;
    case CSSPropertyTransform:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTransform(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTransform(styleResolver);
        else
            StyleBuilderFunctions::applyValueTransform(styleResolver, value);
        break;
    case CSSPropertyTransformOrigin:
        ASSERT(isShorthandCSSProperty(property));
        ASSERT_NOT_REACHED();
        break;
    case CSSPropertyTransformOriginX:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTransformOriginX(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTransformOriginX(styleResolver);
        else
            StyleBuilderFunctions::applyValueTransformOriginX(styleResolver, value);
        break;
    case CSSPropertyTransformOriginY:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTransformOriginY(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTransformOriginY(styleResolver);
        else
            StyleBuilderFunctions::applyValueTransformOriginY(styleResolver, value);
        break;
    case CSSPropertyTransformOriginZ:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTransformOriginZ(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTransformOriginZ(styleResolver);
        else
            StyleBuilderFunctions::applyValueTransformOriginZ(styleResolver, value);
        break;
    case CSSPropertyTransformStyle:
        if (isInitial)
            StyleBuilderFunctions::applyInitialTransformStyle(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritTransformStyle(styleResolver);
        else
            StyleBuilderFunctions::applyValueTransformStyle(styleResolver, value);
        break;
    case CSSPropertyWebkitTransformStyle:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitTransformStyle(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitTransformStyle(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitTransformStyle(styleResolver, value);
        break;
    case CSSPropertyWebkitUserDrag:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitUserDrag(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitUserDrag(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitUserDrag(styleResolver, value);
        break;
    case CSSPropertyWebkitUserModify:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitUserModify(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitUserModify(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitUserModify(styleResolver, value);
        break;
    case CSSPropertyWebkitUserSelect:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitUserSelect(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitUserSelect(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitUserSelect(styleResolver, value);
        break;
    case CSSPropertyWebkitFlowInto:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitFlowInto(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitFlowInto(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitFlowInto(styleResolver, value);
        break;
    case CSSPropertyWebkitFlowFrom:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitFlowFrom(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitFlowFrom(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitFlowFrom(styleResolver, value);
        break;
    case CSSPropertyWebkitRegionFragment:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitRegionFragment(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitRegionFragment(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitRegionFragment(styleResolver, value);
        break;
    case CSSPropertyWebkitRegionBreakAfter:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitRegionBreakAfter(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitRegionBreakAfter(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitRegionBreakAfter(styleResolver, value);
        break;
    case CSSPropertyWebkitRegionBreakBefore:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitRegionBreakBefore(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitRegionBreakBefore(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitRegionBreakBefore(styleResolver, value);
        break;
    case CSSPropertyWebkitRegionBreakInside:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitRegionBreakInside(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitRegionBreakInside(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitRegionBreakInside(styleResolver, value);
        break;
    case CSSPropertyWebkitShapeOutside:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitShapeOutside(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitShapeOutside(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitShapeOutside(styleResolver, value);
        break;
    case CSSPropertyWebkitShapeMargin:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitShapeMargin(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitShapeMargin(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitShapeMargin(styleResolver, value);
        break;
    case CSSPropertyWebkitShapeImageThreshold:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitShapeImageThreshold(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitShapeImageThreshold(styleResolver);
        else
            StyleBuilderFunctions::applyValueWebkitShapeImageThreshold(styleResolver, value);
        break;
    case CSSPropertyWebkitDashboardRegion:
        if (isInitial)
            StyleBuilderFunctions::applyInitialWebkitDashboardRegion(styleResolver);
        else if (isInherit)
            StyleBuilderFunctions::applyInheritWebkitDashboardRegion(styleResolver);
        else
            StyleBuilderCustom::applyValueWebkitDashboardRegion(styleResolver, value);
        break;
    };
}

} // namespace WebCore
