| <!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"> |
| </fieldset> |
| <fieldset class="fieldset2" disabled> |
| </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(['fieldset1', 'fieldset2']); |
| |
| debug(''); |
| debug("Add input1 to fieldset1."); |
| modifyTree(function(root) { |
| var input1 = document.createElement('input'); |
| input1.className = 'input1'; |
| root.querySelector('.fieldset1').appendChild(input1); |
| }); |
| testStyle(['fieldset1', 'input1', 'fieldset2']); |
| |
| debug(''); |
| debug("Add input2 to fieldset1."); |
| modifyTree(function(root) { |
| var input2 = document.createElement('input'); |
| input2.className = 'input2'; |
| input2.setAttribute('required', ''); |
| root.querySelector('.fieldset1').appendChild(input2); |
| }); |
| testStyle(['input1', 'fieldset2']); |
| |
| debug(''); |
| debug("Add input3 to fieldset1."); |
| modifyTree(function(root) { |
| var input3 = document.createElement('input'); |
| input3.className = 'input3'; |
| input3.setAttribute('required', ''); |
| input3.value = "valid"; |
| root.querySelector('.fieldset1').appendChild(input3); |
| }); |
| testStyle(['input1', 'input3', 'fieldset2']); |
| |
| debug(''); |
| debug("Add input4 to fieldset2."); |
| modifyTree(function(root) { |
| var input4 = document.createElement('input'); |
| input4.className = 'input4'; |
| root.querySelector('.fieldset2').appendChild(input4); |
| }); |
| testStyle(['input1', 'input3', 'fieldset2']); |
| |
| debug(''); |
| debug("Add input5 to fieldset2."); |
| modifyTree(function(root) { |
| var input5 = document.createElement('input'); |
| input5.className = 'input5'; |
| input5.setAttribute('required', ''); |
| root.querySelector('.fieldset2').appendChild(input5); |
| }); |
| testStyle(['input1', 'input3', 'fieldset2']); |
| |
| debug(''); |
| debug("Add input6 to fieldset2."); |
| modifyTree(function(root) { |
| var input6 = document.createElement('input'); |
| input6.className = 'input6'; |
| input6.setAttribute('required', ''); |
| input6.value = "valid" |
| root.querySelector('.fieldset2').appendChild(input6); |
| }); |
| testStyle(['input1', 'input3', 'fieldset2']); |
| |
| debug(''); |
| debug("Enable fieldset2."); |
| modifyTree(function(root) { |
| root.querySelector('.fieldset2').removeAttribute('disabled'); |
| }); |
| testStyle(['input1', 'input3', 'input4', 'input6']); |
| |
| debug(''); |
| debug("Disable fieldset1."); |
| modifyTree(function(root) { |
| root.querySelector('.fieldset1').setAttribute('disabled', ''); |
| }); |
| testStyle(['fieldset1', 'input4', 'input6']); |
| |
| debug(''); |
| debug("Remove input1"); |
| modifyTree(function(root) { |
| var input = root.querySelector('.input1'); |
| input.parentNode.removeChild(input); |
| }); |
| testStyle(['fieldset1', 'input4', 'input6']); |
| |
| debug(''); |
| debug("Remove input2"); |
| modifyTree(function(root) { |
| var input = root.querySelector('.input2'); |
| input.parentNode.removeChild(input); |
| }); |
| testStyle(['fieldset1', 'input4', 'input6']); |
| |
| debug(''); |
| debug("Remove input3"); |
| modifyTree(function(root) { |
| var input = root.querySelector('.input3'); |
| input.parentNode.removeChild(input); |
| }); |
| testStyle(['fieldset1', 'input4', 'input6']); |
| |
| debug(''); |
| debug("Remove input4"); |
| modifyTree(function(root) { |
| var input = root.querySelector('.input4'); |
| input.parentNode.removeChild(input); |
| }); |
| testStyle(['fieldset1', 'input6']); |
| |
| debug(''); |
| debug("Remove input5"); |
| modifyTree(function(root) { |
| var input = root.querySelector('.input5'); |
| input.parentNode.removeChild(input); |
| }); |
| testStyle(['fieldset1', 'fieldset2', 'input6']); |
| |
| debug(''); |
| debug("Remove input6"); |
| modifyTree(function(root) { |
| var input = root.querySelector('.input6'); |
| input.parentNode.removeChild(input); |
| }); |
| testStyle(['fieldset1', '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> |