[webkit-changes] [WebKit/WebKit] 2047aa: CSS timing functions should not eagerly evaluate c...
Commit Queue
noreply at github.com
Sun Sep 1 08:47:56 PDT 2024
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 2047aa6f9356073f2eac55f0ea91d31bd024717a
https://github.com/WebKit/WebKit/commit/2047aa6f9356073f2eac55f0ea91d31bd024717a
Author: Sam Weinig <sam at webkit.org>
Date: 2024-09-01 (Sun, 01 Sep 2024)
Changed paths:
M LayoutTests/fast/css/animation-steps-calculated-value-expected.txt
M LayoutTests/fast/css/animation-steps-calculated-value.html
M LayoutTests/imported/w3c/web-platform-tests/css/css-easing/linear-timing-functions-syntax-expected.txt
M LayoutTests/imported/w3c/web-platform-tests/css/css-easing/linear-timing-functions-syntax.html
M LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-computed-expected.txt
M LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-computed.html
M LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-invalid-expected.txt
M LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-invalid.html
M LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-valid-expected.txt
M LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-valid.html
M Source/WTF/wtf/text/TextStream.cpp
M Source/WTF/wtf/text/TextStream.h
M Source/WebCore/Sources.txt
M Source/WebCore/WebCore.xcodeproj/project.pbxproj
M Source/WebCore/animation/AnimationEffect.cpp
M Source/WebCore/animation/AnimationEffect.h
M Source/WebCore/animation/AnimationEffect.idl
M Source/WebCore/animation/CustomEffect.cpp
M Source/WebCore/animation/CustomEffect.h
M Source/WebCore/animation/CustomEffect.idl
M Source/WebCore/animation/DocumentTimeline.cpp
M Source/WebCore/animation/KeyframeEffect.cpp
M Source/WebCore/css/CSSPrimitiveValue.cpp
M Source/WebCore/css/CSSPrimitiveValue.h
M Source/WebCore/css/CSSTimingFunctionValue.cpp
M Source/WebCore/css/CSSTimingFunctionValue.h
M Source/WebCore/css/CSSToStyleMap.cpp
M Source/WebCore/css/CSSToStyleMap.h
M Source/WebCore/css/ComputedStyleExtractor.cpp
M Source/WebCore/css/parser/CSSPropertyParser.cpp
A Source/WebCore/css/parser/CSSPropertyParserConsumer+TimingFunction.cpp
A Source/WebCore/css/parser/CSSPropertyParserConsumer+TimingFunction.h
M Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp
M Source/WebCore/css/parser/CSSPropertyParserHelpers.h
M Source/WebCore/css/process-css-properties.py
M Source/WebCore/platform/animation/TimingFunction.cpp
M Source/WebCore/platform/animation/TimingFunction.h
M Source/WebCore/style/StyleBuilderConverter.h
M Source/WebCore/style/StyleResolver.cpp
Log Message:
-----------
CSS timing functions should not eagerly evaluate calc()
https://bugs.webkit.org/show_bug.cgi?id=278925
Reviewed by Darin Adler.
The CSS timing functions were using the RawResolver to eagerly evaluate calc()
during parsing, which results in incorrect serialization of specified values and
doesn't allow for use of relative lengths in the calculations. Instead, calc()
evaluation should be delayed until style building.
This change updates the timing function CSS values to store unevaluated primitives
and resolve calc() at style building time. It still doesn't allow for use of
relative lengths, as not all call sites can trivially pass in conversion data, so
that is deferred to a follow up.
While making this change, parsing has been extracted into its own file and
resolution to TimingFunction types has been moved out of platform/ (which was a
layering violation) and into CSSTimingFunctionValues.h/cpp. Additionally, a
helper to parse timing functions from strings has been added so that callers
don't have to invoke the entire CSS parser when only timing functions are needed.
* LayoutTests/imported/w3c/web-platform-tests/css/css-easing/linear-timing-functions-syntax-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-easing/linear-timing-functions-syntax.html:
* LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-computed-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-computed.html:
* LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-invalid-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-invalid.html:
* LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-valid-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-easing/timing-functions-syntax-valid.html:
- Update timing function tests with cases that involve calc().
* Source/WTF/wtf/text/TextStream.cpp:
(WTF::TextStream::operator<<):
* Source/WTF/wtf/text/TextStream.h:
- Add support for FormattedCSSNumber to TextStream. Remove
unnecessary allocation when serializing HexNumberBuffer.
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
- Add files: CSSPropertyParserConsumer+TimingFunction.h/cpp
* Source/WebCore/animation/AnimationEffect.cpp:
* Source/WebCore/animation/AnimationEffect.h:
* Source/WebCore/animation/AnimationEffect.idl:
* Source/WebCore/animation/CustomEffect.cpp:
* Source/WebCore/animation/CustomEffect.h:
* Source/WebCore/animation/CustomEffect.idl:
* Source/WebCore/animation/DocumentTimeline.cpp:
* Source/WebCore/animation/KeyframeEffect.cpp:
- Pipe the Document around so that callers switching from
TimingFunction::createFromCSSText to CSSPropertyParserHelpers::parseTimingFunction
can have a valid CSSParserContext. This is important since it dictates if spring()
is allowed or not.
* Source/WebCore/css/CSSPrimitiveValue.cpp:
* Source/WebCore/css/CSSPrimitiveValue.h:
- Add helper, isOne(), to test if the value is exactly 1, returns
std::nullopt for calc() like similar functions.
* Source/WebCore/css/CSSTimingFunctionValue.cpp:
(WebCore::createTimingFunction):
- Move logic from TimingFunction::createFromCSSText to CSSTimingFunctionValue.
This centralizes things and avoids the layering violation.
(WebCore::CSSLinearTimingFunctionValue::createTimingFunction const):
- Rather than running the "create-a-linear-easing-function" at parse time,
which is not possible in the presence of calc(), it is now deferred to
style building time and moved here.
* Source/WebCore/css/CSSTimingFunctionValue.h:
- Store the parsed forms of the parameters to allow late resolution of
calc at style building.
* Source/WebCore/css/CSSToStyleMap.cpp:
* Source/WebCore/css/CSSToStyleMap.h:
- Forward to the new Style::BuilderConverter::convertTimingFunction().
* Source/WebCore/css/ComputedStyleExtractor.cpp:
(WebCore::valueForAnimationTimingFunction):
- Update computed value creation to create the appropriate primitive
value parameters for the easing functions.
* Source/WebCore/css/parser/CSSPropertyParser.cpp:
- Add include for call to consumeTimingFunction.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+TimingFunction.cpp: Added.
* Source/WebCore/css/parser/CSSPropertyParserConsumer+TimingFunction.h: Added.
* Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:
* Source/WebCore/css/parser/CSSPropertyParserHelpers.h:
- Moved consumer implementations from CSSPropertyParserHelpers, and rework
them by removing the eager evaluation of calc via RawResolver.
* Source/WebCore/css/process-css-properties.py:
- Add include for generated callers of consumeTimingFunction().
* Source/WebCore/platform/animation/TimingFunction.cpp:
* Source/WebCore/platform/animation/TimingFunction.h:
(WebCore::TimingFunction::cssText const):
(WebCore::TimingFunction::createFromCSSText): Deleted.
(WebCore::TimingFunction::createFromCSSValue): Deleted.
- Moved code directly dealing with CSS types to CSSTimingFunctionValue.h/cpp.
- The serialization code remains and has been update to match CSS semantics by
using FormattedCSSNumber for numerics. Ideally this would go away as well
with callers using the serialization in CSSTimingFunctionValue, but that is
an existing issue and requires a bit of refactoring that was too much for this
change as is.
* Source/WebCore/style/StyleBuilderConverter.h:
(WebCore::Style::BuilderConverter::convertTimingFunction):
- Add converter for TimingFunction which forwards to createTimingFunction().
* Source/WebCore/style/StyleResolver.cpp:
(WebCore::Style::Resolver::keyframeRulesForName const):
(WebCore::Style::Resolver::keyframeStylesForAnimation):
- Replace use of TimingFunction::createFromCSSValue() with its replacement
createTimingFunction().
Canonical link: https://commits.webkit.org/283036@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