LibWeb: Ensure lang pseudoclass matches multiple segment subcodes

This commit is contained in:
Tim Ledbetter 2025-04-27 13:46:04 +01:00 committed by Sam Atkins
parent 74c803c87b
commit 04fde1c550
Notes: github-actions[bot] 2025-04-28 10:30:44 +00:00
4 changed files with 109 additions and 5 deletions

View file

@ -68,11 +68,15 @@ static inline bool matches_lang_pseudo_class(DOM::Element const& element, Vector
continue; continue;
if (language == "*"sv) if (language == "*"sv)
return true; return true;
if (!element_language.contains('-') && Infra::is_ascii_case_insensitive_match(element_language, language)) auto element_language_length = element_language.bytes_as_string_view().length();
return true; auto language_length = language.bytes_as_string_view().length();
auto parts = element_language.split_limit('-', 2).release_value_but_fixme_should_propagate_errors(); if (element_language_length == language_length) {
if (!parts.is_empty() && Infra::is_ascii_case_insensitive_match(parts[0], language)) if (Infra::is_ascii_case_insensitive_match(element_language, language))
return true; return true;
} else if (element_language_length > language_length) {
if (element_language.starts_with_bytes(language, CaseSensitivity::CaseInsensitive) && element_language.bytes_as_string_view()[language_length] == '-')
return true;
}
} }
return false; return false;
} }

View file

@ -0,0 +1,24 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Reference</title>
<style>
.green {
background-color: green;
color: white;
}
</style>
<body>
<div class="green">This line should be green</div>
<div class="green">This line should be green</div>
<div class="green">This line should be green</div>
<div class="green">This line should be green</div>
<div class="green">This line should be green</div>
<p class="green">This line should be green <em>and this should be green too</em></p>
<div><p class="green">This line should be green</p>This line should NOT be green</div>
<p>This line should NOT be green <em class="green">but this should be green</em></p>
<div>This line should NOT be green</div>
<div>This line should NOT be green</div>
<div>This line should NOT be green</div>
</body>

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html>
<head>
<title>CSS Test: :lang pseudoclass</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
<link rel="author" title="Eira Monstad, Opera Software ASA" href="mailto:public-testsuites@opera.com">
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#lang">
<link rel="match" href="../../../../../expected/wpt-import/css/CSS2/selector/lang-pseudoclass-001-ref.html" />
<meta name="flags" content="HTMLonly" >
<meta name="assert" content=":lang pseudoclass in HTML should not be case-sensitive, and match a substring">
<style type="text/css">
div:lang(es) { color:white;background-color:green; }
p:lang(es) { color:white;background-color:green; }
p:lang(fr) { color:white;background-color:green; }
em:lang(de) { color:white;background-color:green; }
div:lang(en-GB) { color:white;background-color:green; }
</style>
</head>
<body>
<div lang="es">This line should be green</div>
<div lang="es-MX">This line should be green</div>
<div lang="ES">This line should be green</div>
<div lang="en-GB">This line should be green</div>
<div lang="en-GB-scouse">This line should be green</div>
<p lang="es">This line should be green <em>and this should be green too</em></p>
<div lang="fr"><p>This line should be green</p>This line should NOT be green</div>
<p lang="de">This line should NOT be green <em>but this should be green</em></p>
<div lang="MX-es">This line should NOT be green</div>
<div lang="en-US">This line should NOT be green</div>
<div lang="en">This line should NOT be green</div>
</body>
</html>

View file

@ -0,0 +1,40 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>CSS Test: :lang pseudoclass</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/>
<link rel="author" title="Eira Monstad, Opera Software ASA" href="mailto:public-testsuites@opera.com"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#lang"/>
<link rel="match" href="../../../../../expected/wpt-import/css/CSS2/selector/lang-pseudoclass-001-ref.html" />
<meta name="flags" content="nonHTML" />
<meta name="assert" content=":lang pseudoclass in XHTML should be case sensitive, and match a substring"/>
<style type="text/css"><![CDATA[
div:lang(es) { color:white;background-color:green; }
p:lang(es) { color:white;background-color:green; }
p:lang(fr) { color:white;background-color:green; }
em:lang(de) { color:white;background-color:green; }
div:lang(en-GB) { color:white;background-color:green; }
]]></style>
</head>
<body>
<div xml:lang="es">This line should be green</div>
<div xml:lang="es-MX">This line should be green</div>
<div xml:lang="ES">This line should be green</div>
<div xml:lang="en-GB">This line should be green</div>
<div xml:lang="en-GB-scouse">This line should be green</div>
<p xml:lang="es">This line should be green <em>and this should be green too</em></p>
<div xml:lang="fr"><p>This line should be green</p>This line should NOT be green</div>
<p xml:lang="de">This line should NOT be green <em>but this should be green</em></p>
<div xml:lang="en-US">This line should NOT be green</div>
<div xml:lang="en">This line should NOT be green</div>
<div xml:lang="MX-es">This line should NOT be green</div>
</body>
</html>