[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