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:
Sam Atkins
2025-05-22 17:02:44 +01:00
parent 00617884a6
commit fb975cc156
Notes: github-actions[bot] 2025-05-23 09:18:59 +00:00
5 changed files with 107 additions and 14 deletions

View File

@@ -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;
}
}
}
)~~~");