1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 05:47:34 +00:00

LibWeb: Parse unknown media type in media queries

Prevent media query parser from falling back into
MediaQuery::create_not_all() for queries with unknown media type.
With this change following test works correctly:
http://wpt.live/css/css-conditional/at-media-001.html
This commit is contained in:
Aliaksandr Kalenik 2022-11-03 08:58:27 +03:00 committed by Sam Atkins
parent 7f527ddde3
commit 2675b9390b
3 changed files with 11 additions and 9 deletions

View file

@ -350,6 +350,8 @@ bool MediaQuery::evaluate(HTML::Window const& window)
case MediaType::Screen: case MediaType::Screen:
// FIXME: Disable for printing, when we have printing! // FIXME: Disable for printing, when we have printing!
return MatchResult::True; return MatchResult::True;
case MediaType::Unknown:
return MatchResult::False;
// Deprecated, must never match: // Deprecated, must never match:
case MediaType::TTY: case MediaType::TTY:
case MediaType::TV: case MediaType::TV:
@ -444,7 +446,7 @@ bool is_media_feature_name(StringView name)
return false; return false;
} }
Optional<MediaQuery::MediaType> media_type_from_string(StringView name) MediaQuery::MediaType media_type_from_string(StringView name)
{ {
if (name.equals_ignoring_case("all"sv)) if (name.equals_ignoring_case("all"sv))
return MediaQuery::MediaType::All; return MediaQuery::MediaType::All;
@ -468,7 +470,7 @@ Optional<MediaQuery::MediaType> media_type_from_string(StringView name)
return MediaQuery::MediaType::TTY; return MediaQuery::MediaType::TTY;
if (name.equals_ignoring_case("tv"sv)) if (name.equals_ignoring_case("tv"sv))
return MediaQuery::MediaType::TV; return MediaQuery::MediaType::TV;
return {}; return MediaQuery::MediaType::Unknown;
} }
StringView to_string(MediaQuery::MediaType media_type) StringView to_string(MediaQuery::MediaType media_type)
@ -496,6 +498,8 @@ StringView to_string(MediaQuery::MediaType media_type)
return "tty"sv; return "tty"sv;
case MediaQuery::MediaType::TV: case MediaQuery::MediaType::TV:
return "tv"sv; return "tv"sv;
case MediaQuery::MediaType::Unknown:
return "unknown"sv;
} }
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }

View file

@ -223,6 +223,7 @@ public:
All, All,
Print, Print,
Screen, Screen,
Unknown,
// Deprecated, must never match: // Deprecated, must never match:
TTY, TTY,
@ -258,7 +259,7 @@ String serialize_a_media_query_list(NonnullRefPtrVector<MediaQuery> const&);
bool is_media_feature_name(StringView name); bool is_media_feature_name(StringView name);
Optional<MediaQuery::MediaType> media_type_from_string(StringView); MediaQuery::MediaType media_type_from_string(StringView);
StringView to_string(MediaQuery::MediaType); StringView to_string(MediaQuery::MediaType);
} }

View file

@ -1142,13 +1142,10 @@ Optional<MediaQuery::MediaType> Parser::parse_media_type(TokenStream<ComponentVa
if (!token.is(Token::Type::Ident)) if (!token.is(Token::Type::Ident))
return {}; return {};
auto ident = token.token().ident(); transaction.commit();
if (auto media_type = media_type_from_string(ident); media_type.has_value()) {
transaction.commit();
return media_type.release_value();
}
return {}; auto ident = token.token().ident();
return media_type_from_string(ident);
} }
// `<media-in-parens>`, https://www.w3.org/TR/mediaqueries-4/#typedef-media-in-parens // `<media-in-parens>`, https://www.w3.org/TR/mediaqueries-4/#typedef-media-in-parens