Bug 1875137 - Don't ignore state changes in display: none subtrees if needed for :has(). r=dshin

Just like we do for attribute invalidation.

Differential Revision: https://phabricator.services.mozilla.com/D198929
This commit is contained in:
Emilio Cobos Álvarez 2024-01-18 13:18:51 +00:00
Родитель 7245fbd474
Коммит e59458d592
3 изменённых файлов: 34 добавлений и 1 удалений

Просмотреть файл

@ -3445,7 +3445,9 @@ void RestyleManager::ElementStateChanged(Element* aElement,
// undisplayed elements, since we don't know if it is needed.
IncrementUndisplayedRestyleGeneration();
if (!aElement->HasServoData()) {
if (!aElement->HasServoData() &&
!(aElement->GetSelectorFlags() &
NodeSelectorFlags::RelativeSelectorSearchDirectionAncestorSibling)) {
return;
}

Просмотреть файл

@ -0,0 +1,3 @@
<!doctype html>
<title>CSS Test Reference</title>
<div>PASS</div>

Просмотреть файл

@ -0,0 +1,28 @@
<!doctype html>
<html class="reftest-wait">
<meta charset="utf-8">
<title>:has() invalidation inside display: none subtree</title>
<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
<link rel="author" href="https://mozilla.org" title="Mozilla">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1875137">
<link rel="help" href="https://drafts.csswg.org/selectors/#relational">
<link rel="match" href="has-display-none-checked-ref.html">
<style>
body:has(input:checked) #fail {
display: none;
}
body:not(:has(input:checked)) #pass {
display: none;
}
</style>
<div style="display: none">
<input type="checkbox" id="on">
</div>
<div id="fail">FAIL</div>
<div id="pass">PASS</div>
<script>
document.addEventListener("TestRendered", function() {
document.querySelector("input").checked = true;
document.documentElement.className = "";
});
</script>