test_checked.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. <!DOCTYPE HTML>
  2. <html>
  3. <!--
  4. https://bugzilla.mozilla.org/show_bug.cgi?id=418756
  5. https://bugzilla.mozilla.org/show_bug.cgi?id=617528
  6. -->
  7. <head>
  8. <title>Test for Bug 418756 and 617528</title>
  9. <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  10. <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
  11. </head>
  12. <body>
  13. Mozilla bug
  14. <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=418756">418756</a>
  15. and
  16. <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=617528">617528</a>
  17. <p id="display"></p>
  18. <div id="content">
  19. <form id="f1">
  20. </form>
  21. <form id="f2">
  22. </form>
  23. <menu id="m1">
  24. </menu>
  25. <menu id="m2">
  26. </menu>
  27. </div>
  28. <pre id="test">
  29. <script class="testbody" type="text/javascript; version=1.7">
  30. /** Test for Bug 418756 and 617528 **/
  31. var group1;
  32. var group2;
  33. var group3;
  34. var tags = ["input", "menuitem"];
  35. for (let tag of tags) {
  36. function bounce(node) {
  37. let n = node.nextSibling;
  38. let p = node.parentNode;
  39. p.removeChild(node);
  40. p.insertBefore(node, n);
  41. }
  42. var createdNodes = [];
  43. function cleanup() {
  44. for (let node of createdNodes) {
  45. if (node.parentNode) {
  46. node.parentNode.removeChild(node);
  47. }
  48. }
  49. createdNodes = [];
  50. }
  51. var typeMapper = {
  52. 'c': 'checkbox',
  53. 'r': 'radio'
  54. };
  55. var id = 0;
  56. // type can be 'c' for 'checkbox' and 'r' for 'radio'
  57. function createNode(type, name, checked) {
  58. let node = document.createElement(tag);
  59. node.setAttribute("type", typeMapper[type]);
  60. if (checked) {
  61. node.setAttribute("checked", "checked");
  62. }
  63. node.setAttribute("id", type + (++id));
  64. node.setAttribute(tag == "input" ? "name" : "radiogroup", name);
  65. createdNodes.push(node);
  66. return node;
  67. }
  68. var types = ['c', 'r'];
  69. // First make sure that setting .checked makes .defaultChecked changes no
  70. // longer affect .checked.
  71. for (let type of types) {
  72. let n = createNode(type, '', false);
  73. is(n.defaultChecked, false, "Bogus defaultChecked on " + typeMapper[type]);
  74. is(n.checked, false, "Bogus checked on " + typeMapper[type]);
  75. n.defaultChecked = true;
  76. is(n.defaultChecked, true, "Bogus defaultChecked on " + typeMapper[type] +
  77. "after mutation");
  78. is(n.checked, true, "Bogus checked on " + typeMapper[type] +
  79. "after mutation");
  80. n.checked = false;
  81. is(n.defaultChecked, true, "Bogus defaultChecked on " + typeMapper[type] +
  82. "after second mutation");
  83. is(n.checked, false, "Bogus checked on " + typeMapper[type] +
  84. "after second mutation");
  85. n.defaultChecked = false;
  86. is(n.defaultChecked, false, "Bogus defaultChecked on " + typeMapper[type] +
  87. "after third mutation");
  88. is(n.checked, false, "Bogus checked on " + typeMapper[type] +
  89. "after third mutation");
  90. n.defaultChecked = true;
  91. is(n.defaultChecked, true, "Bogus defaultChecked on " + typeMapper[type] +
  92. "after fourth mutation");
  93. is(n.checked, false, "Bogus checked on " + typeMapper[type] +
  94. "after fourth mutation");
  95. }
  96. cleanup();
  97. // Now check that bouncing a control that's the only one of its kind has no
  98. // effect
  99. for (let type of types) {
  100. let n = createNode(type, 'test1', true);
  101. $(tag == "input" ? "f1" : "m1").appendChild(n);
  102. n.checked = false;
  103. n.defaultChecked = false;
  104. bounce(n);
  105. n.defaultChecked = true;
  106. is(n.checked, false, "We set .checked on this " + typeMapper[type]);
  107. }
  108. cleanup();
  109. // Now check that playing with a single radio in a group affects all
  110. // other radios in the group (but not radios not in that group)
  111. group1 = [ createNode('r', 'g1', false),
  112. createNode('r', 'g1', false),
  113. createNode('r', 'g1', false) ];
  114. group2 = [ createNode('r', 'g2', false),
  115. createNode('r', 'g2', false),
  116. createNode('r', 'g2', false) ];
  117. group3 = [ createNode('r', 'g1', false),
  118. createNode('r', 'g1', false),
  119. createNode('r', 'g1', false) ];
  120. for (let g of group1) {
  121. $(tag == "input" ? "f1" : "m1").appendChild(g);
  122. }
  123. for (let g of group2) {
  124. $(tag == "input" ? "f1" : "m1").appendChild(g);
  125. }
  126. for (let g of group3) {
  127. $(tag == "input" ? "f2" : "m2").appendChild(g);
  128. }
  129. for (let n of [1, 2, 3]) {
  130. for (let g of window["group"+n]) {
  131. is(g.defaultChecked, false,
  132. "group" + n + "[" + window["group"+n].indexOf(g) +
  133. "] defaultChecked wrong pass 1");
  134. is(g.checked, false,
  135. "group" + n + "[" + window["group"+n].indexOf(g) +
  136. "] checkedhecked wrong pass 1");
  137. }
  138. }
  139. group1[1].defaultChecked = true;
  140. for (let n of [1, 2, 3]) {
  141. for (let g of window["group"+n]) {
  142. is(g.defaultChecked, n == 1 && group1.indexOf(g) == 1,
  143. "group" + n + "[" + window["group"+n].indexOf(g) +
  144. "] defaultChecked wrong pass 2");
  145. is(g.checked, n == 1 && group1.indexOf(g) == 1,
  146. "group" + n + "[" + window["group"+n].indexOf(g) +
  147. "] checked wrong pass 2");
  148. }
  149. }
  150. group1[0].defaultChecked = true;
  151. for (let n of [1, 2, 3]) {
  152. for (let g of window["group"+n]) {
  153. is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 1 ||
  154. group1.indexOf(g) == 0),
  155. "group" + n + "[" + window["group"+n].indexOf(g) +
  156. "] defaultChecked wrong pass 3");
  157. is(g.checked, n == 1 && group1.indexOf(g) == 0,
  158. "group" + n + "[" + window["group"+n].indexOf(g) +
  159. "] checked wrong pass 3");
  160. }
  161. }
  162. group1[2].defaultChecked = true;
  163. for (let n of [1, 2, 3]) {
  164. for (let g of window["group"+n]) {
  165. is(g.defaultChecked, n == 1,
  166. "group" + n + "[" + window["group"+n].indexOf(g) +
  167. "] defaultChecked wrong pass 4");
  168. is(g.checked, n == 1 && group1.indexOf(g) == 2,
  169. "group" + n + "[" + window["group"+n].indexOf(g) +
  170. "] checked wrong pass 4");
  171. }
  172. }
  173. var next = group1[1].nextSibling;
  174. var p = group1[1].parentNode;
  175. p.removeChild(group1[1]);
  176. group1[1].defaultChecked = false;
  177. group1[1].defaultChecked = true;
  178. p.insertBefore(group1[1], next);
  179. for (let n of [1, 2, 3]) {
  180. for (let g of window["group"+n]) {
  181. is(g.defaultChecked, n == 1,
  182. "group" + n + "[" + window["group"+n].indexOf(g) +
  183. "] defaultChecked wrong pass 5");
  184. is(g.checked, n == 1 && group1.indexOf(g) == 1,
  185. "group" + n + "[" + window["group"+n].indexOf(g) +
  186. "] checked wrong pass 5");
  187. }
  188. }
  189. for (let g of group1) {
  190. g.defaultChecked = false;
  191. }
  192. for (let n of [1, 2, 3]) {
  193. for (let g of window["group"+n]) {
  194. is(g.defaultChecked, false,
  195. "group" + n + "[" + window["group"+n].indexOf(g) +
  196. "] defaultChecked wrong pass 6");
  197. is(g.checked, false,
  198. "group" + n + "[" + window["group"+n].indexOf(g) +
  199. "] checkedhecked wrong pass 6");
  200. }
  201. }
  202. group1[1].checked = true;
  203. for (let n of [1, 2, 3]) {
  204. for (let g of window["group"+n]) {
  205. is(g.defaultChecked, false,
  206. "group" + n + "[" + window["group"+n].indexOf(g) +
  207. "] defaultChecked wrong pass 7");
  208. is(g.checked, n == 1 && group1.indexOf(g) == 1,
  209. "group" + n + "[" + window["group"+n].indexOf(g) +
  210. "] checked wrong pass 7");
  211. }
  212. }
  213. group1[0].defaultChecked = true;
  214. for (let n of [1, 2, 3]) {
  215. for (let g of window["group"+n]) {
  216. is(g.defaultChecked, n == 1 && group1.indexOf(g) == 0,
  217. "group" + n + "[" + window["group"+n].indexOf(g) +
  218. "] defaultChecked wrong pass 8");
  219. is(g.checked, n == 1 && group1.indexOf(g) == 1,
  220. "group" + n + "[" + window["group"+n].indexOf(g) +
  221. "] checked wrong pass 8");
  222. }
  223. }
  224. group1[2].defaultChecked = true;
  225. for (let n of [1, 2, 3]) {
  226. for (let g of window["group"+n]) {
  227. is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
  228. group1.indexOf(g) == 2),
  229. "group" + n + "[" + window["group"+n].indexOf(g) +
  230. "] defaultChecked wrong pass 9");
  231. is(g.checked, n == 1 && group1.indexOf(g) == 1,
  232. "group" + n + "[" + window["group"+n].indexOf(g) +
  233. "] checked wrong pass 9");
  234. }
  235. }
  236. group1[1].parentNode.removeChild(group1[1]);
  237. for (let n of [1, 2, 3]) {
  238. for (let g of window["group"+n]) {
  239. is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
  240. group1.indexOf(g) == 2),
  241. "group" + n + "[" + window["group"+n].indexOf(g) +
  242. "] defaultChecked wrong pass 10");
  243. is(g.checked, n == 1 && group1.indexOf(g) == 1,
  244. "group" + n + "[" + window["group"+n].indexOf(g) +
  245. "] checked wrong pass 10");
  246. }
  247. }
  248. group1[2].checked = true;
  249. for (let n of [1, 2, 3]) {
  250. for (let g of window["group"+n]) {
  251. is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
  252. group1.indexOf(g) == 2),
  253. "group" + n + "[" + window["group"+n].indexOf(g) +
  254. "] defaultChecked wrong pass 11");
  255. is(g.checked, n == 1 && (group1.indexOf(g) == 1 ||
  256. group1.indexOf(g) == 2),
  257. "group" + n + "[" + window["group"+n].indexOf(g) +
  258. "] checked wrong pass 11");
  259. }
  260. }
  261. group1[0].checked = true;
  262. for (let n of [1, 2, 3]) {
  263. for (let g of window["group"+n]) {
  264. is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
  265. group1.indexOf(g) == 2),
  266. "group" + n + "[" + window["group"+n].indexOf(g) +
  267. "] defaultChecked wrong pass 12");
  268. is(g.checked, n == 1 && (group1.indexOf(g) == 1 ||
  269. group1.indexOf(g) == 0),
  270. "group" + n + "[" + window["group"+n].indexOf(g) +
  271. "] checked wrong pass 12");
  272. }
  273. }
  274. next = group2[1].nextSibling;
  275. p = group2[1].parentNode;
  276. p.removeChild(group2[1]);
  277. p.insertBefore(group2[1], next);
  278. group2[0].checked = true;
  279. for (let n of [1, 2, 3]) {
  280. for (let g of window["group"+n]) {
  281. is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
  282. group1.indexOf(g) == 2),
  283. "group" + n + "[" + window["group"+n].indexOf(g) +
  284. "] defaultChecked wrong pass 13");
  285. is(g.checked, (n == 1 && (group1.indexOf(g) == 1 ||
  286. group1.indexOf(g) == 0)) ||
  287. (n == 2 && group2.indexOf(g) == 0),
  288. "group" + n + "[" + window["group"+n].indexOf(g) +
  289. "] checked wrong pass 13");
  290. }
  291. }
  292. p.insertBefore(group2[1], next);
  293. for (let n of [1, 2, 3]) {
  294. for (let g of window["group"+n]) {
  295. is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
  296. group1.indexOf(g) == 2),
  297. "group" + n + "[" + window["group"+n].indexOf(g) +
  298. "] defaultChecked wrong pass 14");
  299. is(g.checked, (n == 1 && (group1.indexOf(g) == 1 ||
  300. group1.indexOf(g) == 0)) ||
  301. (n == 2 && group2.indexOf(g) == 0),
  302. "group" + n + "[" + window["group"+n].indexOf(g) +
  303. "] checked wrong pass 14");
  304. }
  305. }
  306. group2[1].defaultChecked = true;
  307. for (let n of [1, 2, 3]) {
  308. for (let g of window["group"+n]) {
  309. is(g.defaultChecked, (n == 1 && (group1.indexOf(g) == 0 ||
  310. group1.indexOf(g) == 2)) ||
  311. (n == 2 && group2.indexOf(g) == 1),
  312. "group" + n + "[" + window["group"+n].indexOf(g) +
  313. "] defaultChecked wrong pass 15");
  314. is(g.checked, (n == 1 && (group1.indexOf(g) == 1 ||
  315. group1.indexOf(g) == 0)) ||
  316. (n == 2 && group2.indexOf(g) == 0),
  317. "group" + n + "[" + window["group"+n].indexOf(g) +
  318. "] checked wrong pass 15");
  319. }
  320. }
  321. cleanup();
  322. }
  323. </script>
  324. </pre>
  325. </body>
  326. </html>