| <!DOCTYPE html> |
| <body> |
| <script src="../../../resources/js-test-pre.js"></script> |
| |
| <div id="parent"></div> |
| |
| <script> |
| description('Various tests about radio button group.'); |
| |
| const Checked = true; |
| const Unchecked = false; |
| |
| function createRadio(name, checked, id) { |
| var input = document.createElement('input'); |
| input.type = 'radio'; |
| input.name = name; |
| input.checked = !!checked; |
| input.id = id; |
| return input; |
| } |
| |
| function $(id) { |
| return document.getElementById(id); |
| } |
| |
| var parent = $('parent'); |
| |
| debug('Changing the name attribute of a radio button:'); |
| parent.innerHTML = '<form>' + |
| '<input type=radio name=name1 checked id=radio1-1>' + |
| '<input type=radio name=name2 checked id=radio1-2>' + |
| '</form>'; |
| shouldBeTrue('$("radio1-1").checked'); |
| shouldBeTrue('$("radio1-2").checked'); |
| $('radio1-2').name = 'name1'; |
| shouldBeFalse('$("radio1-1").checked'); |
| shouldBeTrue('$("radio1-2").checked'); |
| shouldBeTrue('$("radio1-1").checked = true; $("radio1-1").checked'); |
| shouldBeFalse('$("radio1-2").checked'); |
| |
| debug('\nDetach the from from the document tree:'); |
| var orphanForm = parent.firstChild; |
| parent.removeChild(orphanForm); |
| var radioButtons = orphanForm.getElementsByTagName('input'); |
| shouldBeTrue('radioButtons[0].checked'); |
| shouldBeFalse('radioButtons[1].checked'); |
| shouldBeFalse('radioButtons[1].checked = true; radioButtons[0].checked'); |
| shouldBeTrue('radioButtons[1].checked'); |
| |
| debug(''); |
| debug('Changing the type of an input element to radio:'); |
| parent.innerHTML = '<form>' + |
| '<input type=radio name=name1 checked id=radio1-1>' + |
| '<input type=text name=name1 checked id=text1-2>' + |
| '</form>'; |
| shouldBeTrue('$("radio1-1").checked'); |
| $('text1-2').type = 'radio'; |
| shouldBeFalse('$("radio1-1").checked'); |
| shouldBeTrue('$("text1-2").checked'); |
| |
| debug(''); |
| debug('Moving a checked radio button to another form:'); |
| parent.innerHTML = '<input type="radio" name="name1" checked id="outside">' + |
| '<form id="form1">' + |
| '<input type="radio" name="name1" checked id="inside">' + |
| '</form>' + |
| '<form id="form2">' + |
| '<input type="radio" name="name1" checked id="inside2">' + |
| '</form>' |
| shouldBeTrue('$("outside").checked'); |
| shouldBeTrue('$("inside").checked'); |
| shouldBeTrue('$("inside2").checked'); |
| $('form1').appendChild($('inside2')); |
| shouldBeTrue('$("outside").checked'); |
| shouldBeFalse('$("inside").checked'); |
| shouldBeTrue('$("inside2").checked'); |
| debug('When a radio in a form is removed, it should not affect Document-level groups:'); |
| parent.removeChild($('form1')); |
| shouldBeTrue('$("outside").checked'); |
| |
| debug(''); |
| debug('Removing an ancestor owner form:'); |
| parent.innerHTML = '<input type=radio name=name0 checked id=radio0-1>' + |
| '<form id=form1><input type=radio name=name0 checked id=radio0-2></form>'; |
| parent.removeChild($('form1')); |
| gc(); |
| shouldBeTrue('$("radio0-1").checked'); |
| |
| debug(''); |
| debug('Changing form attribute'); |
| parent.innerHTML = '<input type=radio name=name1 checked id=radio1-1>' + |
| '<form id=form1><input type=radio name=name1 checked id=radio1-2></form>' + |
| '<form id=form2><input type=radio name=name1 checked id=radio1-3></form>'; |
| $('radio1-3').setAttribute('form', 'form1'); |
| shouldBeTrue('$("radio1-1").checked'); |
| shouldBeFalse('$("radio1-2").checked'); |
| shouldBeTrue('$("radio1-3").checked'); |
| |
| debug('Removing a non-ancestor owner form:'); |
| $('form2').appendChild(createRadio('name1', Checked, 'radio1-4')); |
| shouldBeTrue('$("radio1-3").checked'); |
| // If there is no elements with ID specified by form= attribute, the form |
| // control is not associated to any forms. |
| parent.removeChild($('form1')); |
| // FIXME: We need to call gc() twice on Apple Mac. |
| gc(); |
| gc(); |
| shouldBeTrue('$("radio1-4").checked'); |
| debug('(The following test depends on gc(). It might fail on a real browser.)'); |
| shouldBeFalse('$("radio1-1").checked'); |
| shouldBeTrue('$("radio1-3").checked'); |
| |
| debug(''); |
| debug('Adding a radio button to an orphan tree:'); |
| var orphanDiv = document.createElement('div'); |
| orphanDiv.appendChild(createRadio('name2', Checked, '')); |
| orphanDiv.appendChild(createRadio('name2', Checked, '')); |
| shouldBeTrue('orphanDiv.getElementsByTagName("input")[0].checked'); |
| shouldBeTrue('orphanDiv.getElementsByTagName("input")[1].checked'); |
| debug('Adding the orphan tree to a document:'); |
| document.body.appendChild(orphanDiv); |
| shouldBeFalse('orphanDiv.getElementsByTagName("input")[0].checked'); |
| shouldBeTrue('orphanDiv.getElementsByTagName("input")[1].checked'); |
| |
| debug('Parsing an orphan form:'); |
| document.body.removeChild(orphanDiv); |
| orphanDiv.innerHTML = '<form><input type=radio name=name3 checked><input type=radio name=name3 checked></form>'; |
| shouldBeFalse('orphanDiv.getElementsByTagName("input")[0].checked'); |
| shouldBeTrue('orphanDiv.getElementsByTagName("input")[1].checked'); |
| |
| debug(''); |
| debug('Moving a radio button to another Document:'); |
| parent.innerHTML = '<input type=radio name=name4 checked id=radio4-1>'; |
| var doc = document.implementation.createHTMLDocument(); |
| doc.body.innerHTML = '<input type=radio name=name4 checked id=radio4-2>'; |
| doc.body.appendChild(doc.adoptNode($('radio4-1'))); |
| shouldBeFalse('doc.getElementById("radio4-2").checked'); |
| shouldBeTrue('doc.getElementById("radio4-1").checked'); |
| parent.appendChild(createRadio('name4', Checked, '')); |
| shouldBeTrue('doc.getElementById("radio4-1").checked'); |
| |
| debug(''); |
| debug('Cloning a radio button:'); |
| var original = createRadio('name5', Checked, ''); |
| parent.innerHTML = ''; |
| parent.appendChild(original); |
| var clonedRadio = original.cloneNode(true); |
| shouldBeTrue('original.checked'); |
| shouldBeTrue('clonedRadio.checked'); |
| |
| parent.innerHTML = ''; |
| debug(''); |
| </script> |
| |
| <script src="../../../resources/js-test-post.js"></script> |
| </body> |