mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-28 19:59:17 +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:
parent
95c511a3f6
commit
a6794627b0
Notes:
github-actions[bot]
2024-10-28 21:56:05 +00:00
Author: https://github.com/Grubre
Commit: a6794627b0
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/1974
Reviewed-by: https://github.com/trflynn89
1 changed files with 6 additions and 11 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue