mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-26 01:35:08 +02:00
LibWeb/CSS: Correct how we evaluate boolean media-features
The spec has a general rule for this, which is roughly that "If it's not a falsey value, it's true". However, a couple of media-features are always false, apparently breaking this rule. To handle that, we have an array of false keywords in the JSON, instead of a single keyword. For those always-false media-features, we can enter all their values into this array. Gets us 2 more WPT subtest passes.
This commit is contained in:
Notes:
github-actions[bot]
2025-05-23 09:18:59 +00:00
Author: https://github.com/AtkinsSJ Commit: https://github.com/LadybirdBrowser/ladybird/commit/fb975cc1565 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4817
@@ -80,6 +80,8 @@ bool media_feature_type_is_range(MediaFeatureID);
|
||||
bool media_feature_accepts_type(MediaFeatureID, MediaFeatureValueType);
|
||||
bool media_feature_accepts_keyword(MediaFeatureID, Keyword);
|
||||
|
||||
bool media_feature_keyword_is_falsey(MediaFeatureID, Keyword);
|
||||
|
||||
}
|
||||
)~~~");
|
||||
|
||||
@@ -290,6 +292,41 @@ bool media_feature_accepts_keyword(MediaFeatureID media_feature_id, Keyword keyw
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
bool media_feature_keyword_is_falsey(MediaFeatureID media_feature_id, Keyword keyword)
|
||||
{
|
||||
switch (media_feature_id) {)~~~");
|
||||
media_feature_data.for_each_member([&](auto& name, JsonValue const& feature_value) {
|
||||
VERIFY(feature_value.is_object());
|
||||
auto& feature = feature_value.as_object();
|
||||
auto false_keywords = feature.get_array("false-keywords"sv);
|
||||
if (!false_keywords.has_value() || false_keywords->is_empty())
|
||||
return;
|
||||
|
||||
auto member_generator = generator.fork();
|
||||
member_generator.set("name:titlecase", title_casify(name));
|
||||
member_generator.append(R"~~~(
|
||||
case MediaFeatureID::@name:titlecase@:
|
||||
switch (keyword) {)~~~");
|
||||
|
||||
false_keywords.value().for_each([&](JsonValue const& value) {
|
||||
auto value_generator = member_generator.fork();
|
||||
member_generator.set("false_keyword:titlecase", title_casify(value.as_string()));
|
||||
member_generator.append(R"~~~(
|
||||
case Keyword::@false_keyword:titlecase@:)~~~");
|
||||
});
|
||||
member_generator.append(R"~~~(
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
})~~~");
|
||||
});
|
||||
|
||||
generator.append(R"~~~(
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
)~~~");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user