<!DOCTYPE HTML> <html> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=418756 https://bugzilla.mozilla.org/show_bug.cgi?id=617528 --> <head> <title>Test for Bug 418756 and 617528</title> <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> </head> <body> Mozilla bug <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=418756">418756</a> and <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=617528">617528</a> <p id="display"></p> <div id="content"> <form id="f1"> </form> <form id="f2"> </form> <menu id="m1"> </menu> <menu id="m2"> </menu> </div> <pre id="test"> <script class="testbody" type="text/javascript; version=1.7"> /** Test for Bug 418756 and 617528 **/ var group1; var group2; var group3; var tags = ["input", "menuitem"]; for (let tag of tags) { function bounce(node) { let n = node.nextSibling; let p = node.parentNode; p.removeChild(node); p.insertBefore(node, n); } var createdNodes = []; function cleanup() { for (let node of createdNodes) { if (node.parentNode) { node.parentNode.removeChild(node); } } createdNodes = []; } var typeMapper = { 'c': 'checkbox', 'r': 'radio' }; var id = 0; // type can be 'c' for 'checkbox' and 'r' for 'radio' function createNode(type, name, checked) { let node = document.createElement(tag); node.setAttribute("type", typeMapper[type]); if (checked) { node.setAttribute("checked", "checked"); } node.setAttribute("id", type + (++id)); node.setAttribute(tag == "input" ? "name" : "radiogroup", name); createdNodes.push(node); return node; } var types = ['c', 'r']; // First make sure that setting .checked makes .defaultChecked changes no // longer affect .checked. for (let type of types) { let n = createNode(type, '', false); is(n.defaultChecked, false, "Bogus defaultChecked on " + typeMapper[type]); is(n.checked, false, "Bogus checked on " + typeMapper[type]); n.defaultChecked = true; is(n.defaultChecked, true, "Bogus defaultChecked on " + typeMapper[type] + "after mutation"); is(n.checked, true, "Bogus checked on " + typeMapper[type] + "after mutation"); n.checked = false; is(n.defaultChecked, true, "Bogus defaultChecked on " + typeMapper[type] + "after second mutation"); is(n.checked, false, "Bogus checked on " + typeMapper[type] + "after second mutation"); n.defaultChecked = false; is(n.defaultChecked, false, "Bogus defaultChecked on " + typeMapper[type] + "after third mutation"); is(n.checked, false, "Bogus checked on " + typeMapper[type] + "after third mutation"); n.defaultChecked = true; is(n.defaultChecked, true, "Bogus defaultChecked on " + typeMapper[type] + "after fourth mutation"); is(n.checked, false, "Bogus checked on " + typeMapper[type] + "after fourth mutation"); } cleanup(); // Now check that bouncing a control that's the only one of its kind has no // effect for (let type of types) { let n = createNode(type, 'test1', true); $(tag == "input" ? "f1" : "m1").appendChild(n); n.checked = false; n.defaultChecked = false; bounce(n); n.defaultChecked = true; is(n.checked, false, "We set .checked on this " + typeMapper[type]); } cleanup(); // Now check that playing with a single radio in a group affects all // other radios in the group (but not radios not in that group) group1 = [ createNode('r', 'g1', false), createNode('r', 'g1', false), createNode('r', 'g1', false) ]; group2 = [ createNode('r', 'g2', false), createNode('r', 'g2', false), createNode('r', 'g2', false) ]; group3 = [ createNode('r', 'g1', false), createNode('r', 'g1', false), createNode('r', 'g1', false) ]; for (let g of group1) { $(tag == "input" ? "f1" : "m1").appendChild(g); } for (let g of group2) { $(tag == "input" ? "f1" : "m1").appendChild(g); } for (let g of group3) { $(tag == "input" ? "f2" : "m2").appendChild(g); } for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, false, "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 1"); is(g.checked, false, "group" + n + "[" + window["group"+n].indexOf(g) + "] checkedhecked wrong pass 1"); } } group1[1].defaultChecked = true; for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, n == 1 && group1.indexOf(g) == 1, "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 2"); is(g.checked, n == 1 && group1.indexOf(g) == 1, "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 2"); } } group1[0].defaultChecked = true; for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 1 || group1.indexOf(g) == 0), "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 3"); is(g.checked, n == 1 && group1.indexOf(g) == 0, "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 3"); } } group1[2].defaultChecked = true; for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, n == 1, "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 4"); is(g.checked, n == 1 && group1.indexOf(g) == 2, "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 4"); } } var next = group1[1].nextSibling; var p = group1[1].parentNode; p.removeChild(group1[1]); group1[1].defaultChecked = false; group1[1].defaultChecked = true; p.insertBefore(group1[1], next); for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, n == 1, "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 5"); is(g.checked, n == 1 && group1.indexOf(g) == 1, "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 5"); } } for (let g of group1) { g.defaultChecked = false; } for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, false, "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 6"); is(g.checked, false, "group" + n + "[" + window["group"+n].indexOf(g) + "] checkedhecked wrong pass 6"); } } group1[1].checked = true; for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, false, "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 7"); is(g.checked, n == 1 && group1.indexOf(g) == 1, "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 7"); } } group1[0].defaultChecked = true; for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, n == 1 && group1.indexOf(g) == 0, "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 8"); is(g.checked, n == 1 && group1.indexOf(g) == 1, "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 8"); } } group1[2].defaultChecked = true; for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 || group1.indexOf(g) == 2), "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 9"); is(g.checked, n == 1 && group1.indexOf(g) == 1, "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 9"); } } group1[1].parentNode.removeChild(group1[1]); for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 || group1.indexOf(g) == 2), "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 10"); is(g.checked, n == 1 && group1.indexOf(g) == 1, "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 10"); } } group1[2].checked = true; for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 || group1.indexOf(g) == 2), "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 11"); is(g.checked, n == 1 && (group1.indexOf(g) == 1 || group1.indexOf(g) == 2), "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 11"); } } group1[0].checked = true; for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 || group1.indexOf(g) == 2), "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 12"); is(g.checked, n == 1 && (group1.indexOf(g) == 1 || group1.indexOf(g) == 0), "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 12"); } } next = group2[1].nextSibling; p = group2[1].parentNode; p.removeChild(group2[1]); p.insertBefore(group2[1], next); group2[0].checked = true; for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 || group1.indexOf(g) == 2), "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 13"); is(g.checked, (n == 1 && (group1.indexOf(g) == 1 || group1.indexOf(g) == 0)) || (n == 2 && group2.indexOf(g) == 0), "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 13"); } } p.insertBefore(group2[1], next); for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 || group1.indexOf(g) == 2), "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 14"); is(g.checked, (n == 1 && (group1.indexOf(g) == 1 || group1.indexOf(g) == 0)) || (n == 2 && group2.indexOf(g) == 0), "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 14"); } } group2[1].defaultChecked = true; for (let n of [1, 2, 3]) { for (let g of window["group"+n]) { is(g.defaultChecked, (n == 1 && (group1.indexOf(g) == 0 || group1.indexOf(g) == 2)) || (n == 2 && group2.indexOf(g) == 1), "group" + n + "[" + window["group"+n].indexOf(g) + "] defaultChecked wrong pass 15"); is(g.checked, (n == 1 && (group1.indexOf(g) == 1 || group1.indexOf(g) == 0)) || (n == 2 && group2.indexOf(g) == 0), "group" + n + "[" + window["group"+n].indexOf(g) + "] checked wrong pass 15"); } } cleanup(); } </script> </pre> </body> </html>