<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<style>
fieldset {
    color: black;
}
fieldset:valid {
    color: rgb(0, 1, 2);
}
</style>
</head>
<body>
    <div>
        <!-- With renderer -->
        <fieldset id="with-renderer">
            <input class="input1" required value="Valid">
            <input class="input2" required value="Valid">
            <input class="input3" required value="Valid">
            <input class="input4" required value="Valid">
        </fieldset>
    </div>
    <div style="display:none;">
        <!-- Without renderer -->
        <fieldset id="without-renderer">
            <input class="input1" required value="Valid">
            <input class="input2" required value="Valid">
            <input class="input3" required value="Valid">
            <input class="input4" required value="Valid">
        </fieldset>
    </div>
</body>
<script>

description('Test that we do not invalidate the style of &lt;fieldset&gt; excessively when matching :valid based on the descendants.');

function shouldNeedStyleRecalc(expected) {
    var testFunction = expected ? shouldBeTrue : shouldBeFalse;
    testFunction('window.internals.nodeNeedsStyleRecalc(document.getElementById("with-renderer"))');
    testFunction('window.internals.nodeNeedsStyleRecalc(document.getElementById("without-renderer"))');
}

function checkStyle(expectedColor) {
    shouldBeEqualToString('getComputedStyle(document.getElementById("with-renderer")).color', expectedColor);
    shouldBeEqualToString('getComputedStyle(document.getElementById("without-renderer")).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, 1, 2)');

// Make input3 invalid, the fieldset should also become invalid.
var inputs3 = document.querySelectorAll('.input3');
inputs3[0].value = '';
inputs3[1].value = '';

shouldNeedStyleRecalc(true);
checkStyle('rgb(0, 0, 0)');

// Making more fields invalid should not invalidate the fieldset's style.
var inputs = document.querySelectorAll(':matches(.input2, .input4)');
for (var i = 0; i < inputs.length; ++i)
    inputs[i].value = '';

shouldNeedStyleRecalc(false);
checkStyle('rgb(0, 0, 0)');

// Removing valid fields should not invalidate the style.
var inputs1 = document.querySelectorAll(':matches(.input1)');
for (var i = 0; i < inputs1.length; ++i)
    inputs1[i].parentNode.removeChild(inputs1[i]);

// Making all fields valid but one, fieldset still does not need to be invalidated.
var inputs = document.querySelectorAll(':matches(.input2, .input3)');
for (var i = 0; i < inputs.length; ++i)
    inputs[i].removeAttribute('required');

shouldNeedStyleRecalc(false);
checkStyle('rgb(0, 0, 0)');

// Making the last input valid. The style must update, fieldset must be invalidated.
var inputs = document.querySelectorAll(':matches(.input4)');
for (var i = 0; i < inputs.length; ++i)
    inputs[i].removeAttribute('required');

shouldNeedStyleRecalc(true);
checkStyle('rgb(0, 1, 2)');

document.getElementById("with-renderer").style.display = 'none';
</script>
<script src="../../resources/js-test-post.js"></script>
</html>
