mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-02-22 23:55:12 +00:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user