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