Skip to content

Commit

Permalink
Simplify css primitive parsers by creating a strong split between con…
Browse files Browse the repository at this point in the history
…suming and resolving

https://bugs.webkit.org/show_bug.cgi?id=273592

Reviewed by Antti Koivisto.

The current primitive consumers for CSS property values combine both consuming (the part
where a token is read and the token range moves forward) and resolving into a value (the
part that does things like, create a CSSPrimitiveValue, or divide the value by 100). This
leads us to have a bunch of duplicate code for each primitive type. For example, for
consuming an angle, we have two complete sets of consumers:

struct AngleRawKnownTokenTypeFunctionConsumer;
struct AngleRawKnownTokenTypeDimensionConsumer;
struct AngleRawKnownTokenTypeNumberConsumer;
struct AngleCSSPrimitiveValueWithCalcWithKnownTokenTypeFunctionConsumer;
struct AngleCSSPrimitiveValueWithCalcWithKnownTokenTypeDimensionConsumer;
struct AngleCSSPrimitiveValueWithCalcWithKnownTokenTypeNumberConsumer;

While the latter CSSPrimitiveValue producing ones can in some cases use the raw value ones,
it is still a lot of unnecessary extra code.

Further more, for each combination of primitive types (e.g. consumePercentOrNumber(...),
we require a consumer struct (PercentOrNumberConsumer) to be declared and manually specified.

This change refactors the consumers so we only require one consume function per-tokentype
per-primitive (so, angle would only need the top three), and combination consumers are
entirely generated based on the inputs.

This is done by having each value specialize the ConsumerDefinition struct, using the
associated "Raw" value struct as the uniqueness token, and declare a single set of token
specific consumers. For instance, for angle the consumer definition is:

    template<> struct ConsumerDefinition<AngleRaw> {
        using type = brigand::list<AngleRaw, UnevaluatedCalc<AngleRaw>>;

        using FunctionToken = AngleKnownTokenTypeFunctionConsumer;
        using DimensionToken = AngleKnownTokenTypeDimensionConsumer;
        using NumberToken = AngleKnownTokenTypeNumberConsumer;
    };

In addition to the per-token consumers, a `type` is also required, which declares the
possible set of return values those consumers can return. In a further refactor this
`type` should go away, as we can compute it at compile time from the consumers. This
structs and the per-token consumer structs are in a new associated header suffixed
with "Definitions.h", as they can bring in more headers than most callers will want,
and can be included very judiciously in only the implementation files than need them.

To consume an angle, a user calls:

    auto result = MetaConsumer<AngleRaw>::consume(range, symbolTable, options);

`result` will have the type `std::variant<AngleRaw, UnevaluatedCalc<AngleRaw>>`
(`UnevaluatedCalc` contains a CSSCalcValue, and exists to make it statically
clear which category of calc was consumed).

To consume an angle or percent, a user calls:

    auto result = MetaConsumer<AngleRaw, PercentRaw>::consume(range, symbolTable, options);

`result` will have the type `std::variant<AngleRaw, UnevaluatedCalc<AngleRaw>, PercentRaw, UnevaluatedCalc<PercentRaw>>`.

These result types are not what callers usually want, so the next step is to
resolve these to either a raw value or generate the appropriate CSSPrimitiveValue
from it. For that, there are two "resolvers", `RawResolver` and `CSSPrimitiveValueResolver`
(they are built using a shared `MetaResolver`). To use them, you follow the same
pattern, passing the result of the MetaConsumer:

   auto raw = RawResolver<AngleRaw, PercentRaw>::resolve(range, symbolTable, options);

Since many of the existing callers want to both consumer and resolve in one shot,
the resolvers have a convenience `consumeAndResolve` function which calls the
MetaConsumer for you.

Currently the resolvers a monolithic. Eventually, we should move them to work
more like the consumers, with type specific resolving happening via specialization.

With this structured approach, we can also remove many of the "consumeFooOrBarOrBaz()"
trampoline functions that were only used by the Color consumer code, and instead the
color consumer calls the MetaConsumer directly using the raw types from the descriptor.

* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/css/calc/CSSCalcSymbolTable.cpp:
(WebCore::CSSCalcSymbolTable::contains const):
* Source/WebCore/css/calc/CSSCalcSymbolTable.h:
* Source/WebCore/css/parser/CSSFontVariantLigaturesParser.h: Renamed from Source/WebCore/css/CSSFontVariantLigaturesParser.h.
(WebCore::CSSFontVariantLigaturesParser::consumeLigature):
(WebCore::CSSFontVariantLigaturesParser::finalizeValue):
* Source/WebCore/css/parser/CSSFontVariantNumericParser.h: Renamed from Source/WebCore/css/CSSFontVariantNumericParser.h.
(WebCore::CSSFontVariantNumericParser::consumeNumeric):
(WebCore::CSSFontVariantNumericParser::finalizeValue):
* Source/WebCore/css/parser/CSSPropertyParser.cpp:
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Angle.cpp:
(WebCore::CSSPropertyParserHelpers::validatedRange):
(WebCore::CSSPropertyParserHelpers::AngleKnownTokenTypeFunctionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::AngleKnownTokenTypeDimensionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::AngleKnownTokenTypeNumberConsumer::consume):
(WebCore::CSSPropertyParserHelpers::consumeAngleRaw):
(WebCore::CSSPropertyParserHelpers::consumeAngle):
(WebCore::CSSPropertyParserHelpers::consumeAngleOrPercent):
(WebCore::CSSPropertyParserHelpers::consumeAngleOrNumberOrNoneRaw):
(WebCore::CSSPropertyParserHelpers::consumeAngleOrNumberOrNoneRawAllowingSymbolTableIdent):
(WebCore::CSSPropertyParserHelpers::consumeAngleOrNumberOrNone):
(WebCore::CSSPropertyParserHelpers::consumeAngleOrNumberOrNoneAllowingSymbolTableIdent):
(WebCore::CSSPropertyParserHelpers::AngleRawKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::AngleRawKnownTokenTypeDimensionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::AngleRawKnownTokenTypeNumberConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::AngleCSSPrimitiveValueWithCalcWithKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::AngleCSSPrimitiveValueWithCalcWithKnownTokenTypeDimensionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::AngleCSSPrimitiveValueWithCalcWithKnownTokenTypeNumberConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::AngleOrNumberRawKnownTokenTypeIdentConsumer::consume): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Angle.h:
(WebCore::CSSPropertyParserHelpers::consumeAngleOrNumberOrNoneRaw): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeAngleOrNumberOrNoneRawAllowingSymbolTableIdent): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+AngleDefinitions.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+Resolution.h.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+CSSPrimitiveValueResolver.cpp: Added.
(WebCore::CSSPropertyParserHelpers::CSSPrimitiveValueResolverBase::resolve):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+CSSPrimitiveValueResolver.h: Added.
(WebCore::CSSPropertyParserHelpers::CSSPrimitiveValueResolverBase::resolve):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Color.cpp:
(WebCore::CSSPropertyParserHelpers::consumeRGBOrHSLLegacyOptionalAlphaRaw):
(WebCore::CSSPropertyParserHelpers::consumeOptionalAlphaRaw):
(WebCore::CSSPropertyParserHelpers::consumeOptionalAlphaRawAllowingSymbolTableIdent):
(WebCore::CSSPropertyParserHelpers::normalizeRGBFunctionComponent):
(WebCore::CSSPropertyParserHelpers::parseRelativeRGBParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeRGBParametersLegacyRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeRGBParametersModernRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeRGBParametersRaw):
(WebCore::CSSPropertyParserHelpers::colorByResolvingHSLComponentsModern):
(WebCore::CSSPropertyParserHelpers::parseRelativeHSLParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeHSLParametersModernRaw):
(WebCore::CSSPropertyParserHelpers::parseRelativeHWBParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeHWBParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseRelativeLabParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeLabParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseRelativeLCHParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeLCHParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseRelativeColorFunctionForRGBTypes):
(WebCore::CSSPropertyParserHelpers::parseColorFunctionForRGBTypesRaw):
(WebCore::CSSPropertyParserHelpers::parseRelativeColorFunctionForXYZTypes):
(WebCore::CSSPropertyParserHelpers::parseColorFunctionForXYZTypesRaw):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Integer.cpp:
(WebCore::CSSPropertyParserHelpers::consumeIntegerTypeRaw):
(WebCore::CSSPropertyParserHelpers::consumeIntegerType):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Integer.h:
(WebCore::CSSPropertyParserHelpers::computeMinimumValue): Deleted.
(WebCore::CSSPropertyParserHelpers::IntegerTypeRawKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::IntegerTypeRawKnownTokenTypeNumberConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::IntegerTypeKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::IntegerTypeKnownTokenTypeNumberConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeIntegerTypeRaw): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeIntegerType): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+IntegerDefinitions.h: Added.
(WebCore::CSSPropertyParserHelpers::IntegerKnownTokenTypeFunctionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::IntegerKnownTokenTypeNumberConsumer::consume):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Length.cpp:
(WebCore::CSSPropertyParserHelpers::validatedRange):
(WebCore::CSSPropertyParserHelpers::LengthKnownTokenTypeFunctionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::LengthKnownTokenTypeDimensionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::LengthKnownTokenTypeNumberConsumer::consume):
(WebCore::CSSPropertyParserHelpers::consumeLength):
(WebCore::CSSPropertyParserHelpers::consumeLengthOrPercentRaw):
(WebCore::CSSPropertyParserHelpers::consumeLengthOrPercent):
(WebCore::CSSPropertyParserHelpers::validatedLengthRaw): Deleted.
(WebCore::CSSPropertyParserHelpers::LengthRawKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::LengthRawKnownTokenTypeDimensionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::LengthRawKnownTokenTypeNumberConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::LengthCSSPrimitiveValueWithCalcWithKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::LengthCSSPrimitiveValueWithCalcWithKnownTokenTypeDimensionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::LengthCSSPrimitiveValueWithCalcWithKnownTokenTypeNumberConsumer::consume): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Length.h:
(WebCore::CSSPropertyParserHelpers::shouldAcceptUnitlessValue): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+LengthDefinitions.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+Resolution.h.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Meta.h: Removed.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+MetaConsumer.h: Added.
(WebCore::CSSPropertyParserHelpers::MetaConsumerUnroller::consume):
(WebCore::CSSPropertyParserHelpers::MetaConsumer::consume):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+MetaConsumerDefinitions.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+None.cpp.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+MetaResolver.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+None.h.
(WebCore::CSSPropertyParserHelpers::MetaResolver::resolve):
(WebCore::CSSPropertyParserHelpers::MetaResolver::consumeAndResolve):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+MetaTransformer.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+None.h.
(WebCore::CSSPropertyParserHelpers::transformRaw):
(WebCore::CSSPropertyParserHelpers::RawVariantTransformerBase::transform):
(WebCore::CSSPropertyParserHelpers::PercentOrNumberDividedBy100Transformer::transform):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+None.cpp:
(WebCore::CSSPropertyParserHelpers::validatedNoneRaw):
(WebCore::CSSPropertyParserHelpers::NoneKnownTokenTypeIdentConsumer::consume):
(WebCore::CSSPropertyParserHelpers::NoneRawKnownTokenTypeIdentConsumer::consume): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+None.h:
* Source/WebCore/css/parser/CSSPropertyParserConsumer+NoneDefinitions.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+None.h.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Number.cpp:
(WebCore::CSSPropertyParserHelpers::validatedRange):
(WebCore::CSSPropertyParserHelpers::NumberKnownTokenTypeFunctionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::NumberKnownTokenTypeNumberConsumer::consume):
(WebCore::CSSPropertyParserHelpers::consumeNumberRaw):
(WebCore::CSSPropertyParserHelpers::consumeNumber):
(WebCore::CSSPropertyParserHelpers::consumeNumberOrNoneRaw):
(WebCore::CSSPropertyParserHelpers::validatedNumberRaw): Deleted.
(WebCore::CSSPropertyParserHelpers::NumberRawKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::NumberRawKnownTokenTypeNumberConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::NumberRawKnownTokenTypeIdentConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::NumberCSSPrimitiveValueWithCalcWithKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::NumberCSSPrimitiveValueWithCalcWithKnownTokenTypeNumberConsumer::consume): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Number.h:
(WebCore::CSSPropertyParserHelpers::consumeNumberOrNoneRaw): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+NumberDefinitions.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+None.h.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Percent.cpp:
(WebCore::CSSPropertyParserHelpers::validatedRange):
(WebCore::CSSPropertyParserHelpers::PercentKnownTokenTypeFunctionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::PercentKnownTokenTypePercentConsumer::consume):
(WebCore::CSSPropertyParserHelpers::consumePercentRaw):
(WebCore::CSSPropertyParserHelpers::consumePercent):
(WebCore::CSSPropertyParserHelpers::consumePercentOrNumber):
(WebCore::CSSPropertyParserHelpers::consumePercentDividedBy100OrNumber):
(WebCore::CSSPropertyParserHelpers::consumePercentOrNumberOrNone):
(WebCore::CSSPropertyParserHelpers::consumePercentOrNumberOrNoneAllowingSymbolTableIdent):
(WebCore::CSSPropertyParserHelpers::consumePercentOrNumberRaw):
(WebCore::CSSPropertyParserHelpers::consumePercentOrNumberOrNoneRaw):
(WebCore::CSSPropertyParserHelpers::consumePercentOrNumberOrNoneRawAllowingSymbolTableIdent):
(WebCore::CSSPropertyParserHelpers::consumePercentOrNoneRaw):
(WebCore::CSSPropertyParserHelpers::validatedPercentRaw): Deleted.
(WebCore::CSSPropertyParserHelpers::PercentRawKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::PercentRawKnownTokenTypePercentConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::PercentRawKnownTokenTypeIdentConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::PercentCSSPrimitiveValueWithCalcWithKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::PercentCSSPrimitiveValueWithCalcWithKnownTokenTypePercentConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::NumberOrPercentRawKnownTokenTypeIdentConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeNumberOrPercent): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Percent.h:
(WebCore::CSSPropertyParserHelpers::consumeNumberOrPercentRaw): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeNumberOrPercentOrNoneRaw): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeNumberOrPercentOrNoneRawAllowingSymbolTableIdent): Deleted.
(WebCore::CSSPropertyParserHelpers::consumePercentOrNoneRaw): Deleted.
(WebCore::CSSPropertyParserHelpers::consumePercentOrNoneRawAllowingSymbolTableIdent): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+PercentDefinitions.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+None.h.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Primitives.cpp:
(WebCore::CSSPropertyParserHelpers::shouldAcceptUnitlessValue):
(WebCore::CSSPropertyParserHelpers::equal):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Primitives.h:
(WebCore::CSSPropertyParserHelpers::UnevaluatedCalc::operator==):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+RawResolver.cpp: Added.
(WebCore::CSSPropertyParserHelpers::RawResolverBase::resolve):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+RawResolver.h: Added.
(WebCore::CSSPropertyParserHelpers::RawResolverBase::resolve):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+RawTypes.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+Primitives.h.
(WebCore::CSSPropertyParserHelpers::computeMinimumValue):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Resolution.cpp:
(WebCore::CSSPropertyParserHelpers::validatedRange):
(WebCore::CSSPropertyParserHelpers::ResolutionKnownTokenTypeFunctionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::ResolutionKnownTokenTypeDimensionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::consumeResolution):
(WebCore::CSSPropertyParserHelpers::ResolutionCSSPrimitiveValueWithCalcWithKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::ResolutionCSSPrimitiveValueWithCalcWithKnownTokenTypeDimensionConsumer::consume): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Resolution.h:
* Source/WebCore/css/parser/CSSPropertyParserConsumer+ResolutionDefinitions.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+None.h.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Symbol.cpp: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+None.cpp.
(WebCore::CSSPropertyParserHelpers::validatedRange):
(WebCore::CSSPropertyParserHelpers::SymbolKnownTokenTypeIdentConsumer::consume):
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Symbol.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+None.cpp.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+SymbolDefinitions.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+None.h.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Time.cpp:
(WebCore::CSSPropertyParserHelpers::validatedRange):
(WebCore::CSSPropertyParserHelpers::TimeKnownTokenTypeFunctionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::TimeKnownTokenTypeDimensionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::TimeKnownTokenTypeNumberConsumer::consume):
(WebCore::CSSPropertyParserHelpers::consumeTime):
(WebCore::CSSPropertyParserHelpers::TimeCSSPrimitiveValueWithCalcWithKnownTokenTypeFunctionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::TimeCSSPrimitiveValueWithCalcWithKnownTokenTypeDimensionConsumer::consume): Deleted.
(WebCore::CSSPropertyParserHelpers::TimeCSSPrimitiveValueWithCalcWithKnownTokenTypeNumberConsumer::consume): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Time.h:
* Source/WebCore/css/parser/CSSPropertyParserConsumer+TimeDefinitions.h: Copied from Source/WebCore/css/parser/CSSPropertyParserConsumer+Resolution.h.
* Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:
(WebCore::CSSPropertyParserHelpers::ImageSetTypeFunctionRawKnownTokenTypeFunctionConsumer::consume):
(WebCore::CSSPropertyParserHelpers::consumeImageSetResolutionOrTypeFunction):
(WebCore::CSSPropertyParserHelpers::consumeFontWeightNumberRaw):
(WebCore::CSSPropertyParserHelpers::consumeStringRaw):
(WebCore::CSSPropertyParserHelpers::consumeDeprecatedGradientColorStop):
(WebCore::CSSPropertyParserHelpers::consumeCrossFade):
(WebCore::CSSPropertyParserHelpers::consumeImageSetOption):
(WebCore::CSSPropertyParserHelpers::consumeNumbersOrPercents):
(WebCore::CSSPropertyParserHelpers::consumeTransformFunction):
(WebCore::CSSPropertyParserHelpers::consumeScale):
(WebCore::CSSPropertyParserHelpers::ImageSetTypeCSSPrimitiveValueKnownTokenTypeFunctionConsumer::consume): Deleted.
* Source/WebCore/css/parser/CSSPropertyParserHelpers.h:

