mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-28 11:49:44 +00:00
LibWeb/CSS: Remove illegal <number-percentage>
type
Various places in the spec allow for `<number> | <percentage>`, but this is either/or, and they are not allowed to be combined like dimensions and percentages are. (For example, `calc(12 + 50%)` is never valid.) User code generally doesn't need to care about this distinction, but it does now need to check if a calculation resolves to a number, or to a percentage, instead of a single call. The existing parse_number_percentage[_value]() methods have been kept for simplicity, but updated to check for number/percentage separately.
This commit is contained in:
parent
ab5ac82db6
commit
5cda2ac961
Notes:
github-actions[bot]
2025-01-08 14:30:06 +00:00
Author: https://github.com/AtkinsSJ
Commit: 5cda2ac961
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3167
4 changed files with 12 additions and 43 deletions
|
@ -2491,45 +2491,24 @@ RefPtr<CSSStyleValue> Parser::parse_number_value(TokenStream<ComponentValue>& to
|
|||
RefPtr<CSSStyleValue> Parser::parse_number_percentage_value(TokenStream<ComponentValue>& tokens)
|
||||
{
|
||||
// Parses [<percentage> | <number>] (which is equivalent to [<alpha-value>])
|
||||
auto const& peek_token = tokens.next_token();
|
||||
if (peek_token.is(Token::Type::Number)) {
|
||||
tokens.discard_a_token(); // number
|
||||
return NumberStyleValue::create(peek_token.token().number().value());
|
||||
}
|
||||
if (peek_token.is(Token::Type::Percentage)) {
|
||||
tokens.discard_a_token(); // percentage
|
||||
return PercentageStyleValue::create(Percentage(peek_token.token().percentage()));
|
||||
}
|
||||
if (auto calc = parse_calculated_value(peek_token); calc && calc->resolves_to_number_percentage()) {
|
||||
tokens.discard_a_token(); // calc
|
||||
return calc;
|
||||
}
|
||||
|
||||
if (auto value = parse_number_value(tokens))
|
||||
return value;
|
||||
if (auto value = parse_percentage_value(tokens))
|
||||
return value;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
RefPtr<CSSStyleValue> Parser::parse_number_percentage_none_value(TokenStream<ComponentValue>& tokens)
|
||||
{
|
||||
// Parses [<percentage> | <number> | none] (which is equivalent to [<alpha-value> | none])
|
||||
auto peek_token = tokens.next_token();
|
||||
if (peek_token.is(Token::Type::Number)) {
|
||||
tokens.discard_a_token(); // number
|
||||
return NumberStyleValue::create(peek_token.token().number().value());
|
||||
}
|
||||
if (peek_token.is(Token::Type::Percentage)) {
|
||||
tokens.discard_a_token(); // percentage
|
||||
return PercentageStyleValue::create(Percentage(peek_token.token().percentage()));
|
||||
}
|
||||
if (auto calc = parse_calculated_value(peek_token); calc && calc->resolves_to_number_percentage()) {
|
||||
tokens.discard_a_token(); // calc
|
||||
return calc;
|
||||
}
|
||||
if (peek_token.is(Token::Type::Ident)) {
|
||||
auto keyword = keyword_from_string(peek_token.token().ident());
|
||||
if (keyword.has_value() && keyword.value() == Keyword::None) {
|
||||
tokens.discard_a_token(); // keyword none
|
||||
return CSSKeywordValue::create(keyword.value());
|
||||
}
|
||||
if (auto value = parse_number_value(tokens))
|
||||
return value;
|
||||
if (auto value = parse_percentage_value(tokens))
|
||||
return value;
|
||||
|
||||
if (tokens.next_token().is_ident("none"sv)) {
|
||||
tokens.discard_a_token(); // keyword none
|
||||
return CSSKeywordValue::create(Keyword::None);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue