LibWeb: Use Element::lang() in matches_lang_pseudo_class

The previous implementation went up the DOM tree until it found lang
attribute. The new version uses lang() function from the spec.
This commit is contained in:
Grubre 2024-10-27 14:58:36 +01:00 committed by Tim Flynn
commit a6794627b0
Notes: github-actions[bot] 2024-10-28 21:56:05 +00:00

View file

@ -57,26 +57,21 @@ static inline JS::GCPtr<DOM::Node const> traverse_up(JS::GCPtr<DOM::Node const>
// https://drafts.csswg.org/selectors-4/#the-lang-pseudo
static inline bool matches_lang_pseudo_class(DOM::Element const& element, Vector<FlyString> const& languages)
{
FlyString element_language;
for (auto const* e = &element; e; e = e->parent_element()) {
auto lang = e->attribute(HTML::AttributeNames::lang);
if (lang.has_value()) {
element_language = lang.release_value();
break;
}
}
if (element_language.is_empty())
auto maybe_element_language = element.lang();
if (!maybe_element_language.has_value())
return false;
auto element_language = maybe_element_language.release_value();
// FIXME: This is ad-hoc. Implement a proper language range matching algorithm as recommended by BCP47.
for (auto const& language : languages) {
if (language.is_empty())
continue;
if (language == "*"sv)
return true;
if (!element_language.to_string().contains('-') && Infra::is_ascii_case_insensitive_match(element_language, language))
if (!element_language.contains('-') && Infra::is_ascii_case_insensitive_match(element_language, language))
return true;
auto parts = element_language.to_string().split_limit('-', 2).release_value_but_fixme_should_propagate_errors();
auto parts = element_language.split_limit('-', 2).release_value_but_fixme_should_propagate_errors();
if (Infra::is_ascii_case_insensitive_match(parts[0], language))
return true;
}