[webkit-changes] [WebKit/WebKit] c05a19: Relative color syntax doesn't work with currentCol...
Sam Weinig
noreply at github.com
Mon May 13 10:17:07 PDT 2024
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: c05a19a495bdffa90ca2c5707c651dee249b6870
https://github.com/WebKit/WebKit/commit/c05a19a495bdffa90ca2c5707c651dee249b6870
Author: Sam Weinig <weinig at apple.com>
Date: 2024-05-13 (Mon, 13 May 2024)
Changed paths:
M LayoutTests/TestExpectations
M LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color-expected.txt
M LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color.html
M LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color-expected.txt
M LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color.html
M LayoutTests/imported/w3c/web-platform-tests/css/support/color-testcommon.js
M Source/WTF/wtf/VectorTraits.h
M Source/WTF/wtf/text/TextStream.h
M Source/WebCore/Sources.txt
M Source/WebCore/WebCore.xcodeproj/project.pbxproj
M Source/WebCore/css/CSSPrimitiveValue.cpp
M Source/WebCore/css/CSSPrimitiveValue.h
M Source/WebCore/css/calc/CSSCalcOperationNode.cpp
M Source/WebCore/css/calc/CSSCalcSymbolNode.cpp
M Source/WebCore/css/calc/CSSCalcSymbolNode.h
A Source/WebCore/css/color/CSSAbsoluteColorResolver.h
A Source/WebCore/css/color/CSSColorConversion+ToColor.h
A Source/WebCore/css/color/CSSColorConversion+ToTypedColor.h
M Source/WebCore/css/color/CSSColorDescriptors.h
A Source/WebCore/css/color/CSSColorMixResolver.cpp
A Source/WebCore/css/color/CSSColorMixResolver.h
A Source/WebCore/css/color/CSSColorMixSerialization.cpp
M Source/WebCore/css/color/CSSColorMixSerialization.h
A Source/WebCore/css/color/CSSRelativeColorResolver.h
A Source/WebCore/css/color/CSSRelativeColorSerialization.cpp
A Source/WebCore/css/color/CSSRelativeColorSerialization.h
R Source/WebCore/css/color/CSSResolvedColorMix.cpp
R Source/WebCore/css/color/CSSResolvedColorMix.h
A Source/WebCore/css/color/CSSUnresolvedAbsoluteColor.cpp
A Source/WebCore/css/color/CSSUnresolvedAbsoluteColor.h
M Source/WebCore/css/color/CSSUnresolvedColor.cpp
M Source/WebCore/css/color/CSSUnresolvedColor.h
A Source/WebCore/css/color/CSSUnresolvedColorHex.cpp
A Source/WebCore/css/color/CSSUnresolvedColorHex.h
A Source/WebCore/css/color/CSSUnresolvedColorKeyword.cpp
A Source/WebCore/css/color/CSSUnresolvedColorKeyword.h
M Source/WebCore/css/color/CSSUnresolvedColorMix.cpp
M Source/WebCore/css/color/CSSUnresolvedColorMix.h
A Source/WebCore/css/color/CSSUnresolvedColorResolutionContext.cpp
A Source/WebCore/css/color/CSSUnresolvedColorResolutionContext.h
M Source/WebCore/css/color/CSSUnresolvedLightDark.cpp
M Source/WebCore/css/color/CSSUnresolvedLightDark.h
A Source/WebCore/css/color/CSSUnresolvedRelativeColor.cpp
A Source/WebCore/css/color/CSSUnresolvedRelativeColor.h
M Source/WebCore/css/color/StyleAbsoluteColor.cpp
M Source/WebCore/css/color/StyleAbsoluteColor.h
M Source/WebCore/css/color/StyleColor.cpp
M Source/WebCore/css/color/StyleColor.h
M Source/WebCore/css/color/StyleColorMix.cpp
M Source/WebCore/css/color/StyleColorMix.h
M Source/WebCore/css/color/StyleCurrentColor.cpp
M Source/WebCore/css/color/StyleCurrentColor.h
A Source/WebCore/css/color/StyleRelativeColor.h
M Source/WebCore/css/parser/CSSPropertyParserConsumer+Color.cpp
M Source/WebCore/css/parser/CSSPropertyParserConsumer+Color.h
A Source/WebCore/css/parser/CSSPropertyParserConsumer+ColorInterpolationMethod.cpp
A Source/WebCore/css/parser/CSSPropertyParserConsumer+ColorInterpolationMethod.h
M Source/WebCore/css/parser/CSSPropertyParserConsumer+RawTypes.cpp
M Source/WebCore/css/parser/CSSPropertyParserConsumer+RawTypes.h
M Source/WebCore/css/parser/CSSPropertyParserConsumer+UnevaluatedCalc.cpp
M Source/WebCore/css/parser/CSSPropertyParserConsumer+UnevaluatedCalc.h
M Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp
M Source/WebCore/css/process-css-properties.py
M Source/WebCore/html/canvas/CanvasStyle.cpp
M Source/WebCore/platform/graphics/ColorSerialization.cpp
M Source/WebCore/platform/graphics/ColorSerialization.h
M Source/WebCore/style/ColorFromPrimitiveValue.cpp
M Source/WebCore/style/ColorFromPrimitiveValue.h
Log Message:
-----------
Relative color syntax doesn't work with currentColor or system colors
https://bugs.webkit.org/show_bug.cgi?id=245970
rdar://problem/100981965
Reviewed by Darin Adler.
Adds support for late resolution of relative colors, matching the
model set by color-mix.
Re-works color parsing to completely split resolution from consuming,
allowing for a single implementation of the parsing code, all returning
CSSUnresolvedColor values. This allows us to delay resolving relative
colors until needed, storing the components first as a CSSUnresolvedRelativeColor
and then a StyleRelativeColor (mirroring CSSUnresolvedColorMix and
StyleColorMix).
* LayoutTests/TestExpectations:
- Removes skips for now passing currentColor tests.
* LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color.html:
- Added tests for currentColor at computed value time.
* LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color.html:
- Updated tests to match spec (and new implementation) which preserves
declared values for declared value serialization of relative colors.
* LayoutTests/imported/w3c/web-platform-tests/css/support/color-testcommon.js:
- Add helper which allows fuzzy testing using a specific property, rather
than always hardcoding it to use "color".
* Source/WTF/wtf/VectorTraits.h:
- Add UniqueRef to the set of smart pointers which get the simple class
traits, needed to use UniqueRef with FixedVector.
* Source/WTF/wtf/text/TextStream.h:
(WTF::streamSizedContainer):
(WTF::operator<<):
- Extract sized container serialization into a helper and use to replace
duplicated implementations. Also add overload for FixedVector.
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
- Add new files.
* Source/WebCore/css/CSSPrimitiveValue.cpp:
* Source/WebCore/css/CSSPrimitiveValue.h:
- Expose number serialization helper to allow identical serialization when
not using CSSPrimitiveValue for numeric values.
* Source/WebCore/css/calc/CSSCalcOperationNode.cpp:
(WebCore::CSSCalcOperationNode::buildCSSTextRecursive):
- Ensure that symbols get serialized when they are part of a calc().
* Source/WebCore/css/calc/CSSCalcSymbolNode.cpp:
* Source/WebCore/css/calc/CSSCalcSymbolNode.h:
(WebCore::CSSCalcSymbolNode::customCSSText const):
- Expose serialization of a symbol node utilizing `nameLiteralForSerialization`.
* Source/WebCore/css/color/CSSAbsoluteColorResolver.h: Added.
- Factor out code to resolve a parsed absolute color into a concrete Color.
* Source/WebCore/css/color/CSSColorConversion+ToColor.h: Added.
- Factor out code to convert a "typed color" into a concrete Color, applying
the rules specified by the descriptor provided.
* Source/WebCore/css/color/CSSColorConversion+ToTypedColor.h: Added.
- Factor out code to convert a "parsed color" into a "typed color", normalizing
values according to the color descriptor provided.
* Source/WebCore/css/color/CSSColorDescriptors.h:
- Moves descriptors out of CSSPropertyParserHelpers, they are now used outside
of that area.
- Add additional helpers for working with the descriptors that compute the
component types at various stages, such as when calc and raw symbols have
not yet been evaluated.
- Add additional per-descriptor data to support serialization of relative
color functions that have not been fully resolved.
* Source/WebCore/css/color/CSSColorMixResolver.cpp: Renamed from Source/WebCore/css/color/CSSResolvedColorMix.cpp.
* Source/WebCore/css/color/CSSColorMixResolver.h: Renamed from Source/WebCore/css/color/CSSResolvedColorMix.h.
- Renamed to follow the same pattern we are using with relative color resolution.
* Source/WebCore/css/color/CSSColorMixSerialization.cpp: Copied from Source/WebCore/css/color/CSSColorMixSerialization.h.
* Source/WebCore/css/color/CSSColorMixSerialization.h:
- Moved a few non-template functions into an implementation file to avoid
unnecessary inlining for non-perf critical code.
* Source/WebCore/css/color/CSSRelativeColorResolver.h: Added.
- Factor out code to resolve a parsed relative color with its origin already
resolved into a concrete Color. Resolution is performed in stages:
1. If any components are raw symbols, replace them with a their value
in the symbol table.
2. If any components are `calc()` values, evaluate the `calc()` passing
the symbol table for any symbolic values they retain.
3. At this point, all the components are raw values of some type (number,
percent, or angle), normalize those raw components into a typed color
(e.g. SRGBA<float>, OKLab<float>, etc.).
4. Wrap the typed color in the type-erased wrapper, Color.
* Source/WebCore/css/color/CSSRelativeColorSerialization.cpp: Added.
* Source/WebCore/css/color/CSSRelativeColorSerialization.h: Added.
- Factor out code to serialize relative colors.
* Source/WebCore/css/color/CSSUnresolvedAbsoluteColor.cpp: Added.
* Source/WebCore/css/color/CSSUnresolvedAbsoluteColor.h: Added.
- Type to represent fully resolved colors that are part of CSSUnresolvedColor tree.
Currently used for absolute color values and the soon to be removed color-contrast().
* Source/WebCore/css/color/CSSUnresolvedColor.cpp:
* Source/WebCore/css/color/CSSUnresolvedColor.h:
- Add all remaining color types to the value variant to represent declared color
values. To retain the enough information for correct resolution of relative
colors, the variant holds a fully specified CSSUnresolvedRelativeColor for each
relative color supported. Hex and Keyword types were also added to allow removing
use of CSSPrimitiveValue in the CSSUnresolvedColor tree. Now, child colors are
represented as UniqueRef<CSSUnresolvedColor>.
- The new createColor() function allows eager resolution of unresolved colors as
needed by the `parseColorRaw()` functions that Canvas uses.
* Source/WebCore/css/color/CSSUnresolvedColorHex.cpp: Added.
* Source/WebCore/css/color/CSSUnresolvedColorHex.h: Added
- Type to represent hex colors in the CSSUnresolvedColor tree.
* Source/WebCore/css/color/CSSUnresolvedColorKeyword.cpp: Added.
* Source/WebCore/css/color/CSSUnresolvedColorKeyword.h: Added.
- Type to represent keyword colors in the CSSUnresolvedColor tree.
* Source/WebCore/css/color/CSSUnresolvedColorMix.cpp:
* Source/WebCore/css/color/CSSUnresolvedColorMix.h:
- Re-worked to remove use of CSSPrimitiveValue representations of mix components,
instead using `UniqueRef<CSSUnresolvedColor>` for the origin colors and
`std::variant<PercentRaw, UnevaluatedCalc<PercentRaw>>` for the percentages.
This preserves the type information and makes these usable in workers without
extensive CSSValuePool piping.
* Source/WebCore/css/color/CSSUnresolvedColorResolutionContext.cpp: Added.
* Source/WebCore/css/color/CSSUnresolvedColorResolutionContext.h: Added.
- Context used by the `parseColorRaw()` functions to resolve colors without
going through the style system. Currently the context contains explicit
values, but if pre-computing these turns out of be expensive, this can
be converted into a delegate to allow lazy evaluation.
* Source/WebCore/css/color/CSSUnresolvedLightDark.cpp:
* Source/WebCore/css/color/CSSUnresolvedLightDark.h:
- Like CSSUnresolvedColorMix, re-worked to remove use of CSSPrimitiveValue.
* Source/WebCore/css/color/CSSUnresolvedRelativeColor.cpp: Added.
* Source/WebCore/css/color/CSSUnresolvedRelativeColor.h: Added.
- Type to represent relative color in the CSSUnresolvedColor tree.
- Uses a color descriptor to define component types and stores the
origin as a UniqueRef<CSSUnresolvedColor>.
- Converts to the new StyleRelativeColor at style resolution time
allowing a currentColor origin value to be preserved as late as
possible.
* Source/WebCore/css/color/StyleColor.cpp:
* Source/WebCore/css/color/StyleColor.h:
- Like CSSUnresolvedColor, the relative color types are added to the
the kind variant, fully specified by color descriptor. One slightly
unfortunate duplication is that all the relative colors require their
own constructor functions in order to keep instantiation of the variant
to the implementation file.
- Like StyleColorMix, the StyleRelativeColor types are stored in UniqueRefs
to avoid bloating the size for the relatively uncommon case of currentColor
as part of the origin.
- Also like StyleColorMix, the StyleRelativeColor types are first checked
to see if they can be resolved, and if so, are stored as absolute colors
instead.
* Source/WebCore/css/color/StyleColorMix.cpp:
* Source/WebCore/css/color/StyleColorMix.h:
- Use PercentRaw for the Percentage to allow for clearer serialization.
- Factor out check if the origin is absolute into a function to match
relative color.
- Sort functions to match other style color types.
* Source/WebCore/css/color/StyleCurrentColor.cpp:
* Source/WebCore/css/color/StyleCurrentColor.h:
- Sort functions to match other style color types.
* Source/WebCore/css/color/StyleRelativeColor.h: Added.
- Type to represent relative colors in the StyleColor tree.
- Utilizes code shared with CSSUnresolvedRelativeColor for resolution
and serialization.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Color.cpp:
* Source/WebCore/css/parser/CSSPropertyParserConsumer+Color.h:
- Major rework of the parsing logic. Big takeaways:
- Only does the consuming now, resolution has all been moved to
other files.
- Only one set of consumer functions, all working to return a
CSSUnresolvedColor value. Now more separate normal vs raw
distinction outside of exposed functions. The exposed functions
consume the CSSUnresolvedColor, and resolve it to either
a CSSPrimitiveValue or a raw Color.
- ColorInterpolationMethod consuming was moved to its own
file to continue to split things up.
- Exposed functions have been merged where possible, with all
now taking CSSColorParsingOptions, and all the raw functions
also taking a CSSUnresolvedColorResolutionContext.
- All the functions are now equally worker safe (or at least
as worker safe as the one labeled worker safe used to be),
so the worker safe exposed function has been removed.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+ColorInterpolationMethod.cpp: Added.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+ColorInterpolationMethod.h: Added.
Moved from CSSPropertyParserConsumer+Color.h/cpp.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+RawTypes.cpp:
* Source/WebCore/css/parser/CSSPropertyParserConsumer+RawTypes.h:
- Added serialization of raw types, used generically by the relative color
and color mix serialization code.
- Removed a number of FooOrBarRaw type definitions that were only used by
the old color parsing code.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+UnevaluatedCalc.cpp:
* Source/WebCore/css/parser/CSSPropertyParserConsumer+UnevaluatedCalc.h:
- Added serialization of UnevaluatedCalc, used generically by the relative color
and color mix serialization code.
* Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:
(WebCore::CSSPropertyParserHelpers::consumeBorderColor):
(WebCore::CSSPropertyParserHelpers::consumeFontPaletteValuesOverrideColors):
- Switched to use the CSSColorParsingOptions when calling consumeColor allowing us
to remove overload.
* Source/WebCore/css/process-css-properties.py:
- Switched to use the CSSColorParsingOptions when calling consumeColor allowing us
to remove overload.
* Source/WebCore/html/canvas/CanvasStyle.cpp:
- Switched to use the plain parseColorRaw with "System" colors not in the allow set,
rather than worker safe variant, since they are both the same now.
- Removed hsl clamp opt setting, as that has been a no-op for a bit now.
* Source/WebCore/platform/graphics/ColorSerialization.cpp:
* Source/WebCore/platform/graphics/ColorSerialization.h:
- Expose serialization of the color space names for use by relative color serialization.
* Source/WebCore/style/ColorFromPrimitiveValue.cpp:
* Source/WebCore/style/ColorFromPrimitiveValue.h:
- Factor out conversion from CSS value keyword to StyleColor into its own function
for use by CSSUnresolvedColorKeyword.
Canonical link: https://commits.webkit.org/278696@main
To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications
More information about the webkit-changes
mailing list