| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../resources/js-test.js"></script> |
| <style> |
| :invalid { background: rgb(255, 0, 0); } |
| :valid { background: rgb(0, 255, 0); } |
| form:invalid input[type=submit] { background-color: rgb(127, 0, 0); } |
| form:valid input[type=submit] { background-color: rgb(0, 127, 0); } |
| </style> |
| </head> |
| <body> |
| <script> |
| description('Check if :valid/:invalid CSS pseudo selectors are lively applied for forms'); |
| |
| function $(id) { |
| return document.getElementById(id); |
| } |
| |
| function backgroundOf(element) { |
| return document.defaultView.getComputedStyle(element, null).getPropertyValue('background-color'); |
| } |
| |
| var invalidColor = 'rgb(255, 0, 0)'; |
| var validColor = 'rgb(0, 255, 0)'; |
| var subInvalidColor = 'rgb(127, 0, 0)'; |
| var subValidColor = 'rgb(0, 127, 0)'; |
| |
| var parent = document.createElement('div'); |
| document.body.appendChild(parent); |
| |
| debug('Removing and adding required text inputs and modifying their value by a DOM tree mutation:'); |
| parent.innerHTML = '<form id=form1><input type=text id=input1 required><input type=text id=input2 required value=a><input type=submit id=sub1></form>'; |
| var form1 = $('form1'); |
| var input1 = $('input1'); |
| var input2 = $('input2'); |
| var sub1 = $('sub1'); |
| shouldBe('backgroundOf(form1)', 'invalidColor'); |
| shouldBe('backgroundOf(sub1)', 'subInvalidColor'); |
| shouldBe('form1.removeChild(input1); backgroundOf(form1)', 'validColor'); |
| shouldBe('backgroundOf(sub1)', 'subValidColor'); |
| shouldBe('form1.appendChild(input1); backgroundOf(form1)', 'invalidColor'); |
| shouldBe('backgroundOf(sub1)', 'subInvalidColor'); |
| shouldBe('input1.setAttribute("value", "a"); backgroundOf(form1)', 'validColor'); |
| shouldBe('backgroundOf(sub1)', 'subValidColor'); |
| shouldBe('input2.setAttribute("value", ""); backgroundOf(form1)', 'invalidColor'); |
| shouldBe('backgroundOf(sub1)', 'subInvalidColor'); |
| debug('') |
| |
| debug('Disabling and marking inputs readonly by a DOM tree mutation:'); |
| parent.innerHTML = '<form id=form1><input type=text id=input1 required><input type=text id=input2 required value=a><input type=submit id=sub1></form>'; |
| var form1 = $('form1'); |
| var input1 = $('input1'); |
| var sub1 = $('sub1'); |
| shouldBe('backgroundOf(form1)', 'invalidColor'); |
| shouldBe('backgroundOf(sub1)', 'subInvalidColor'); |
| shouldBe('input1.disabled=1; backgroundOf(form1)', 'validColor'); |
| shouldBe('backgroundOf(sub1)', 'subValidColor'); |
| shouldBe('input1.disabled=0; backgroundOf(form1)', 'invalidColor'); |
| shouldBe('backgroundOf(sub1)', 'subInvalidColor'); |
| shouldBe('input1.setAttribute("readonly", "1"); backgroundOf(form1)', 'validColor'); |
| shouldBe('backgroundOf(sub1)', 'subValidColor'); |
| debug('') |
| |
| debug('Move element under datalist by a DOM tree mutation:'); |
| parent.innerHTML = '<form id=form1></form><datalist id=dl1></datalist><input type=text id=input1 required form=form1>'; |
| var form1 = $('form1'); |
| var input1 = $('input1'); |
| var dl1 = $('dl1'); |
| shouldBe('backgroundOf(form1)', 'invalidColor'); |
| shouldBe('parent.removeChild(input1); backgroundOf(form1)', 'validColor'); |
| shouldBe('dl1.appendChild(input1); backgroundOf(form1)', 'validColor'); |
| shouldBe('parent.appendChild(input1); backgroundOf(form1)', 'invalidColor'); |
| debug('') |
| |
| debug('Adding a required text input that is not a direct child of the form:'); |
| parent.innerHTML = '<form id=form1></form>'; |
| var form1 = $('form1'); |
| shouldBe('backgroundOf(form1)', 'validColor'); |
| var div1 = document.createElement('div'); |
| var input1 = document.createElement('input'); |
| input1.setAttribute('type', 'text'); |
| input1.setAttribute('required', ''); |
| form1.appendChild(div1); |
| shouldBe('div1.appendChild(input1); backgroundOf(form1)', 'invalidColor'); |
| debug(''); |
| |
| debug('Render multiple forms and reassign an invalid input from one to another:'); |
| parent.innerHTML = '<form id=form1><input type=text id=input1 required><input type=text id=input2 required value="a"></form>' |
| + '<form id=form2><input type=text id=input3><input type=text id=input4 required value="a"></form>' |
| + '<form id=form3></form>'; |
| shouldBe('backgroundOf($("form1"))', 'invalidColor'); |
| shouldBe('backgroundOf($("form2"))', 'validColor'); |
| shouldBe('backgroundOf($("form3"))', 'validColor'); |
| var input1 = $('input1'); |
| input1.setAttribute("form", "form3"); |
| shouldBe('backgroundOf($("form1"))', 'validColor'); |
| shouldBe('backgroundOf($("form3"))', 'invalidColor'); |
| debug(''); |
| |
| debug('Ensure that invalid event was not triggered on style evaluation:'); |
| var val = '0'; |
| parent.innerHTML = '<form id=form1><input type=text id=input1 required oninvalid="val=\'1\';"></form>'; |
| var form1 = $('form1'); |
| shouldBe('backgroundOf(form1)', 'invalidColor'); |
| shouldBeEqualToString('val', '0'); |
| shouldBeEqualToString('form1.checkValidity(); val', '1'); |
| debug(''); |
| |
| parent.innerHTML = ''; |
| </script> |
| </body> |
| </html> |