1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/base/test/test_bug588990.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,336 @@ 1.4 +<html> 1.5 +<!-- 1.6 +https://bugzilla.mozilla.org/show_bug.cgi?id=588990 1.7 +--> 1.8 +<head> 1.9 + <title>Test for Bug 588990</title> 1.10 + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 1.11 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 1.12 +</head> 1.13 +<body> 1.14 +<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=588990">Mozilla Bug 588990</a> 1.15 +<!-- DOM to muck around with for tests --> 1.16 +<p id="root"> 1.17 +<img name="n1"> 1.18 +<img name="n2"> 1.19 +<img name="n2"> 1.20 +<img name="n3"> 1.21 +<img name="n3"> 1.22 +<img name="n3"> 1.23 +</p> 1.24 + 1.25 +<pre id="test"> 1.26 +<script class="testbody" type="text/javascript"> 1.27 + 1.28 +root = $('root'); 1.29 +i1_1 = root.children[0]; 1.30 +i2_1 = root.children[1]; 1.31 +i2_2 = root.children[2]; 1.32 +i3_1 = root.children[3]; 1.33 +i3_2 = root.children[4]; 1.34 +i3_3 = root.children[5]; 1.35 + 1.36 +function checkHasName(test) { 1.37 + // Check name first to avoid flushes from hiding problems 1.38 + checkHasNameNoDocProp(test); 1.39 + 1.40 + is(document.n1, i1_1, "i1_1 doc.name " + test); 1.41 + is(document.n2[0], i2_1, "i2_1 doc.name " + test); 1.42 + is(document.n2[1], i2_2, "i2_2 doc.name " + test); 1.43 + is(document.n2.length, 2, "doc.name.length " + test); 1.44 + is(document.n3[0], i3_1, "i3_1 doc.name " + test); 1.45 + is(document.n3[1], i3_2, "i3_2 doc.name " + test); 1.46 + is(document.n3[2], i3_3, "i3_3 doc.name " + test); 1.47 + is(document.n3.length, 3, "doc.name.length " + test); 1.48 +} 1.49 + 1.50 +function checkHasNameNoDocProp(test) { 1.51 + is(i1_1.name, "n1", "i1_1 name " + test); 1.52 + is(i2_1.name, "n2", "i2_1 name " + test); 1.53 + is(i2_2.name, "n2", "i2_2 name " + test); 1.54 + is(i3_1.name, "n3", "i3_1 name " + test); 1.55 + is(i3_2.name, "n3", "i3_2 name " + test); 1.56 + is(i3_3.name, "n3", "i3_3 name " + test); 1.57 +} 1.58 + 1.59 +function checkHasNoName(removed, test) { 1.60 + is(i1_1.name, "", "i1_1 name " + test); 1.61 + is(i2_1.name, "", "i2_1 name " + test); 1.62 + is(i2_2.name, "", "i2_2 name " + test); 1.63 + is(i3_1.name, "", "i3_1 name " + test); 1.64 + is(i3_2.name, "", "i3_2 name " + test); 1.65 + is(i3_3.name, "", "i3_3 name " + test); 1.66 + 1.67 + var attrValue = removed ? null : ""; 1.68 + is(i1_1.getAttribute("name"), attrValue, "i1_1 getAttribute " + test); 1.69 + is(i2_1.getAttribute("name"), attrValue, "i2_1 getAttribute " + test); 1.70 + is(i2_2.getAttribute("name"), attrValue, "i2_2 getAttribute " + test); 1.71 + is(i3_1.getAttribute("name"), attrValue, "i3_1 getAttribute " + test); 1.72 + is(i3_2.getAttribute("name"), attrValue, "i3_2 getAttribute " + test); 1.73 + is(i3_3.getAttribute("name"), attrValue, "i3_3 getAttribute " + test); 1.74 + 1.75 + is(document.n1, undefined, "doc.n1 " + test); 1.76 + is(document.n2, undefined, "doc.n2 " + test); 1.77 + is(document.n3, undefined, "doc.n3 " + test); 1.78 +} 1.79 + 1.80 +// Check that dynamic modifications of attribute work 1.81 + 1.82 +checkHasName("in markup"); 1.83 + 1.84 +i1_1.name = ""; 1.85 +i2_1.name = ""; 1.86 +i2_2.name = ""; 1.87 +i3_1.name = ""; 1.88 +i3_2.name = ""; 1.89 +i3_3.name = ""; 1.90 + 1.91 +checkHasNoName(false, "set to empty"); 1.92 + 1.93 +i1_1.name = "n1"; 1.94 +i2_1.name = "n2"; 1.95 +i2_2.name = "n2"; 1.96 +i3_1.name = "n3"; 1.97 +i3_2.name = "n3"; 1.98 +i3_3.name = "n3"; 1.99 + 1.100 +checkHasName("set using .name"); 1.101 + 1.102 +i1_1.setAttribute("name", ""); 1.103 +i2_1.setAttribute("name", ""); 1.104 +i2_2.setAttribute("name", ""); 1.105 +i3_1.setAttribute("name", ""); 1.106 +i3_2.setAttribute("name", ""); 1.107 +i3_3.setAttribute("name", ""); 1.108 + 1.109 +checkHasNoName(false, "setAttribute to empty"); 1.110 + 1.111 +i1_1.name = "n1"; 1.112 +i2_1.name = "n2"; 1.113 +i2_2.name = "n2"; 1.114 +i3_1.name = "n3"; 1.115 +i3_2.name = "n3"; 1.116 +i3_3.name = "n3"; 1.117 + 1.118 +checkHasName("set again using .name"); 1.119 + 1.120 +i1_1.removeAttribute("name"); 1.121 +i2_1.removeAttribute("name"); 1.122 +i2_2.removeAttribute("name"); 1.123 +i3_1.removeAttribute("name"); 1.124 +i3_2.removeAttribute("name"); 1.125 +i3_3.removeAttribute("name"); 1.126 + 1.127 +checkHasNoName(true, "removed attribute"); 1.128 + 1.129 +i1_1.setAttribute("name", "n1"); 1.130 +i2_1.setAttribute("name", "n2"); 1.131 +i2_2.setAttribute("name", "n2"); 1.132 +i3_1.setAttribute("name", "n3"); 1.133 +i3_2.setAttribute("name", "n3"); 1.134 +i3_3.setAttribute("name", "n3"); 1.135 + 1.136 +checkHasName("set using setAttribute"); 1.137 + 1.138 +t1 = document.createElement("img"); 1.139 +t1.name = "n1"; 1.140 +t2 = document.createElement("img"); 1.141 +t2.name = "n2"; 1.142 +t3 = document.createElement("img"); 1.143 +t3.name = "n2"; 1.144 +t4 = document.createElement("img"); 1.145 +t4.name = "n3"; 1.146 +t5 = document.createElement("img"); 1.147 +t5.name = "n3"; 1.148 +t6 = document.createElement("img"); 1.149 +t6.name = "n3"; 1.150 + 1.151 +// Check that inserting elements before/after existing work 1.152 + 1.153 +function insertAfter(newChild, existing) { 1.154 + existing.parentNode.insertBefore(newChild, existing.nextSibling); 1.155 +} 1.156 +function insertBefore(newChild, existing) { 1.157 + existing.parentNode.insertBefore(newChild, existing); 1.158 +} 1.159 +function removeNode(child) { 1.160 + child.parentNode.removeChild(child); 1.161 +} 1.162 + 1.163 +insertAfter(t1, i1_1); 1.164 +insertAfter(t2, i2_1); 1.165 +insertAfter(t3, i2_2); 1.166 +insertAfter(t4, i3_1); 1.167 +insertAfter(t5, i3_2); 1.168 +insertAfter(t6, i3_3); 1.169 + 1.170 +checkHasNameNoDocProp("inserted after"); 1.171 +is(document.n1[0], i1_1, "i1_1 doc.name inserted after"); 1.172 +is(document.n1[1], t1, "t1 doc.name inserted after"); 1.173 +is(document.n1.length, 2, "doc.name1.length inserted after"); 1.174 +is(document.n2[0], i2_1, "i2_1 doc.name inserted after"); 1.175 +todo_is(document.n2[1], t2, "This is where t2 should show up. The elements in here should be in order-in-document rather than order-of-insertion"); 1.176 +is(document.n2[1], i2_2, "i2_2 doc.name inserted after"); 1.177 +is(document.n2[2], t2, "t2 doc.name inserted after"); 1.178 +is(document.n2[3], t3, "t3 doc.name inserted after"); 1.179 +is(document.n2.length, 4, "doc.name2.length inserted after"); 1.180 +is(document.n3[0], i3_1, "i3_1 doc.name inserted after"); 1.181 +is(document.n3[1], i3_2, "i3_3 doc.name inserted after"); 1.182 +is(document.n3[2], i3_3, "i3_2 doc.name inserted after"); 1.183 +is(document.n3[3], t4, "t4 doc.name inserted after"); 1.184 +is(document.n3[4], t5, "t5 doc.name inserted after"); 1.185 +is(document.n3[5], t6, "t6 doc.name inserted after"); 1.186 +is(document.n3.length, 6, "doc.name3.length inserted after"); 1.187 + 1.188 + 1.189 +insertBefore(t1, i1_1); 1.190 +insertBefore(t2, i2_1); 1.191 +insertBefore(t3, i2_2); 1.192 +insertBefore(t4, i3_1); 1.193 +insertBefore(t5, i3_2); 1.194 +insertBefore(t6, i3_3); 1.195 + 1.196 +checkHasNameNoDocProp("inserted before"); 1.197 +is(document.n1[0], i1_1, "i1_1 doc.name inserted before"); 1.198 +is(document.n1[1], t1, "t1 doc.name inserted before"); 1.199 +is(document.n1.length, 2, "doc.name1.length inserted before"); 1.200 +is(document.n2[0], i2_1, "i2_1 doc.name inserted before"); 1.201 +is(document.n2[1], i2_2, "i2_2 doc.name inserted before"); 1.202 +is(document.n2[2], t2, "t2 doc.name inserted before"); 1.203 +is(document.n2[3], t3, "t3 doc.name inserted before"); 1.204 +is(document.n2.length, 4, "doc.name2.length inserted before"); 1.205 +is(document.n3[0], i3_1, "i3_1 doc.name inserted before"); 1.206 +is(document.n3[1], i3_2, "i3_3 doc.name inserted before"); 1.207 +is(document.n3[2], i3_3, "i3_2 doc.name inserted before"); 1.208 +is(document.n3[3], t4, "t4 doc.name inserted before"); 1.209 +is(document.n3[4], t5, "t5 doc.name inserted before"); 1.210 +is(document.n3[5], t6, "t6 doc.name inserted before"); 1.211 +is(document.n3.length, 6, "doc.name3.length inserted before"); 1.212 + 1.213 +t1.removeAttribute("name"); 1.214 +t2.removeAttribute("name"); 1.215 +t3.removeAttribute("name"); 1.216 +t4.removeAttribute("name"); 1.217 +t5.removeAttribute("name"); 1.218 +t6.removeAttribute("name"); 1.219 + 1.220 +checkHasName("removed tx attribute"); 1.221 + 1.222 +t1.setAttribute("name", "n1"); 1.223 +t2.setAttribute("name", "n2"); 1.224 +t3.setAttribute("name", "n2"); 1.225 +t4.setAttribute("name", "n3"); 1.226 +t5.setAttribute("name", "n3"); 1.227 +t6.setAttribute("name", "n3"); 1.228 + 1.229 +checkHasNameNoDocProp("inserted before"); 1.230 +is(document.n1[0], i1_1, "i1_1 doc.name inserted before"); 1.231 +is(document.n1[1], t1, "t1 doc.name inserted before"); 1.232 +is(document.n1.length, 2, "doc.name1.length inserted before"); 1.233 +is(document.n2[0], i2_1, "i2_1 doc.name inserted before"); 1.234 +is(document.n2[1], i2_2, "i2_2 doc.name inserted before"); 1.235 +is(document.n2[2], t2, "t2 doc.name inserted before"); 1.236 +is(document.n2[3], t3, "t3 doc.name inserted before"); 1.237 +is(document.n2.length, 4, "doc.name2.length inserted before"); 1.238 +is(document.n3[0], i3_1, "i3_1 doc.name inserted before"); 1.239 +is(document.n3[1], i3_2, "i3_3 doc.name inserted before"); 1.240 +is(document.n3[2], i3_3, "i3_2 doc.name inserted before"); 1.241 +is(document.n3[3], t4, "t4 doc.name inserted before"); 1.242 +is(document.n3[4], t5, "t5 doc.name inserted before"); 1.243 +is(document.n3[5], t6, "t6 doc.name inserted before"); 1.244 +is(document.n3.length, 6, "doc.name3.length inserted before"); 1.245 + 1.246 +removeNode(t1); 1.247 +removeNode(t2); 1.248 +removeNode(t3); 1.249 +removeNode(t4); 1.250 +removeNode(t5); 1.251 +removeNode(t6); 1.252 + 1.253 +checkHasName("removed temporaries"); 1.254 + 1.255 +removeNode(i1_1); 1.256 +removeNode(i2_1); 1.257 +removeNode(i2_2); 1.258 +removeNode(i3_1); 1.259 +removeNode(i3_2); 1.260 +removeNode(i3_3); 1.261 + 1.262 +checkHasNameNoDocProp("removed node"); 1.263 + 1.264 +// Check that removing an element during UnsetAttr works 1.265 +is(i1_1.name, "n1", "i1_1 has name set"); 1.266 +var mutateFired = false; 1.267 +root.appendChild(i1_1); 1.268 +i1_1.addEventListener("DOMAttrModified", function(e) { 1.269 + i1_1.removeEventListener("DOMAttrModified", arguments.callee, false); 1.270 + is(e.target, i1_1, "target is i1_1"); 1.271 + is(i1_1.name, "", "i1_1 no longer has name"); 1.272 + is(i1_1.getAttribute("name"), null, "i1_1 no longer has name attr"); 1.273 + removeNode(i1_1); 1.274 + is(i1_1.parentNode, null, "i1_1 was removed"); 1.275 + mutateFired = true; 1.276 +}, false); 1.277 +i1_1.removeAttribute("name"); 1.278 +ok(mutateFired, "mutation event fired"); 1.279 +SpecialPowers.gc(); 1.280 + 1.281 +// Check that removing an element during SetAttr works 1.282 +i2_1.name = ""; 1.283 +mutateFired = false; 1.284 +root.appendChild(i2_1); 1.285 +i2_1.addEventListener("DOMAttrModified", function(e) { 1.286 + i2_1.removeEventListener("DOMAttrModified", arguments.callee, false); 1.287 + is(e.target, i2_1, "target is i2_1"); 1.288 + is(i2_1.name, "n2", "i2_1 no longer has name"); 1.289 + is(i2_1.getAttribute("name"), "n2", "i2_1 no longer has name attr"); 1.290 + removeNode(i2_1); 1.291 + is(i2_1.parentNode, null, "i2_1 was removed"); 1.292 + mutateFired = true; 1.293 +}, false); 1.294 +i2_1.name = "n2"; 1.295 +ok(mutateFired, "mutation event fired"); 1.296 +SpecialPowers.gc(); 1.297 + 1.298 +// Re-add the name inside a mutation event on a HTML element 1.299 +is(i2_2.name, "n2", "i2_2 has name set"); 1.300 +root.appendChild(i2_2); 1.301 +mutateFired = false; 1.302 +root.appendChild(i2_2); 1.303 +i2_2.addEventListener("DOMAttrModified", function(e) { 1.304 + i2_2.removeEventListener("DOMAttrModified", arguments.callee, false); 1.305 + is(e.target, i2_2, "target is i2_2"); 1.306 + is(i2_2.name, "", "i2_2 no longer has name"); 1.307 + is(i2_2.getAttribute("name"), "", "i2_2 has empty name attr"); 1.308 + i2_2.name = "n2"; 1.309 + mutateFired = true; 1.310 +}, false); 1.311 +i2_2.name = ""; 1.312 +ok(mutateFired, "mutation event fired"); 1.313 +is(document.n2, i2_2, "named was readded during mutation"); 1.314 +removeNode(i2_2); 1.315 +SpecialPowers.gc(); 1.316 + 1.317 +// Re-remove the name inside a mutation event on a HTML element 1.318 +i3_1.name = ""; 1.319 +root.appendChild(i3_1); 1.320 +mutateFired = false; 1.321 +root.appendChild(i3_1); 1.322 +i3_1.addEventListener("DOMAttrModified", function(e) { 1.323 + i3_1.removeEventListener("DOMAttrModified", arguments.callee, false); 1.324 + is(e.target, i3_1, "target is i3_1"); 1.325 + is(i3_1.name, "n3", "i3_1 no longer has name"); 1.326 + is(i3_1.getAttribute("name"), "n3", "i3_1 has empty name attr"); 1.327 + i3_1.removeAttribute("name"); 1.328 + mutateFired = true; 1.329 +}, false); 1.330 +i3_1.name = "n3"; 1.331 +ok(mutateFired, "mutation event fired"); 1.332 +is(document.n3, undefined, "named was readded during mutation"); 1.333 +removeNode(i3_1); 1.334 +SpecialPowers.gc(); 1.335 + 1.336 +</script> 1.337 +</pre> 1.338 +</body> 1.339 +</html>