<!doctype html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<style>
:matches(#with-renderer, #without-renderer) * {
    background-color: rgb(1, 2, 3);
}
:matches(#with-renderer, #without-renderer) :valid {
    background-color: rgb(4, 5, 6);
}
</style>
</head>
<body>
    <template id="test-source">
        <form class="form1">
            <div class="div1">
                <fieldset class="fieldset1">
                    <div class="div2">
                        <input class="input1" required value="valid">
                        <input class="input2" type="button" required value="valid">
                        <input class="input3" type="hidden" required value="valid">
                        <input class="input4" type="email" required value="awesome@webkit.org">
                        <input class="input5" type="password" required value="valid">
                        <button class="button1">Base button</button>
                        <button class="button2" type="submit">Submit button</button>
                    </div>
                </fieldset>
                <textarea class="textarea1" required></textarea>
                <input class="input6" required>
                <input class="input7" type="button" required>
                <input class="input8" type="hidden" required>
                <input class="input9" type="email" required>
                <input class="input10" type="password" required>
                <button class="button3">Base button</button>
                <button class="button4" type="submit">Submit button</button>
            </div>
        </form>
    </template>
    <div id="with-renderer"></div>
    <div id="without-renderer" style="display:none;"></div>
</body>
<script>
description('Test style update for :valid applied on a form.');

var withRenderer = document.getElementById("with-renderer");
var withoutRenderer = document.getElementById("without-renderer");
var source = document.getElementById("test-source").content;

withRenderer.appendChild(source.cloneNode(true));
withoutRenderer.appendChild(source.cloneNode(true));

function testStyleAtId(rootId, matchedClass) {
    var allElements = document.getElementById(rootId).querySelectorAll('*');
    for (var i = 0; i < allElements.length; ++i) {
        var expectedStyle = matchedClass.indexOf(allElements[i].className) >= 0 ? 'rgb(4, 5, 6)' : 'rgb(1, 2, 3)';
        shouldBeEqualToString('getComputedStyle(document.getElementById("' + rootId + '").querySelector(".' + allElements[i].className + '")).backgroundColor', expectedStyle);
    }
}

function testStyle(matchedClass) {
    testStyleAtId('with-renderer', matchedClass);
    testStyleAtId('without-renderer', matchedClass);
}

function modifyTree(updateFunction) {
    updateFunction(withRenderer);
    updateFunction(withoutRenderer);
}

debug('');
debug('Initial state');
testStyle(['fieldset1', 'input1', 'input4', 'input5', 'button1', 'button2', 'button3', 'button4']);

debug('');
debug("Change the type of input3 to something that validates.");
modifyTree(function(root) {
    root.querySelector('.input3').type = "search";
});
testStyle(['fieldset1', 'input1', 'input3', 'input4', 'input5', 'button1', 'button2', 'button3', 'button4']);

debug('');
debug("Change the type of input7 to something that validates.");
modifyTree(function(root) {
    root.querySelector('.input7').type = "search";
});
testStyle(['fieldset1', 'input1', 'input3', 'input4', 'input5', 'button1', 'button2', 'button3', 'button4']);

debug('');
debug("Change the type of input9 to something that does not validate.");
modifyTree(function(root) {
    root.querySelector('.input9').type = "hidden";
});
testStyle(['fieldset1', 'input1', 'input3', 'input4', 'input5', 'button1', 'button2', 'button3', 'button4']);

debug('');
debug("Change the type of input5 to something that does not validate.");
modifyTree(function(root) {
    root.querySelector('.input5').type = "button";
});
testStyle(['fieldset1', 'input1', 'input3', 'input4', 'button1', 'button2', 'button3', 'button4']);

// Change everything in the second half of controls without validation, eventually, form1 should validate.
debug('');
debug("Change the type of input6 to something that does not validate.");
modifyTree(function(root) {
    root.querySelector('.input6').type = "button";
});
testStyle(['fieldset1', 'input1', 'input3', 'input4', 'button1', 'button2', 'button3', 'button4']);

debug('');
debug("Change the type of input7 to something that does not validate.");
modifyTree(function(root) {
    root.querySelector('.input7').type = "reset";
});
testStyle(['fieldset1', 'input1', 'input3', 'input4', 'button1', 'button2', 'button3', 'button4']);

debug('');
debug("Change the type of input10 to something that does not validate.");
modifyTree(function(root) {
    root.querySelector('.input10').type = "reset";
});
testStyle(['fieldset1', 'input1', 'input3', 'input4', 'button1', 'button2', 'button3', 'button4']);

debug('');
debug("Disable the text area.");
modifyTree(function(root) {
    root.querySelector('.textarea1').setAttribute('disabled', '');
});
testStyle(['form1', 'fieldset1', 'input1', 'input3', 'input4', 'button1', 'button2', 'button3', 'button4']);

// Remove the content otherwise it will appear in the results.
withRenderer.style.display = 'none';
</script>
<script src="../../resources/js-test-post.js"></script>
</html>
