blob: 3404eb2fb192691de79b4c753ac3008ab9c2461c [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<style>
* {
color: black;
}
:checked:matches(*, :last-of-type, *) ~ target {
color: rgb(0, 1, 2);
}
</style>
</head>
<body>
<div>
<!-- With renderer -->
<input class="activator" type="checkbox">
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<target></target>
</div>
<div style="display:none;">
<!-- Without renderer -->
<input class="activator" type="radio">
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<padding></padding>
<target></target>
</div>
</body>
<script>
description('Test the style invalidation of elements affected by an indirect adjacent.');
function shouldNeedStyleRecalc(expected) {
var testFunction = expected ? shouldBeTrue : shouldBeFalse;
testFunction("window.internals.nodeNeedsStyleRecalc(document.querySelectorAll(\".activator\")[0])");
testFunction("window.internals.nodeNeedsStyleRecalc(document.querySelectorAll(\".activator\")[1])");
testFunction("window.internals.nodeNeedsStyleRecalc(document.querySelectorAll(\"target\")[0])");
testFunction("window.internals.nodeNeedsStyleRecalc(document.querySelectorAll(\"target\")[1])");
}
function setId(name) {
var allTargets = document.querySelectorAll("target");
allTargets[0].id = name;
allTargets[1].id = name;
}
function checkStyle(expectedColor) {
var allTargets = document.querySelectorAll("target");
shouldBeEqualToString('getComputedStyle(document.querySelectorAll("target")[0]).color', expectedColor);
shouldBeEqualToString('getComputedStyle(document.querySelectorAll("target")[1]).color', expectedColor);
}
// Force a layout to ensure we don't have dirty styles.
var offsetTop = document.documentElement.offsetTop;
// Initial state.
shouldNeedStyleRecalc(false);
checkStyle("rgb(0, 0, 0)");
// Check the input fields.
var allActivators = document.querySelectorAll("input.activator:matches([type=checkbox], [type=radio])");
for (let i = 0; i < allActivators.length; ++i) {
allActivators[i].checked = true;
}
shouldNeedStyleRecalc(true);
checkStyle("rgb(0, 1, 2)");
shouldNeedStyleRecalc(false);
// Uncheck the input fields.
var allActivators = document.querySelectorAll("input.activator:matches([type=checkbox], [type=radio])");
for (let i = 0; i < allActivators.length; ++i) {
allActivators[i].checked = false;
}
shouldNeedStyleRecalc(true);
checkStyle("rgb(0, 0, 0)");
shouldNeedStyleRecalc(false);
</script>
<script src="../../resources/js-test-post.js"></script>
</html>