diff --git a/Userland/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp b/Userland/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp index ccaf40fab9..bfa436a2b1 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -543,6 +544,8 @@ OwnPtr Parser::parse_media_in_parens(TokenStream // ``, https://www.w3.org/TR/mediaqueries-4/#typedef-mf-value Optional Parser::parse_media_feature_value(MediaFeatureID media_feature, TokenStream& tokens) { + // NOTE: Calculations are not allowed for media feature values, at least in the current spec, so we reject them. + // Identifiers if (tokens.peek_token().is(Token::Type::Ident)) { auto transaction = tokens.begin_transaction(); @@ -560,22 +563,21 @@ Optional Parser::parse_media_feature_value(MediaFeatureID med if (media_feature_accepts_type(media_feature, MediaFeatureValueType::Boolean)) { auto transaction = tokens.begin_transaction(); tokens.skip_whitespace(); - auto const& first = tokens.next_token(); - if (first.is(Token::Type::Number) && first.token().number().is_integer() - && (first.token().number_value() == 0 || first.token().number_value() == 1)) { - transaction.commit(); - return MediaFeatureValue(first.token().number_value()); + if (auto integer = parse_integer(tokens); integer.has_value() && !integer->is_calculated()) { + auto integer_value = integer->value(); + if (integer_value == 0 || integer_value == 1) { + transaction.commit(); + return MediaFeatureValue(integer_value); + } } } // Integer if (media_feature_accepts_type(media_feature, MediaFeatureValueType::Integer)) { auto transaction = tokens.begin_transaction(); - tokens.skip_whitespace(); - auto const& first = tokens.next_token(); - if (first.is(Token::Type::Number) && first.token().number().is_integer()) { + if (auto integer = parse_integer(tokens); integer.has_value() && !integer->is_calculated()) { transaction.commit(); - return MediaFeatureValue(first.token().number_value()); + return MediaFeatureValue(integer->value()); } } @@ -583,10 +585,9 @@ Optional Parser::parse_media_feature_value(MediaFeatureID med if (media_feature_accepts_type(media_feature, MediaFeatureValueType::Length)) { auto transaction = tokens.begin_transaction(); tokens.skip_whitespace(); - auto const& first = tokens.next_token(); - if (auto length = parse_length(first); length.has_value()) { + if (auto length = parse_length(tokens); length.has_value() && !length->is_calculated()) { transaction.commit(); - return MediaFeatureValue(length.release_value()); + return MediaFeatureValue(length->value()); } } @@ -604,10 +605,9 @@ Optional Parser::parse_media_feature_value(MediaFeatureID med if (media_feature_accepts_type(media_feature, MediaFeatureValueType::Resolution)) { auto transaction = tokens.begin_transaction(); tokens.skip_whitespace(); - auto const& first = tokens.next_token(); - if (auto resolution = parse_dimension(first); resolution.has_value() && resolution->is_resolution()) { + if (auto resolution = parse_resolution(tokens); resolution.has_value() && !resolution->is_calculated()) { transaction.commit(); - return MediaFeatureValue(resolution->resolution()); + return MediaFeatureValue(resolution->value()); } }