LibWeb/CSS: Implement env() as an arbitrary substitution function

Technically, env() should not be an ASF. (😱) This is why some tests
still fail - env() as specced is expected to have its syntax checked
fully at parse-time, whereas ASFs are not properly syntax-checked until
later. However, I think this approach was worth doing for a few reasons:

- env() behaves like an ASF otherwise. (It is replaced with a set of
  arbitrary component-values that are not known until computed-value
  time.)
- env() was defined before the ASF concept existed, so I strongly
  suspect it will be updated in the future to match that definition,
  with a couple of adjustments. (eg, env() is allowed in some extra
  places compared to var() and attr().)
- This was much quicker and easier to implement (under 3 hours in total)
  compared to the greater amount of work to implement a whole separate
  system just for env().
- Most of these tests are marked tentative, and the spec definition of
  env() is still somewhat in flux, so failing some is not a huge deal.

If in the future I turn out to be wrong on this, we can convert it to
its own special thing.
This commit is contained in:
Sam Atkins 2025-08-05 12:32:54 +01:00 committed by Alexander Kalenik
commit 89b59cb5c3
Notes: github-actions[bot] 2025-08-07 14:41:43 +00:00
11 changed files with 122 additions and 50 deletions

View file

@ -38,6 +38,7 @@ private:
enum class ArbitrarySubstitutionFunction : u8 {
Attr,
Env,
Var,
};
[[nodiscard]] Optional<ArbitrarySubstitutionFunction> to_arbitrary_substitution_function(FlyString const& name);