Canonical link: https://commits.webkit.org/278519@main
  • Loading branch information
weinig authored and Sam Weinig committed May 8, 2024
1 parent 108a035 commit 2786239
Show file tree
Hide file tree
Showing 53 changed files with 2,340 additions and 1,690 deletions.
3 changes: 3 additions & 0 deletions Source/WebCore/Sources.txt
Original file line number Diff line number Diff line change
Expand Up @@ -976,6 +976,7 @@ css/parser/CSSParserToken.cpp
css/parser/CSSParserTokenRange.cpp
css/parser/CSSPropertyParser.cpp
css/parser/CSSPropertyParserConsumer+Angle.cpp
css/parser/CSSPropertyParserConsumer+CSSPrimitiveValueResolver.cpp
css/parser/CSSPropertyParserConsumer+Color.cpp
css/parser/CSSPropertyParserConsumer+Ident.cpp
css/parser/CSSPropertyParserConsumer+Integer.cpp
Expand All @@ -984,7 +985,9 @@ css/parser/CSSPropertyParserConsumer+None.cpp
css/parser/CSSPropertyParserConsumer+Number.cpp
css/parser/CSSPropertyParserConsumer+Percent.cpp
css/parser/CSSPropertyParserConsumer+Primitives.cpp
css/parser/CSSPropertyParserConsumer+RawResolver.cpp
css/parser/CSSPropertyParserConsumer+Resolution.cpp
css/parser/CSSPropertyParserConsumer+Symbol.cpp
css/parser/CSSPropertyParserConsumer+Time.cpp
css/parser/CSSPropertyParserHelpers.cpp
css/parser/CSSPropertyParserWorkerSafe.cpp
Expand Down
418 changes: 210 additions & 208 deletions Source/WebCore/WebCore.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions Source/WebCore/css/calc/CSSCalcSymbolTable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,9 @@ std::optional<CSSCalcSymbolTable::Value> CSSCalcSymbolTable::get(CSSValueID valu
return {{ it->value.first, it->value.second }};
}

