OLD | NEW |
(Empty) | |
| 1 <!DOCTYPE HTML> |
| 2 <meta charset=utf-8> |
| 3 <title>MutationObservers: attributes mutations</title> |
| 4 <script src="../../../../resources/testharness.js"></script> |
| 5 <script src="../../../../resources/testharnessreport.js"></script> |
| 6 <script src="mutationobservers.js"></script> |
| 7 <h1>MutationObservers: attributes mutations</h1> |
| 8 <div id="log"></div> |
| 9 |
| 10 <section style="display: none"> |
| 11 <p id='n'></p> |
| 12 |
| 13 <p id='n00'></p> |
| 14 <p id='n01'></p> |
| 15 <p id='n02'></p> |
| 16 <p id='n03'></p> |
| 17 <input id="n04" type="text"> |
| 18 |
| 19 <p id='n10'></p> |
| 20 <p id='n11'></p> |
| 21 <p id='n12' class='c01'></p> |
| 22 <p id='n13' class='c01 c02'></p> |
| 23 |
| 24 <p id='n20'></p> |
| 25 <p id='n21'></p> |
| 26 <p id='n22'></p> |
| 27 <p id='n23'></p> |
| 28 <p id='n24' class="c01 c02"></p> |
| 29 |
| 30 <p id='n30' class="c01 c02"></p> |
| 31 <p id='n31' class="c01 c02"></p> |
| 32 <p id='n32' class="c01 c02"></p> |
| 33 |
| 34 <p id='n40' class="c01 c02"></p> |
| 35 <p id='n41' class="c01 c02"></p> |
| 36 <p id='n42' class="c01 c02"></p> |
| 37 <p id='n43' class="c01 c02"></p> |
| 38 <p id='n44' class="c01 c02"></p> |
| 39 <p id='n45' class="c01 c02"></p> |
| 40 |
| 41 <p id='n50' class="c01 c02"></p> |
| 42 <p id='n51'></p> |
| 43 |
| 44 <p id='n60'></p> |
| 45 <p id='n61' class="c01"></p> |
| 46 <p id='n62'></p> |
| 47 |
| 48 <p id='n70' class="c01"></p> |
| 49 <p id='n71'></p> |
| 50 <input id="n72" type="text"> |
| 51 |
| 52 <p id='n80'></p> |
| 53 <p id='n81'></p> |
| 54 |
| 55 <p id='n90'></p> |
| 56 <p id='n91'></p> |
| 57 <p id='n92'></p> |
| 58 |
| 59 <p id='n1000'></p> |
| 60 <p id='n1001' class='c01'></p> |
| 61 |
| 62 <p id='n2000'></p> |
| 63 <p id='n2001' class='c01'></p> |
| 64 |
| 65 <p id='n3000'></p> |
| 66 |
| 67 </section> |
| 68 |
| 69 <script> |
| 70 |
| 71 var n = document.getElementById('n'); |
| 72 |
| 73 runMutationTest(n, |
| 74 {"attributes":true}, |
| 75 [{type: "attributes", attributeName: "id"}], |
| 76 function() { n.id = "n000";}, |
| 77 "attributes Element.id: update, no oldValue, mutation"); |
| 78 |
| 79 var n00 = document.getElementById('n00'); |
| 80 runMutationTest(n00, |
| 81 {"attributes":true, "attributeOldValue": true}, |
| 82 [{type: "attributes", oldValue: "n00", attributeName: "id"}], |
| 83 function() { n00.id = "n000";}, |
| 84 "attributes Element.id: update mutation"); |
| 85 |
| 86 var n01 = document.getElementById('n01'); |
| 87 runMutationTest(n01, |
| 88 {"attributes":true, "attributeOldValue": true}, |
| 89 [{type: "attributes", oldValue: "n01", attributeName: "id"}], |
| 90 function() { n01.id = "";}, |
| 91 "attributes Element.id: empty string update mutation"); |
| 92 |
| 93 var n02 = document.getElementById('n02'); |
| 94 runMutationTest(n02, |
| 95 {"attributes":true, "attributeOldValue": true}, |
| 96 [{type: "attributes", oldValue: "n02", attributeName: "id"}, {
type: "attributes", attributeName: "class"}], |
| 97 function() { n02.id = "n02"; n02.setAttribute("class", "c01");
}, |
| 98 "attributes Element.id: same value mutation"); |
| 99 |
| 100 var n03 = document.getElementById('n03'); |
| 101 runMutationTest(n03, |
| 102 {"attributes":true, "attributeOldValue": true}, |
| 103 [{type: "attributes", oldValue: "n03", attributeName: "id"}], |
| 104 function() { n03.unknown = "c02"; n03.id = "n030";}, |
| 105 "attributes Element.unknown: IDL attribute no mutation"); |
| 106 |
| 107 var n04 = document.getElementById('n04'); |
| 108 runMutationTest(n04, |
| 109 {"attributes":true, "attributeOldValue": true}, |
| 110 [{type: "attributes", oldValue: "text", attributeName: "type"}
, {type: "attributes", oldValue: "n04", attributeName: "id"}], |
| 111 function() { n04.type = "unknown"; n04.id = "n040";}, |
| 112 "attributes HTMLInputElement.type: type update mutation"); |
| 113 |
| 114 var n10 = document.getElementById('n10'); |
| 115 runMutationTest(n10, |
| 116 {"attributes":true, "attributeOldValue": true}, |
| 117 [{type: "attributes", attributeName: "class"}], |
| 118 function() { n10.className = "c01";}, |
| 119 "attributes Element.className: new value mutation"); |
| 120 |
| 121 var n11 = document.getElementById('n11'); |
| 122 runMutationTest(n11, |
| 123 {"attributes":true, "attributeOldValue": true}, |
| 124 [{type: "attributes", attributeName: "class"}], |
| 125 function() { n11.className = "";}, |
| 126 "attributes Element.className: empty string update mutation"); |
| 127 |
| 128 var n12 = document.getElementById('n12'); |
| 129 runMutationTest(n12, |
| 130 {"attributes":true, "attributeOldValue": true}, |
| 131 [{type: "attributes", oldValue: "c01", attributeName: "class"}
], |
| 132 function() { n12.className = "c01";}, |
| 133 "attributes Element.className: same value mutation"); |
| 134 |
| 135 var n13 = document.getElementById('n13'); |
| 136 runMutationTest(n13, |
| 137 {"attributes":true, "attributeOldValue": true}, |
| 138 [{type: "attributes", oldValue: "c01 c02", attributeName: "cla
ss"}], |
| 139 function() { n13.className = "c01 c02";}, |
| 140 "attributes Element.className: same multiple values mutation")
; |
| 141 |
| 142 var n20 = document.getElementById('n20'); |
| 143 runMutationTest(n20, |
| 144 {"attributes":true, "attributeOldValue": true}, |
| 145 [{type: "attributes", attributeName: "class"}], |
| 146 function() { n20.classList.add("c01");}, |
| 147 "attributes Element.classList.add: single token addition mutat
ion"); |
| 148 |
| 149 var n21 = document.getElementById('n21'); |
| 150 runMutationTest(n21, |
| 151 {"attributes":true, "attributeOldValue": true}, |
| 152 [{type: "attributes", attributeName: "class"}], |
| 153 function() { n21.classList.add("c01", "c02", "c03");}, |
| 154 "attributes Element.classList.add: multiple tokens addition mu
tation"); |
| 155 |
| 156 var n22 = document.getElementById('n22'); |
| 157 runMutationTest(n22, |
| 158 {"attributes":true, "attributeOldValue": true}, |
| 159 [{type: "attributes", oldValue: "n22", attributeName: "id"}], |
| 160 function() { try { n22.classList.add("c01", "", "c03"); } catc
h (e) { }; |
| 161 n22.id = "n220"; }, |
| 162 "attributes Element.classList.add: syntax err/no mutation"); |
| 163 |
| 164 var n23 = document.getElementById('n23'); |
| 165 runMutationTest(n23, |
| 166 {"attributes":true, "attributeOldValue": true}, |
| 167 [{type: "attributes", oldValue: "n23", attributeName: "id"}], |
| 168 function() { try { n23.classList.add("c01", "c 02", "c03"); }
catch (e) { }; |
| 169 n23.id = "n230"; }, |
| 170 "attributes Element.classList.add: invalid character/no mutati
on"); |
| 171 |
| 172 var n24 = document.getElementById('n24'); |
| 173 runMutationTest(n24, |
| 174 {"attributes":true, "attributeOldValue": true}, |
| 175 [{type: "attributes", oldValue: "c01 c02", attributeName: "cla
ss"}, {type: "attributes", oldValue: "n24", attributeName: "id"}], |
| 176 function() { n24.classList.add("c02"); n24.id = "n240";}, |
| 177 "attributes Element.classList.add: same value mutation"); |
| 178 |
| 179 var n30 = document.getElementById('n30'); |
| 180 runMutationTest(n30, |
| 181 {"attributes":true, "attributeOldValue": true}, |
| 182 [{type: "attributes", oldValue: "c01 c02", attributeName: "cla
ss"}], |
| 183 function() { n30.classList.remove("c01");}, |
| 184 "attributes Element.classList.remove: single token removal mut
ation"); |
| 185 |
| 186 var n31 = document.getElementById('n31'); |
| 187 runMutationTest(n31, |
| 188 {"attributes":true, "attributeOldValue": true}, |
| 189 [{type: "attributes", oldValue: "c01 c02", attributeName: "cla
ss"}], |
| 190 function() { n31.classList.remove("c01", "c02");}, |
| 191 "attributes Element.classList.remove: multiple tokens removal
mutation"); |
| 192 |
| 193 var n32 = document.getElementById('n32'); |
| 194 runMutationTest(n32, |
| 195 {"attributes":true, "attributeOldValue": true}, |
| 196 [{type: "attributes", oldValue: "c01 c02", attributeName: "cla
ss"}, {type: "attributes", oldValue: "n32", attributeName: "id"}], |
| 197 function() { n32.classList.remove("c03"); n32.id = "n320";}, |
| 198 "attributes Element.classList.remove: missing token removal mu
tation"); |
| 199 |
| 200 var n40 = document.getElementById('n40'); |
| 201 runMutationTest(n40, |
| 202 {"attributes":true, "attributeOldValue": true}, |
| 203 [{type: "attributes", oldValue: "c01 c02", attributeName: "cla
ss"}], |
| 204 function() { n40.classList.toggle("c01");}, |
| 205 "attributes Element.classList.toggle: token removal mutation")
; |
| 206 |
| 207 var n41 = document.getElementById('n41'); |
| 208 runMutationTest(n41, |
| 209 {"attributes":true, "attributeOldValue": true}, |
| 210 [{type: "attributes", oldValue: "c01 c02", attributeName: "cla
ss"}], |
| 211 function() { n41.classList.toggle("c03");}, |
| 212 "attributes Element.classList.toggle: token addition mutation"
); |
| 213 |
| 214 var n42 = document.getElementById('n42'); |
| 215 runMutationTest(n42, |
| 216 {"attributes":true, "attributeOldValue": true}, |
| 217 [{type: "attributes", oldValue: "c01 c02", attributeName: "cla
ss"}], |
| 218 function() { n42.classList.toggle("c01", false);}, |
| 219 "attributes Element.classList.toggle: forced token removal mut
ation"); |
| 220 |
| 221 var n43 = document.getElementById('n43'); |
| 222 runMutationTest(n43, |
| 223 {"attributes":true, "attributeOldValue": true}, |
| 224 [{type: "attributes", oldValue: "n43", attributeName: "id"}], |
| 225 function() { n43.classList.toggle("c03", false); n43.id = "n43
0"; }, |
| 226 "attributes Element.classList.toggle: forced missing token rem
oval no mutation"); |
| 227 |
| 228 var n44 = document.getElementById('n44'); |
| 229 runMutationTest(n44, |
| 230 {"attributes":true, "attributeOldValue": true}, |
| 231 [{type: "attributes", oldValue: "n44", attributeName: "id"}], |
| 232 function() { n44.classList.toggle("c01", true); n44.id = "n440
"; }, |
| 233 "attributes Element.classList.toggle: forced existing token ad
dition no mutation"); |
| 234 |
| 235 var n45 = document.getElementById('n45'); |
| 236 runMutationTest(n45, |
| 237 {"attributes":true, "attributeOldValue": true}, |
| 238 [{type: "attributes", oldValue: "c01 c02", attributeName: "cla
ss"}], |
| 239 function() { n45.classList.toggle("c03", true);}, |
| 240 "attributes Element.classList.toggle: forced token addition mu
tation"); |
| 241 |
| 242 var n50 = document.getElementById('n50'); |
| 243 runMutationTest(n50, |
| 244 {"attributes":true, "attributeOldValue": true}, |
| 245 [{type: "attributes", oldValue: "c01 c02", attributeName: "cla
ss"}], |
| 246 function() { |
| 247 for (var i = 0; i < n50.attributes.length; i++) { |
| 248 var attr = n50.attributes[i]; |
| 249 if (attr.localName === "class") { |
| 250 attr.value = "c03"; |
| 251 } |
| 252 }; |
| 253 }, |
| 254 "attributes Element.attributes.value: update mutation"); |
| 255 |
| 256 var n51 = document.getElementById('n51'); |
| 257 runMutationTest(n51, |
| 258 {"attributes":true, "attributeOldValue": true}, |
| 259 [{type: "attributes", oldValue: "n51", attributeName: "id"}], |
| 260 function() { |
| 261 n51.attributes[0].value = "n51"; |
| 262 }, |
| 263 "attributes Element.attributes.value: same id mutation"); |
| 264 |
| 265 var n60 = document.getElementById('n60'); |
| 266 runMutationTest(n60, |
| 267 {"attributes":true, "attributeOldValue": true}, |
| 268 [{type: "attributes", oldValue: "n60", attributeName: "id"}], |
| 269 function() { |
| 270 n60.setAttribute("id", "n601"); |
| 271 }, |
| 272 "attributes Element.setAttribute: id mutation"); |
| 273 |
| 274 var n61 = document.getElementById('n61'); |
| 275 runMutationTest(n61, |
| 276 {"attributes":true, "attributeOldValue": true}, |
| 277 [{type: "attributes", oldValue: "c01", attributeName: "class"}
], |
| 278 function() { |
| 279 n61.setAttribute("class", "c01"); |
| 280 }, |
| 281 "attributes Element.setAttribute: same class mutation"); |
| 282 |
| 283 var n62 = document.getElementById('n62'); |
| 284 runMutationTest(n62, |
| 285 {"attributes":true, "attributeOldValue": true}, |
| 286 [{type: "attributes", attributeName: "classname"}], |
| 287 function() { |
| 288 n62.setAttribute("classname", "c01"); |
| 289 }, |
| 290 "attributes Element.setAttribute: classname mutation"); |
| 291 |
| 292 var n70 = document.getElementById('n70'); |
| 293 runMutationTest(n70, |
| 294 {"attributes":true, "attributeOldValue": true}, |
| 295 [{type: "attributes", oldValue: "c01", attributeName: "class"}
], |
| 296 function() { |
| 297 n70.removeAttribute("class"); |
| 298 }, |
| 299 "attributes Element.removeAttribute: removal mutation"); |
| 300 |
| 301 var n71 = document.getElementById('n71'); |
| 302 runMutationTest(n71, |
| 303 {"attributes":true, "attributeOldValue": true}, |
| 304 [{type: "attributes", oldValue: "n71", attributeName: "id"}], |
| 305 function() { |
| 306 n71.removeAttribute("class"); |
| 307 n71.id = "n710"; |
| 308 }, |
| 309 "attributes Element.removeAttribute: removal no mutation"); |
| 310 |
| 311 var n72 = document.getElementById('n72'); |
| 312 runMutationTest(n72, |
| 313 {"attributes":true, "attributeOldValue": true}, |
| 314 [{type: "attributes", oldValue: "text", attributeName: "type"}
, {type: "attributes", oldValue: "n72", attributeName: "id"}], |
| 315 function() { |
| 316 n72.removeAttribute("type"); |
| 317 n72.id = "n720"; |
| 318 }, |
| 319 "childList HTMLInputElement.removeAttribute: type removal muta
tion"); |
| 320 |
| 321 var n80 = document.getElementById('n80'); |
| 322 runMutationTest(n80, |
| 323 {"attributes":true, "attributeOldValue": true}, |
| 324 [{type: "attributes", attributeName: "private", attributeNames
pace: "http://example.org/"}], |
| 325 function() { |
| 326 n80.setAttributeNS("http://example.org/", "private", "42"); |
| 327 }, |
| 328 "attributes Element.setAttributeNS: creation mutation"); |
| 329 |
| 330 var n81 = document.getElementById('n81'); |
| 331 runMutationTest(n81, |
| 332 {"attributes":true, "attributeOldValue": true}, |
| 333 [{type: "attributes", attributeName: "lang", attributeNamespac
e: "http://www.w3.org/XML/1998/namespace"}], |
| 334 function() { |
| 335 n81.setAttributeNS("http://www.w3.org/XML/1998/namespace", "
xml:lang", "42"); |
| 336 }, |
| 337 "attributes Element.setAttributeNS: prefixed attribute creatio
n mutation"); |
| 338 |
| 339 var n90 = document.getElementById('n90'); |
| 340 n90.setAttributeNS("http://example.org/", "private", "42"); |
| 341 runMutationTest(n90, |
| 342 {"attributes":true, "attributeOldValue": true}, |
| 343 [{type: "attributes", oldValue: "42", attributeName: "private"
, attributeNamespace: "http://example.org/"}], |
| 344 function() { |
| 345 n90.removeAttributeNS("http://example.org/", "private"); |
| 346 }, |
| 347 "attributes Element.removeAttributeNS: removal mutation"); |
| 348 |
| 349 var n91 = document.getElementById('n91'); |
| 350 runMutationTest(n91, |
| 351 {"attributes":true, "attributeOldValue": true}, |
| 352 [{type: "attributes", oldValue: "n91", attributeName: "id"}], |
| 353 function() { |
| 354 n91.removeAttributeNS("http://example.org/", "private"); |
| 355 n91.id = "n910"; |
| 356 }, |
| 357 "attributes Element.removeAttributeNS: removal no mutation"); |
| 358 |
| 359 var n92 = document.getElementById('n92'); |
| 360 runMutationTest(n92, |
| 361 {"attributes":true, "attributeOldValue": true}, |
| 362 [{type: "attributes", oldValue: "n92", attributeName: "id"}], |
| 363 function() { |
| 364 n92.removeAttributeNS("http://www.w3.org/XML/1998/namespace"
, "xml:lang"); |
| 365 n92.id = "n920"; |
| 366 }, |
| 367 "attributes Element.removeAttributeNS: prefixed attribute remo
val no mutation"); |
| 368 |
| 369 var n1000 = document.getElementById('n1000'); |
| 370 runMutationTest(n1000, |
| 371 {"attributes":true, "attributeOldValue": true,"attributeFilter
": ["id"]}, |
| 372 [{type: "attributes", oldValue: "n1000", attributeName: "id"}]
, |
| 373 function() { n1000.id = "abc"; n1000.className = "c01"}, |
| 374 "attributes/attributeFilter Element.id/Element.className: upda
te mutation"); |
| 375 |
| 376 var n1001 = document.getElementById('n1001'); |
| 377 runMutationTest(n1001, |
| 378 {"attributes":true, "attributeOldValue": true,"attributeFilter
": ["id", "class"]}, |
| 379 [{type: "attributes", oldValue: "n1001", attributeName: "id"}, |
| 380 {type: "attributes", oldValue: "c01", attributeName: "class"}
], |
| 381 function() { n1001.id = "abc"; n1001.className = "c02"; n1001.
setAttribute("lang", "fr");}, |
| 382 "attributes/attributeFilter Element.id/Element.className: mult
iple filter update mutation"); |
| 383 |
| 384 var n2000 = document.getElementById('n2000'); |
| 385 runMutationTest(n2000, |
| 386 {"attributeOldValue": true}, |
| 387 [{type: "attributes", oldValue: "n2000", attributeName: "id"}]
, |
| 388 function() { n2000.id = "abc";}, |
| 389 "attributeOldValue alone Element.id: update mutation"); |
| 390 |
| 391 var n2001 = document.getElementById('n2001'); |
| 392 runMutationTest(n2001, |
| 393 {"attributeFilter": ["id", "class"]}, |
| 394 [{type: "attributes", attributeName: "id"}, |
| 395 {type: "attributes", attributeName: "class"}], |
| 396 function() { n2001.id = "abcd"; n2001.className = "c02"; n2001
.setAttribute("lang", "fr");}, |
| 397 "attributeFilter alone Element.id/Element.className: multiple
filter update mutation"); |
| 398 |
| 399 var n3000 = document.getElementById('n3000'); |
| 400 runMutationTest(n3000, |
| 401 {"subtree": true, "childList":false, "attributes" : true}, |
| 402 [{type: "attributes", attributeName: "id" }], |
| 403 function() { n3000.textContent = "CHANGED"; n3000.id = "abc";}
, |
| 404 "childList false: no childList mutation"); |
| 405 |
| 406 </script> |
OLD | NEW |