content/base/test/test_bug588990.html

changeset 0
6474c204b198
     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>

mercurial