瀏覽代碼

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.
Grubre 8 月之前
父節點
當前提交
a6794627b0
共有 1 個文件被更改,包括 6 次插入11 次删除
  1. 6 11
      Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp

+ 6 - 11
Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp

@@ -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;
     }