LGTM1

And now I've learned about impossible things you can (or could) do with CSS. I'm not sure that was a good thing.

/Daniel

On 2025-05-07 11:12, Anders Hartvoll Ruud wrote:


        Contact emails

andr...@chromium.org


        Explainer


When designing the if() <https://drafts.csswg.org/css-values-5/#if-notation>function, we (CSSWG) decided to make it short-circuiting <https://github.com/w3c/csswg-drafts/issues/11500>, such that we can stop evaluation once a matching condition is found, for example:


if(cheap-test1(): 10px;

    cheap-test2(): 42px;

    else: --expensive())


In the above, if cheap-test1()evaluates to “true” (let’s say), then we can avoid considering the cheap-test2()and “else” branches entirely, and avoid potentially expensive calculations that are not needed.


For consistency, we resolved on doing this for allsubstitution functions. This affects three substitution functions which are already shipped: var(), attr(), and env(). For these functions (using var()as an example), there can at most be two “branches”: the main value branch, which fetches the value of a custom property, and the /fallback/:


color: var(--my-color, black);


In the above, color becomes whatever --my-coloris. If --my-colordoes not exist, color becomes black(the fallback) instead.


Today, we need to evaluate the contents of the fallback even when --my-coloractually exists. This is because the spec requires us to look for cycles in that fallback:


--green: green;

--blue: blue;

--a: var(--green, var(--b));

--b: var(--blue, var(--a));


Even if --greenand --blueboth exist, --aand --bend up invalid here. This is because a cycle exists via the fallbacks.


This intent changes this: we now only care about the fallback when we’re actually using the fallback.


        Specification


https://drafts.csswg.org/css-variables-1/#replace-a-var-function <https://drafts.csswg.org/css-variables-1/#replace-a-var-function>

https://drafts.csswg.org/css-values-5/#cyclic-substitution-contexts <https://drafts.csswg.org/css-values-5/#cyclic-substitution-contexts>



        Summary

When the fallback is not taken, var()/attr() functions evaluate without looking for cycles in that fallback.



        Blink component

Blink>CSS <https://issues.chromium.org/issues?q=customfield1222907:%22Blink%3ECSS%22>


        TAG review

None


        TAG review status

Not applicable


        Risks



        Interoperability and Compatibility


In theory, three functions are affected by this: var(), attr(), and env(). However, it turns out that env()already had the desired behavior in Blink, so we can disregard that. I have added use-counters for the two others:


CSSVarFallbackCycle <https://chromestatus.com/metrics/feature/timeline/popularity/5334>- approximately 0.01%(of page views)

CSSAttrFallbackCycle <https://chromestatus.com/metrics/feature/timeline/popularity/5335>- approximately 0%(of page views)


The attr()function (in its current form) was shipped very recently, and we can discard this as well given the 0%.


This leaves the var()function. The primary concern here stems from Roman’s terrible (but excellent) Indirect Cyclic Conditions: Prototyping Parametrized CSS Mixins <https://kizu.dev/indirect-cyclic-conditions/>technique, which relies on the current non-short-circuiting cycle detection behavior. If authors had actually started using this technique widely, then we would be stuck with the current behavior for var().


I investigated this more deeply using HTTP Archive: Short-circuiting var() & attr() compat investigation <https://docs.google.com/document/d/1qHOZr5PK9WQWZtPIQvmAqps74pyjMyZ7uOvqq6MxyZs/edit?usp=sharing>(summary below).


Summary:I queried HTTP Archive using the recommended methods, and found 70655 pages triggering the counter. 96% of these hits were confirmed to be the same case (the substack.com <http://substack.com> case). The impact of this intent on that case seems to be somewhere between “zero and cosmetic”. In fact, ~all the cases seem to follow a pattern of --x:var(--reasonable-value, --x)(i.e. using yourself as the fallback), which means this intent now just yields --reasonable-valueinstead of “invalid”.


An exception to this is four URLs from kizu.dev <http://kizu.dev> (Roman’s blog), which clearly stand out in the data. However, Roman (“kizu”) actively participated <https://github.com/w3c/csswg-drafts/issues/11500#issuecomment-2669358882>in the decision to change the behavior, and ultimately agreed to it.


Gecko: No signal (recently filed)


https://github.com/mozilla/standards-positions/issues/1224


WebKit: No signal (recently filed)


https://github.com/WebKit/standards-positions/issues/489


Web developers: No signals


Other signals:


        WebView application risks

Does this intent deprecate or change behavior of existing APIs, such that it has potentially high risk for Android WebView-based applications?

None



        Debuggability

Not affected. It’s as debuggable as before.



        Will this feature be supported on all six Blink platforms
        (Windows, Mac, Linux, ChromeOS, Android, and Android WebView)?

Yes


        Is this feature fully tested by web-platform-tests
        
<https://chromium.googlesource.com/chromium/src/+/main/docs/testing/web_platform_tests.md>?

Yes


        Flag name on about://flags

None


        Finch feature name

CSSShortCircuitVarAttr


        Rollout plan

Will ship enabled for all users


        Requires code in //chrome?

False


        Estimated milestones

Shipping on desktop

        

139

Shipping on Android

        

139

Shipping on WebView

        

139



        Anticipated spec changes

None


        Link to entry on the Chrome Platform Status

https://chromestatus.com/feature/6212939656462336?gate=5113879470014464 <https://chromestatus.com/feature/6212939656462336?gate=5113879470014464>


This intent message was generated by Chrome Platform Status <https://chromestatus.com/>.


--
You received this message because you are subscribed to the Google Groups "blink-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+unsubscr...@chromium.org. To view this discussion visit https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAKFBnUoscDWjNm%2Bk9v6_dNF%3D82XxBkamBJAFyEhh%2BZEU-JJ32g%40mail.gmail.com <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAKFBnUoscDWjNm%2Bk9v6_dNF%3D82XxBkamBJAFyEhh%2BZEU-JJ32g%40mail.gmail.com?utm_medium=email&utm_source=footer>.

--
You received this message because you are subscribed to the Google Groups 
"blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to blink-dev+unsubscr...@chromium.org.
To view this discussion visit 
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/0294635e-4559-4342-aa82-2f881a77a5be%40gmail.com.

Reply via email to