blob: b5ac73486036a0f6cdf0298ecf72771cc0ae4d1d [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<style>
input {
background-color: rgb(1, 2, 3);
}
:indeterminate {
background-color: rgb(4, 5, 6);
}
</style>
</head>
<body>
<div id="with-renderer">
<!-- With renderer -->
<input type="radio" name="group1" id="radio1">
<input type="radio" name="group1" id="radio2">
<input type="radio" name="group1" id="radio3">
<input type="radio" name="group1" id="radio4">
<input type="radio" name="group1" id="radio5">
</div>
<div style="display:none;">
<!-- Without renderer -->
<input type="radio" name="group2" id="radio6">
<input type="radio" name="group2" id="radio7">
<input type="radio" name="group2" id="radio8">
<input type="radio" name="group2" id="radio9">
<input type="radio" name="group2" id="radio10">
</div>
</body>
<script>
description('Verify that we do not invalidate more than needed to satisfy :indeterminate');
let allInputs = document.querySelectorAll("input");
function elementsNeedingStyleRecalc() {
let elementsRequiringNeedStyleRecalc = []
for (let inputElement of allInputs) {
let needsStyleRecalc = window.internals.nodeNeedsStyleRecalc(inputElement);
if (needsStyleRecalc)
elementsRequiringNeedStyleRecalc.push(inputElement.id);
}
return elementsRequiringNeedStyleRecalc;
}
function elementsWithIndeterminateStyle() {
let elements = [];
for (let inputElement of allInputs) {
let backgroundColor = getComputedStyle(inputElement).backgroundColor;
if (backgroundColor === "rgb(4, 5, 6)")
elements.push(inputElement.id);
}
return elements;
}
function checkedElements() {
let elements = [];
for (let inputElement of allInputs) {
if (inputElement.checked)
elements.push(inputElement.id);
}
return elements;
}
// Force a layout to ensure we don't have dirty styles.
var offsetTop = document.documentElement.offsetTop;
// Initial state.
shouldBe("elementsNeedingStyleRecalc()", '[]');
shouldBe("elementsWithIndeterminateStyle()", '["radio1", "radio2", "radio3", "radio4", "radio5", "radio6", "radio7", "radio8", "radio9", "radio10"]');
shouldBe("checkedElements()", '[]');
// Check radio3. All the group1 require style recalc.
debug("Check radio3");
document.getElementById("radio3").checked = true;
shouldBe("elementsNeedingStyleRecalc()", '["radio1", "radio2", "radio3", "radio4", "radio5"]');
shouldBe("elementsWithIndeterminateStyle()", '["radio6", "radio7", "radio8", "radio9", "radio10"]');
shouldBe("checkedElements()", '["radio3"]');
// Check radio8. All the group1 require style recalc.
debug("Check radio8");
document.getElementById("radio8").checked = true;
shouldBe("elementsNeedingStyleRecalc()", '["radio6", "radio7", "radio8", "radio9", "radio10"]');
shouldBe("elementsWithIndeterminateStyle()", '[]');
shouldBe("checkedElements()", '["radio3", "radio8"]');
// Checking radio4, we should not need to invalidate anything but the two modified elements.
debug("Check radio4");
document.getElementById("radio4").checked = true;
shouldBe("elementsNeedingStyleRecalc()", '["radio3", "radio4"]');
shouldBe("elementsWithIndeterminateStyle()", '[]');
shouldBe("checkedElements()", '["radio4", "radio8"]');
// Checking radio9, we should not need to invalidate anything but the two modified elements.
debug("Check radio9");
document.getElementById("radio9").checked = true;
shouldBe("elementsNeedingStyleRecalc()", '["radio8", "radio9"]');
shouldBe("elementsWithIndeterminateStyle()", '[]');
shouldBe("checkedElements()", '["radio4", "radio9"]');
// Hide the elements to make the results prettier.
document.getElementById("with-renderer").style.display = "none";
</script>
<script src="../../resources/js-test-post.js"></script>
</html>