Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 8ffb76a8529413df5a14343f91fd615271befdc7
      
https://github.com/WebKit/WebKit/commit/8ffb76a8529413df5a14343f91fd615271befdc7
  Author: Antti Koivisto <[email protected]>
  Date:   2026-07-08 (Wed, 08 Jul 2026)

  Changed paths:
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-mixins/function-parameter-types.tentative-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-mixins/local-if-substitution-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-if-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-conditionals-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-conditionals.html
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-cycle-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-function-revert-rule-expected.txt
 
M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-initial-unregistered-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-invalidation-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-media-invalidation-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-style-invalidation-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-supports-quirks-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/inherit-function-basic-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-if.tentative-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/viewport-units-scroll-no-cycles-001.tentative-expected.txt
    M Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml
    M Source/WebCore/Sources.txt
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    M
Source/WebCore/css/CSSValueKeywords.in
    M Source/WebCore/css/parser/CSSParserContext.cpp
    M Source/WebCore/css/parser/CSSParserContext.h
    M Source/WebCore/css/parser/CSSSubstitutionParser.cpp
    M Source/WebCore/css/parser/CSSSupportsParser.h
    A Source/WebCore/style/IfConditionEvaluator.cpp
    A Source/WebCore/style/IfConditionEvaluator.h
    M Source/WebCore/style/StyleSubstitutionResolver.cpp
    M Source/WebCore/style/StyleSubstitutionResolver.h

  Log Message:
  -----------
  [css-values-5] Implement if() arbitrary substitution function
https://bugs.webkit.org/show_bug.cgi?id=296995
rdar://158221024

Reviewed by Sam Weinig.

"The if() function is an arbitrary substitution function that represents 
conditional values. Its argument
consists of an ordered semi-colon–separated list of statements, each consisting 
of a condition followed by
a colon followed by a value. An if() function represents the value 
corresponding to the first condition in
its
argument list to be true; if no condition matches, then the if() function 
represents an empty token stream."

https://drafts.csswg.org/css-values-5/#if-notation

For example:

color: if(style(--foo > 100px): red; else: blue);

At parse time if() is validated only against a very permissive argument grammar.

The actual logic is in Style::SubstitutionResolver and runs from style builder. 
The condition in each branch
is evaluated using IfConditionEvaluator until one matches. The if() function is 
then substituted with the
content tokens of that branch.

* 
LayoutTests/imported/w3c/web-platform-tests/css/css-mixins/function-parameter-types.tentative-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-mixins/local-if-substitution-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-if-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-conditionals-expected.txt:
*
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-cycle-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-function-revert-rule-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-initial-unregistered-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-invalidation-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-media-invalidation-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-style-invalidation-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-supports-quirks-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/inherit-function-basic-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-if.tentative-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-values/viewport-units-scroll-no-cycles-001.tentative-expected.txt:

PASS->FAIL
cases were spurious passes in feature interaction tests.

* Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml:
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/css/CSSValueKeywords.in:
* Source/WebCore/css/parser/CSSParserContext.cpp:
(WebCore::add):
* Source/WebCore/css/parser/CSSParserContext.h:
* Source/WebCore/css/parser/CSSSubstitutionParser.cpp:
(WebCore::classifyBlock):

Validate according to argument grammar.

(WebCore::isValidIfReference):
* Source/WebCore/style/IfConditionEvaluator.cpp: Added.
(WebCore::Style::IfConditionEvaluator::evaluate):
(WebCore::Style::IfConditionEvaluator::evaluateQueryInParens const):
(WebCore::Style::IfConditionEvaluator::evaluateFeature const):
* Source/WebCore/style/IfConditionEvaluator.h: Added.
(WebCore::Style::IfConditionEvaluator::IfConditionEvaluator):

Introduce IfConditionEvaluator for evaluating the condition. It uses the 
existing container query
machinery.

* Source/WebCore/style/StyleSubstitutionResolver.cpp:
(WebCore::Style::SubstitutionResolver::substituteIfArgumentGrammar):
(WebCore::Style::SubstitutionResolver::substituteIfFunction):

Pick a branch to substitute based on evaluation result.

(WebCore::Style::SubstitutionResolver::substituteTokenRange):
* Source/WebCore/style/StyleSubstitutionResolver.h:

Canonical link: 
https://flagged.apple.com:443/proxy?t2=Df8Q5z4uZ8&o=aHR0cHM6Ly9jb21taXRzLndlYmtpdC5vcmcvMzE2NzUyQG1haW4=&emid=50483cb3-9580-4531-aa89-08e74d43a804&c=11



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to