<!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">
        <fieldset class="fieldset1">
            <div class="div1">
                <fieldset class="fieldset2">
                    <div class="div2">
                        <input class="input1" required value="valid">
                    </div>
                </fieldset>
                <textarea class="textarea1" required></textarea>
            </div>
        </fieldset>
        <fieldset class="fieldset3">
            <div class="div3">
            </div>
        </fieldset>
    </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 fieldset.');

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(['fieldset2', 'input1', 'fieldset3']);

debug('');
debug("Make the text area valid.");
modifyTree(function(root) {
    root.querySelector('.textarea1').value = "Valid";
});
testStyle(['fieldset1', 'fieldset2', 'input1', 'fieldset3', 'textarea1']);

debug('');
debug("Back to invalid. We should be in the initial state.");
modifyTree(function(root) {
    root.querySelector('.textarea1').value = "";
});
testStyle(['fieldset2', 'input1', 'fieldset3']);


debug('');
debug("Move the invalid text area into fieldset3.");
modifyTree(function(root) {
    var textArea = root.querySelector('.textarea1');
    var fieldset3 = root.querySelector('.fieldset3');
    fieldset3.appendChild(textArea);
});
testStyle(['fieldset1', 'fieldset2', 'input1']);

debug('');
debug("Make the text area valid.");
modifyTree(function(root) {
    root.querySelector('.textarea1').value = "Valid";
});
testStyle(['fieldset1', 'fieldset2', 'input1', 'fieldset3', 'textarea1']);

debug('');
debug("Make the input invalid.");
modifyTree(function(root) {
    root.querySelector('.input1').value = "";
});
testStyle(['fieldset3', 'textarea1']);

debug('');
debug("Move text area as a child of fieldset1.");
modifyTree(function(root) {
    var textArea = root.querySelector('.textarea1');
    var fieldset1 = root.querySelector('.fieldset1');
    fieldset1.appendChild(textArea);
});
testStyle(['textarea1', 'fieldset3']);

debug('');
debug("Move text area as a child of div1.");
modifyTree(function(root) {
    var textArea = root.querySelector('.textarea1');
    var div1 = root.querySelector('.div1');
    div1.appendChild(textArea);
});
testStyle(['textarea1', 'fieldset3']);

debug('');
debug("Make the text area invalid.");
modifyTree(function(root) {
    root.querySelector('.textarea1').value = "";
});
testStyle(['fieldset3']);

debug('');
debug("Make the input valid.");
modifyTree(function(root) {
    root.querySelector('.input1').value = "Valid";
});
testStyle(['fieldset2', 'input1', 'fieldset3']);

debug('');
debug("Make the text area valid, everything should be valid.");
modifyTree(function(root) {
    root.querySelector('.textarea1').value = "Valid";
});
testStyle(['fieldset1', 'fieldset2', 'input1', 'textarea1', 'fieldset3']);

debug('');
debug("Make the input invalid.");
modifyTree(function(root) {
    root.querySelector('.input1').value = "";
});
testStyle(['fieldset3', 'textarea1']);


debug('');
debug("Move fieldset2 inside div3");
modifyTree(function(root) {
    var fieldset2 = root.querySelector('.fieldset2');
    var div3 = root.querySelector('.div3');
    div3.appendChild(fieldset2);
});
testStyle(['fieldset1', 'textarea1']);

debug('');
debug("Destroy the content of div2");
modifyTree(function(root) {
    root.querySelector('.div2').textContent = '';
});
testStyle(['fieldset1', 'textarea1', 'fieldset3', 'fieldset2']);

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