LibWeb/CSS: Add the env() function to @supports conditions

This was just added to the spec and doesn't yet have WPT coverage, but
it's also pretty trivial.
This commit is contained in:
Sam Atkins
2026-03-27 15:11:16 +00:00
parent 7f322da78c
commit fd46ade2a2
Notes: github-actions[bot] 2026-03-29 20:28:15 +00:00
4 changed files with 62 additions and 4 deletions

View File

@@ -338,7 +338,8 @@ OwnPtr<BooleanExpression> Parser::parse_supports_condition(TokenStream<Component
OwnPtr<BooleanExpression> Parser::parse_supports_feature(TokenStream<ComponentValue>& tokens)
{
// <supports-feature> = <supports-selector-fn> | <supports-font-tech-fn>
// | <supports-font-format-fn> | <supports-decl>
// | <supports-font-format-fn> | <supports-env-fn>
// | <supports-decl>
auto transaction = tokens.begin_transaction();
tokens.discard_whitespace();
auto const& first_token = tokens.consume_a_token();
@@ -399,6 +400,24 @@ OwnPtr<BooleanExpression> Parser::parse_supports_feature(TokenStream<ComponentVa
return Supports::FontFormat::create(move(format_name), matches);
}
// `<supports-env-fn> = env( <ident> )`
if (first_token.is_function("env"sv)) {
TokenStream format_tokens { first_token.function().value };
format_tokens.discard_whitespace();
auto variable_token = format_tokens.consume_a_token();
format_tokens.discard_whitespace();
if (format_tokens.has_next_token() || !variable_token.is(Token::Type::Ident))
return {};
transaction.commit();
auto variable_name = variable_token.token().ident();
// https://drafts.csswg.org/css-conditional-5/#support-definition-env
// A CSS processor is considered to support an environment variable if the <ident> is a supported environment
// variable.
bool matches = environment_variable_from_string(variable_name).has_value();
return Supports::FontFormat::create(move(variable_name), matches);
}
return {};
}