| <!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> |