bool CSSCalcSymbolTable::contains(CSSValueID valueID) const
{
return m_table.contains(valueID);
}

}
1 change: 1 addition & 0 deletions Source/WebCore/css/calc/CSSCalcSymbolTable.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ class CSSCalcSymbolTable : public CanMakeSingleThreadWeakPtr<CSSCalcSymbolTable>
CSSCalcSymbolTable(std::initializer_list<std::tuple<CSSValueID, CSSUnitType, double>>);

std::optional<Value> get(CSSValueID) const;
bool contains(CSSValueID) const;

private:
HashMap<CSSValueID, std::pair<CSSUnitType, double>> m_table;
Expand Down
183 changes: 131 additions & 52 deletions Source/WebCore/css/color/CSSColorDescriptors.h

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions Source/WebCore/css/parser/CSSCalcParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@
namespace WebCore {
namespace CSSPropertyParserHelpers {

CalcParser::CalcParser(CSSParserTokenRange& range, CalculationCategory destinationCategory, ValueRange valueRange, const CSSCalcSymbolTable& symbolTable, NegativePercentagePolicy negativePercentagePolicy)
CalcParser::CalcParser(CSSParserTokenRange& range, CalculationCategory destinationCategory, const CSSCalcSymbolTable& symbolTable, CSSPropertyParserOptions options)
: m_sourceRange(range)
, m_range(range)
{
auto functionId = range.peek().functionId();
if (CSSCalcValue::isCalcFunction(functionId))
m_value = CSSCalcValue::create(functionId, consumeFunction(m_range), destinationCategory, valueRange, symbolTable, negativePercentagePolicy == NegativePercentagePolicy::Allow);
m_value = CSSCalcValue::create(functionId, consumeFunction(m_range), destinationCategory, options.valueRange, symbolTable, options.negativePercentage == NegativePercentagePolicy::Allow);
}

RefPtr<CSSPrimitiveValue> CalcParser::consumeValue()
Expand All @@ -58,12 +58,12 @@ RefPtr<CSSPrimitiveValue> CalcParser::consumeValueIfCategory(CalculationCategory
return consumeValue();
}

bool canConsumeCalcValue(CalculationCategory category, CSSParserMode parserMode)
bool canConsumeCalcValue(CalculationCategory category, CSSPropertyParserOptions options)
{
if (category == CalculationCategory::Length || category == CalculationCategory::Percent || category == CalculationCategory::PercentLength)
return true;

if (parserMode != SVGAttributeMode)
if (options.parserMode != SVGAttributeMode)
return false;

if (category == CalculationCategory::Number || category == CalculationCategory::PercentNumber)
Expand All @@ -72,15 +72,15 @@ bool canConsumeCalcValue(CalculationCategory category, CSSParserMode parserMode)
return false;
}

RefPtr<CSSCalcValue> consumeCalcRawWithKnownTokenTypeFunction(CSSParserTokenRange& range, CalculationCategory category, const CSSCalcSymbolTable& symbolTable, ValueRange valueRange)
RefPtr<CSSCalcValue> consumeCalcRawWithKnownTokenTypeFunction(CSSParserTokenRange& range, CalculationCategory category, const CSSCalcSymbolTable& symbolTable, CSSPropertyParserOptions options)
{
ASSERT(range.peek().type() == FunctionToken);

auto functionId = range.peek().functionId();
if (!CSSCalcValue::isCalcFunction(functionId))
return nullptr;

RefPtr calcValue = CSSCalcValue::create(functionId, consumeFunction(range), category, valueRange, symbolTable);
RefPtr calcValue = CSSCalcValue::create(functionId, consumeFunction(range), category, options.valueRange, symbolTable);
if (calcValue && calcValue->category() == category)
return calcValue;

Expand Down
9 changes: 3 additions & 6 deletions Source/WebCore/css/parser/CSSCalcParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,13 @@ namespace WebCore {
class CSSCalcSymbolTable;
class CSSPrimitiveValue;

enum CSSParserMode : uint8_t;

enum class CalculationCategory : uint8_t;
enum class ValueRange : uint8_t;

namespace CSSPropertyParserHelpers {

class CalcParser {
public:
explicit CalcParser(CSSParserTokenRange&, CalculationCategory, ValueRange, const CSSCalcSymbolTable&, NegativePercentagePolicy = NegativePercentagePolicy::Forbid);
explicit CalcParser(CSSParserTokenRange&, CalculationCategory, const CSSCalcSymbolTable&, CSSPropertyParserOptions);

const CSSCalcValue* value() const { return m_value.get(); }

Expand All @@ -57,8 +54,8 @@ class CalcParser {
RefPtr<CSSCalcValue> m_value;
};

bool canConsumeCalcValue(CalculationCategory, CSSParserMode);
RefPtr<CSSCalcValue> consumeCalcRawWithKnownTokenTypeFunction(CSSParserTokenRange&, CalculationCategory, const CSSCalcSymbolTable&, ValueRange);
bool canConsumeCalcValue(CalculationCategory, CSSPropertyParserOptions);
RefPtr<CSSCalcValue> consumeCalcRawWithKnownTokenTypeFunction(CSSParserTokenRange&, CalculationCategory, const CSSCalcSymbolTable&, CSSPropertyParserOptions);

}
}
18 changes: 10 additions & 8 deletions Source/WebCore/css/parser/CSSPropertyParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
#include "CSSPropertyParserConsumer+Integer.h"
#include "CSSPropertyParserConsumer+Length.h"
#include "CSSPropertyParserConsumer+List.h"
#include "CSSPropertyParserConsumer+Number.h"
#include "CSSPropertyParserConsumer+Percent.h"
#include "CSSPropertyParserConsumer+Resolution.h"
#include "CSSPropertyParserConsumer+Time.h"
#include "CSSPropertyParsing.h"
Expand Down Expand Up @@ -354,25 +356,25 @@ std::pair<RefPtr<CSSValue>, CSSCustomPropertySyntax::Type> CSSPropertyParser::co
auto consumeSingleValue = [&](auto& range, auto& component) -> RefPtr<CSSValue> {
switch (component.type) {
case CSSCustomPropertySyntax::Type::Length:
return consumeLength(range, m_context.mode, ValueRange::All);
return consumeLength(range, m_context.mode);
case CSSCustomPropertySyntax::Type::LengthPercentage:
return consumeLengthOrPercent(range, m_context.mode, ValueRange::All);
return consumeLengthOrPercent(range, m_context.mode);
case CSSCustomPropertySyntax::Type::CustomIdent:
if (RefPtr value = consumeCustomIdent(range)) {
if (component.ident.isNull() || value->stringValue() == component.ident)
return value;
}
return nullptr;
case CSSCustomPropertySyntax::Type::Percentage:
return consumePercent(range, ValueRange::All);
return consumePercent(range);
case CSSCustomPropertySyntax::Type::Integer:
return consumeInteger(range);
case CSSCustomPropertySyntax::Type::Number:
return consumeNumber(range, ValueRange::All);
return consumeNumber(range);
case CSSCustomPropertySyntax::Type::Angle:
return consumeAngle(range, m_context.mode);
case CSSCustomPropertySyntax::Type::Time:
return consumeTime(range, m_context.mode, ValueRange::All);
return consumeTime(range, m_context.mode);
case CSSCustomPropertySyntax::Type::Resolution:
return consumeResolution(range);
case CSSCustomPropertySyntax::Type::Color:
Expand Down Expand Up @@ -1707,12 +1709,12 @@ static RefPtr<CSSValue> consumeAnimationValueForShorthand(CSSPropertyID property
switch (property) {
case CSSPropertyAnimationDelay:
case CSSPropertyTransitionDelay:
return consumeTime(range, context.mode, ValueRange::All, UnitlessQuirk::Forbid);
return consumeTime(range, context.mode);
case CSSPropertyAnimationDirection:
return CSSPropertyParsing::consumeSingleAnimationDirection(range);
case CSSPropertyAnimationDuration:
case CSSPropertyTransitionDuration:
return consumeTime(range, context.mode, ValueRange::NonNegative, UnitlessQuirk::Forbid);
return consumeTime(range, context.mode, ValueRange::NonNegative);
case CSSPropertyAnimationFillMode:
return CSSPropertyParsing::consumeSingleAnimationFillMode(range);
case CSSPropertyAnimationIterationCount:
Expand Down Expand Up @@ -2421,7 +2423,7 @@ bool CSSPropertyParser::consumeTransformOrigin(bool important)
if (auto resultXY = consumeOneOrTwoValuedPositionCoordinates(m_range, m_context.mode, UnitlessQuirk::Forbid)) {
m_range.consumeWhitespace();
bool atEnd = m_range.atEnd();
auto resultZ = consumeLength(m_range, m_context.mode, ValueRange::All);
auto resultZ = consumeLength(m_range, m_context.mode);
if ((!resultZ && !atEnd) || !m_range.atEnd())
return false;
addProperty(CSSPropertyTransformOriginX, CSSPropertyTransformOrigin, WTFMove(resultXY->x), important);
Expand Down
115 changes: 48 additions & 67 deletions Source/WebCore/css/parser/CSSPropertyParserConsumer+Angle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,125 +24,106 @@

#include "config.h"
#include "CSSPropertyParserConsumer+Angle.h"
#include "CSSPropertyParserConsumer+Length.h"
#include "CSSPropertyParserConsumer+AngleDefinitions.h"

#include "CSSCalcParser.h"
#include "CSSCalcSymbolTable.h"
#include "CSSCalcValue.h"
#include "CSSPropertyParserConsumer+CSSPrimitiveValueResolver.h"
#include "CSSPropertyParserConsumer+MetaConsumer.h"
#include "CSSPropertyParserConsumer+PercentDefinitions.h"
#include "CSSPropertyParserConsumer+RawResolver.h"

namespace WebCore {
namespace CSSPropertyParserHelpers {

// MARK: Angle (raw)
std::optional<AngleRaw> validatedRange(AngleRaw value, CSSPropertyParserOptions options)
{
if (options.valueRange == ValueRange::NonNegative && value.value < 0)
return std::nullopt;
return value;
}

std::optional<AngleRaw> AngleRawKnownTokenTypeFunctionConsumer::consume(CSSParserTokenRange& range, const CSSCalcSymbolTable& symbolTable, ValueRange valueRange, CSSParserMode, UnitlessQuirk, UnitlessZeroQuirk)
std::optional<UnevaluatedCalc<AngleRaw>> AngleKnownTokenTypeFunctionConsumer::consume(CSSParserTokenRange& range, const CSSCalcSymbolTable& symbolTable, CSSPropertyParserOptions options)
{
auto rangeCopy = range;
if (RefPtr value = consumeCalcRawWithKnownTokenTypeFunction(rangeCopy, CalculationCategory::Angle, symbolTable, valueRange)) {
if (RefPtr value = consumeCalcRawWithKnownTokenTypeFunction(rangeCopy, CalculationCategory::Angle, symbolTable, options)) {
range = rangeCopy;
return { { value->primitiveType(), value->doubleValue() } };
return {{ value.releaseNonNull() }};
}
return std::nullopt;
}

std::optional<AngleRaw> AngleRawKnownTokenTypeDimensionConsumer::consume(CSSParserTokenRange& range, const CSSCalcSymbolTable&, ValueRange, CSSParserMode, UnitlessQuirk, UnitlessZeroQuirk)
std::optional<AngleRaw> AngleKnownTokenTypeDimensionConsumer::consume(CSSParserTokenRange& range, const CSSCalcSymbolTable&, CSSPropertyParserOptions options)
{
ASSERT(range.peek().type() == DimensionToken);

auto unitType = range.peek().unitType();
auto& token = range.peek();

auto unitType = token.unitType();
switch (unitType) {
case CSSUnitType::CSS_DEG:
case CSSUnitType::CSS_RAD:
case CSSUnitType::CSS_GRAD:
case CSSUnitType::CSS_TURN:
return { { unitType, range.consumeIncludingWhitespace().numericValue() } };
default:
break;
default:
return std::nullopt;
}

return std::nullopt;
}

std::optional<AngleRaw> AngleRawKnownTokenTypeNumberConsumer::consume(CSSParserTokenRange& range, const CSSCalcSymbolTable&, ValueRange, CSSParserMode parserMode, UnitlessQuirk unitless, UnitlessZeroQuirk unitlessZero)
{
ASSERT(range.peek().type() == NumberToken);
if (auto validatedValue = validatedRange(AngleRaw { unitType, token.numericValue() }, options)) {
range.consumeIncludingWhitespace();
return validatedValue;
}

if (shouldAcceptUnitlessValue(range.peek().numericValue(), parserMode, unitless, unitlessZero))
return { { CSSUnitType::CSS_DEG, range.consumeIncludingWhitespace().numericValue() } };
return std::nullopt;
}

// MARK: Angle (CSSPrimitiveValue - maintaining calc)

RefPtr<CSSPrimitiveValue> AngleCSSPrimitiveValueWithCalcWithKnownTokenTypeFunctionConsumer::consume(CSSParserTokenRange& range, const CSSCalcSymbolTable& symbolTable, ValueRange valueRange, CSSParserMode, UnitlessQuirk, UnitlessZeroQuirk)
{
ASSERT(range.peek().type() == FunctionToken);

CalcParser parser(range, CalculationCategory::Angle, valueRange, symbolTable);
return parser.consumeValueIfCategory(CalculationCategory::Angle);
}

RefPtr<CSSPrimitiveValue> AngleCSSPrimitiveValueWithCalcWithKnownTokenTypeDimensionConsumer::consume(CSSParserTokenRange& range, const CSSCalcSymbolTable& symbolTable, ValueRange valueRange, CSSParserMode parserMode, UnitlessQuirk unitless, UnitlessZeroQuirk unitlessZero)
{
ASSERT(range.peek().type() == DimensionToken);

if (auto angleRaw = AngleRawKnownTokenTypeDimensionConsumer::consume(range, symbolTable, valueRange, parserMode, unitless, unitlessZero))
return CSSPrimitiveValue::create(angleRaw->value, angleRaw->type);
return nullptr;
}

RefPtr<CSSPrimitiveValue> AngleCSSPrimitiveValueWithCalcWithKnownTokenTypeNumberConsumer::consume(CSSParserTokenRange& range, const CSSCalcSymbolTable& symbolTable, ValueRange valueRange, CSSParserMode parserMode, UnitlessQuirk unitless, UnitlessZeroQuirk unitlessZero)
std::optional<AngleRaw> AngleKnownTokenTypeNumberConsumer::consume(CSSParserTokenRange& range, const CSSCalcSymbolTable&, CSSPropertyParserOptions options)
{
ASSERT(range.peek().type() == NumberToken);

if (auto angleRaw = AngleRawKnownTokenTypeNumberConsumer::consume(range, symbolTable, valueRange, parserMode, unitless, unitlessZero))
return CSSPrimitiveValue::create(angleRaw->value, angleRaw->type);
return nullptr;
}

// MARK: Specialized combination consumers.
auto numericValue = range.peek().numericValue();
if (!shouldAcceptUnitlessValue(numericValue, options))
return std::nullopt;

std::optional<AngleOrNumberRaw> AngleOrNumberRawKnownTokenTypeIdentConsumer::consume(CSSParserTokenRange& range, const CSSCalcSymbolTable& symbolTable, ValueRange, CSSParserMode, UnitlessQuirk, UnitlessZeroQuirk)
{
ASSERT(range.peek().type() == IdentToken);

if (auto variable = symbolTable.get(range.peek().id())) {
switch (variable->type) {
case CSSUnitType::CSS_DEG:
case CSSUnitType::CSS_RAD:
case CSSUnitType::CSS_GRAD:
case CSSUnitType::CSS_TURN:
range.consumeIncludingWhitespace();
return AngleRaw { variable->type, variable->value };

case CSSUnitType::CSS_NUMBER:
range.consumeIncludingWhitespace();
return NumberRaw { variable->value };

default:
break;
}
if (auto validatedValue = validatedRange(AngleRaw { CSSUnitType::CSS_DEG, numericValue }, options)) {
range.consumeIncludingWhitespace();
return validatedValue;
}

return std::nullopt;
}


// MARK: - Consumer functions

std::optional<AngleRaw> consumeAngleRaw(CSSParserTokenRange& range, CSSParserMode parserMode, UnitlessQuirk unitless, UnitlessZeroQuirk unitlessZero)
{
return consumeMetaConsumer<AngleRawConsumer<RawIdentityTransformer<AngleRaw>>>(range, { }, ValueRange::All, parserMode, unitless, unitlessZero);
const auto options = CSSPropertyParserOptions {
.parserMode = parserMode,
.unitless = unitless,
.unitlessZero = unitlessZero
};
return RawResolver<AngleRaw>::consumeAndResolve(range, { }, options);
}

RefPtr<CSSPrimitiveValue> consumeAngle(CSSParserTokenRange& range, CSSParserMode parserMode, UnitlessQuirk unitless, UnitlessZeroQuirk unitlessZero)
{
return consumeMetaConsumer<AngleConsumer>(range, { }, ValueRange::All, parserMode, unitless, unitlessZero);
const auto options = CSSPropertyParserOptions {
.parserMode = parserMode,
.unitless = unitless,
.unitlessZero = unitlessZero
};
return CSSPrimitiveValueResolver<AngleRaw>::consumeAndResolve(range, { }, options);
}

RefPtr<CSSPrimitiveValue> consumeAngleOrPercent(CSSParserTokenRange& range, CSSParserMode parserMode)
{
return consumeMetaConsumer<AngleOrPercentConsumer>(range, { }, ValueRange::All, parserMode, UnitlessQuirk::Forbid, UnitlessZeroQuirk::Allow);
const auto options = CSSPropertyParserOptions {
.parserMode = parserMode,
.unitlessZero = UnitlessZeroQuirk::Allow
};
return CSSPrimitiveValueResolver<AngleRaw, PercentRaw>::consumeAndResolve(range, { }, options);
}

} // namespace CSSPropertyParserHelpers
Expand Down
Loading

0 comments on commit 2786239

Please sign in to comment.