tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

relevant-mutations.html (27369B)


      1 <!doctype html>
      2 <title>img relevant mutations</title>
      3 <meta name="timeout" content="long">
      4 <script src="/resources/testharness.js"></script>
      5 <script src="/resources/testharnessreport.js"></script>
      6 <script src="support/relevant-mutations.js"></script>
      7 <div id=log></div>
      8 
      9 <!-- should invoke update the image data -->
     10 
     11 <img data-desc="src set">
     12 <img src="/images/green-2x2.png" data-desc="src changed">
     13 <img src="/images/green-2x2.png" data-desc="src removed">
     14 
     15 <img data-desc="srcset set">
     16 <img srcset="/images/green-2x2.png" data-desc="srcset changed">
     17 <img srcset="/images/green-2x2.png" data-desc="srcset removed">
     18 
     19 <img data-desc="sizes set">
     20 <img sizes="" data-desc="sizes changed">
     21 <img sizes="" data-desc="sizes removed">
     22 
     23 <img src="/images/green-2x2.png" data-desc="src set to same value">
     24 
     25 <img data-desc="crossorigin absent to empty, src absent">
     26 <img data-desc="crossorigin absent to anonymous, src absent">
     27 <img data-desc="crossorigin absent to use-credentials, src absent">
     28 <img crossorigin data-desc="crossorigin empty to absent, src absent">
     29 <img crossorigin data-desc="crossorigin empty to use-credentials, src absent">
     30 <img crossorigin=anonymous data-desc="crossorigin anonymous to absent, src absent">
     31 <img crossorigin=anonymous data-desc="crossorigin anonymous to use-credentials, src absent">
     32 <img crossorigin=use-credentials data-desc="crossorigin use-credentials to absent, src absent">
     33 <img crossorigin=use-credentials data-desc="crossorigin use-credentials to empty, src absent">
     34 <img crossorigin=use-credentials data-desc="crossorigin use-credentials to anonymous, src absent">
     35 <img crossorigin=use-credentials data-desc="crossorigin use-credentials to invalid, src absent">
     36 
     37 <img src="/images/green-2x2.png" data-desc="crossorigin absent to empty, src already set">
     38 <img src="/images/green-2x2.png" data-desc="crossorigin absent to anonymous, src already set">
     39 <img src="/images/green-2x2.png" data-desc="crossorigin absent to use-credentials, src already set">
     40 <img src="/images/green-2x2.png" crossorigin data-desc="crossorigin empty to absent, src already set">
     41 <img src="/images/green-2x2.png" crossorigin data-desc="crossorigin empty to use-credentials, src already set">
     42 <img src="/images/green-2x2.png" crossorigin=anonymous data-desc="crossorigin anonymous to absent, src already set">
     43 <img src="/images/green-2x2.png" crossorigin=anonymous data-desc="crossorigin anonymous to use-credentials, src already set">
     44 <img src="/images/green-2x2.png" crossorigin=use-credentials data-desc="crossorigin use-credentials to absent, src already set">
     45 <img src="/images/green-2x2.png" crossorigin=use-credentials data-desc="crossorigin use-credentials to empty, src already set">
     46 <img src="/images/green-2x2.png" crossorigin=use-credentials data-desc="crossorigin use-credentials to anonymous, src already set">
     47 <img src="/images/green-2x2.png" crossorigin=use-credentials data-desc="crossorigin use-credentials to invalid, src already set">
     48 
     49 <img data-desc="referrerpolicy absent to no-referrer-when-downgrade, src absent">
     50 <img data-desc="referrerpolicy absent to no-referrer, src absent">
     51 <img referrerpolicy data-desc="referrerpolicy empty to no-referrer-when-downgrade, src absent">
     52 <img referrerpolicy data-desc="referrerpolicy empty to no-referrer, src absent">
     53 <img referrerpolicy=no-referrer-when-downgrade data-desc="referrerpolicy no-referrer-when-downgrade to absent, src absent">
     54 <img referrerpolicy=no-referrer-when-downgrade data-desc="referrerpolicy no-referrer-when-downgrade to empty, src absent">
     55 <img referrerpolicy=no-referrer-when-downgrade data-desc="referrerpolicy no-referrer-when-downgrade to no-referrer, src absent">
     56 <img referrerpolicy=no-referrer-when-downgrade data-desc="referrerpolicy no-referrer-when-downgrade to invalid, src absent">
     57 <img referrerpolicy=no-referrer data-desc="referrerpolicy no-referrer to absent, src absent">
     58 <img referrerpolicy=no-referrer data-desc="referrerpolicy no-referrer to empty, src absent">
     59 <img referrerpolicy=no-referrer data-desc="referrerpolicy no-referrer to no-referrer-when-downgrade, src absent">
     60 <img referrerpolicy=no-referrer data-desc="referrerpolicy no-referrer to invalid, src absent">
     61 
     62 <img src="/images/green-2x2.png" data-desc="referrerpolicy absent to no-referrer-when-downgrade, src already set">
     63 <img src="/images/green-2x2.png" data-desc="referrerpolicy absent to no-referrer, src already set">
     64 <img src="/images/green-2x2.png" referrerpolicy data-desc="referrerpolicy empty to no-referrer-when-downgrade, src already set">
     65 <img src="/images/green-2x2.png" referrerpolicy data-desc="referrerpolicy empty to no-referrer, src already set">
     66 <img src="/images/green-2x2.png" referrerpolicy=no-referrer-when-downgrade data-desc="referrerpolicy no-referrer-when-downgrade to absent, src already set">
     67 <img src="/images/green-2x2.png" referrerpolicy=no-referrer-when-downgrade data-desc="referrerpolicy no-referrer-when-downgrade to empty, src already set">
     68 <img src="/images/green-2x2.png" referrerpolicy=no-referrer-when-downgrade data-desc="referrerpolicy no-referrer-when-downgrade to no-referrer, src already set">
     69 <img src="/images/green-2x2.png" referrerpolicy=no-referrer-when-downgrade data-desc="referrerpolicy no-referrer-when-downgrade to invalid, src already set">
     70 <img src="/images/green-2x2.png" referrerpolicy=no-referrer data-desc="referrerpolicy no-referrer to absent, src already set">
     71 <img src="/images/green-2x2.png" referrerpolicy=no-referrer data-desc="referrerpolicy no-referrer to empty, src already set">
     72 <img src="/images/green-2x2.png" referrerpolicy=no-referrer data-desc="referrerpolicy no-referrer to no-referrer-when-downgrade, src already set">
     73 <img src="/images/green-2x2.png" referrerpolicy=no-referrer data-desc="referrerpolicy no-referrer to invalid, src already set">
     74 
     75 <img src="/images/green-2x2.png" data-desc="inserted into picture"><picture></picture>
     76 
     77 <picture><img src="/images/green-2x2.png" data-desc="removed from picture"></picture>
     78 
     79 <picture><img src="/images/green-2x2.png" data-desc="parent is picture, previous source inserted"></picture>
     80 
     81 <picture><source><img src="/images/green-2x2.png" data-desc="parent is picture, previous source removed"></picture>
     82 
     83 <picture><source><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has srcset set"></picture>
     84 <picture><source srcset=""><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has srcset changed"></picture>
     85 <picture><source srcset=""><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has srcset removed"></picture>
     86 
     87 <picture><source><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has sizes set"></picture>
     88 <picture><source sizes=""><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has sizes changed"></picture>
     89 <picture><source sizes=""><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has sizes removed"></picture>
     90 
     91 <picture><source><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has media set"></picture>
     92 <picture><source media=""><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has media changed"></picture>
     93 <picture><source media=""><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has media removed"></picture>
     94 
     95 <picture><source><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has type set"></picture>
     96 <picture><source type=""><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has type changed"></picture>
     97 <picture><source type=""><img src="/images/green-2x2.png" data-desc="parent is picture, previous source has type removed"></picture>
     98 
     99 <img srcset="/images/green-2x2.png" data-desc="srcset is set to same value">
    100 <img srcset="/images/green-2x2.png" sizes data-desc="sizes is set to same value">
    101 
    102 <img src="/images/green-2x2.png" data-desc="crossorigin state not changed: absent, removeAttribute">
    103 <img src="/images/green-2x2.png" crossorigin data-desc="crossorigin state not changed: empty to anonymous">
    104 <img src="/images/green-2x2.png" crossorigin=anonymous data-desc="crossorigin state not changed: anonymous to foobar">
    105 <img src="/images/green-2x2.png" crossorigin=use-credentials data-desc="crossorigin state not changed: use-credentials to USE-CREDENTIALS">
    106 
    107 <img src="/images/green-2x2.png" data-desc="referrerpolicy state not changed: absent, removeAttribute">
    108 <img src="/images/green-2x2.png" referrerpolicy data-desc="referrerpolicy state not changed: empty to empty">
    109 <img src="/images/green-2x2.png" referrerpolicy data-desc="referrerpolicy state not changed: empty to invalid">
    110 <img src="/images/green-2x2.png" data-desc="referrerpolicy state not changed: absent to invalid">
    111 <img src="/images/green-2x2.png" referrerpolicy=no-referrer data-desc="referrerpolicy state not changed: no-referrer to NO-REFERRER">
    112 <img src="/images/green-2x2.png" referrerpolicy=foobar data-desc="referrerpolicy state not changed: invalid to other-invalid">
    113 
    114 <img src="/images/green-2x2.png" data-desc="inserted into picture ancestor"><picture><span></span></picture>
    115 <picture><span><img src="/images/green-2x2.png" data-desc="removed from picture ancestor"></span></picture>
    116 
    117 <picture><span><img src="/images/green-2x2.png" data-desc="ancestor picture has a source inserted"></span></picture>
    118 <picture><source><span><img src="/images/green-2x2.png" data-desc="ancestor picture has a source removed"></span></picture>
    119 
    120 <picture><span><img src="/images/green-2x2.png" data-desc="ancestor picture; previous sibling source inserted"></span></picture>
    121 <picture><span><source><img src="/images/green-2x2.png" data-desc="ancestor picture; previous sibling source removed"></span></picture>
    122 
    123 <picture><img src="/images/green-2x2.png" data-desc="parent is picture, following sibling source inserted"></picture>
    124 <picture><img src="/images/green-2x2.png" data-desc="parent is picture, following sibling source removed"><source></picture>
    125 
    126 <picture><img src="/images/green-2x2.png" data-desc="parent is picture, following sibling source has srcset set"><source></picture>
    127 
    128 <img src="/images/green-2x2.png" data-desc="media on img set">
    129 <img src="/images/green-2x2.png" data-desc="type on img set">
    130 <img src="/images/green-2x2.png" data-desc="class on img set">
    131 <img src="/images/green-2x2.png" data-desc="alt on img set">
    132 
    133 <picture><source><img src="/images/green-2x2.png" data-desc="src on previous sibling source set"></picture>
    134 <picture><source><img src="/images/green-2x2.png" data-desc="class on previous sibling source set"></picture>
    135 
    136 <img src="/images/green-2x2.png" data-desc="inserted/removed children of img">
    137 
    138 <picture><img src="/images/green-2x2.png" data-desc="picture is inserted; img has src"></picture><span></span>
    139 <picture><img srcset="/images/green-2x2.png" data-desc="picture is inserted; img has srcset"></picture><span></span>
    140 <picture><source srcset="/images/green-2x2.png"><img src="/images/green-2x2.png" data-desc="picture is inserted; img has previous sibling source"></picture><span></span>
    141 <picture><img src="/images/green-2x2.png" data-desc="picture is inserted; img has following sibling source"><source srcset="/images/green-2x2.png"></picture><span></span>
    142 
    143 <picture><img src="/images/green-2x2.png" data-desc="picture is removed; img has src"></picture>
    144 <picture><img srcset="/images/green-2x2.png" data-desc="picture is removed; img has srcset"></picture>
    145 <picture><source srcset="/images/green-2x2.png"><img src="/images/green-2x2.png" data-desc="picture is removed; img has previous sibling source"></picture>
    146 <picture><img src="/images/green-2x2.png" data-desc="picture is removed; img has following sibling source"><source srcset="/images/green-2x2.png"></picture>
    147 
    148 <picture><img src="/images/green-2x2.png" data-desc="parent is picture, following img inserted"></picture>
    149 <picture><img src="/images/green-2x2.png" data-desc="parent is picture, following img removed"><img></picture>
    150 <picture><img src="/images/green-2x2.png" data-desc="parent is picture, following img has src set"><img></picture>
    151 <picture><img src="/images/green-2x2.png" data-desc="parent is picture, following img has srcset set"><img></picture>
    152 <picture><img src="/images/green-2x2.png" data-desc="parent is picture, following img has sizes set"><img></picture>
    153 
    154 
    155 <script>
    156 onload = function() {
    157 
    158  t('src set', function(img) {
    159    img.src = '/images/green-2x2.png';
    160  }, 'load');
    161 
    162  t('src changed', function(img) {
    163    img.src = '/images/green-2x2.png ';
    164  }, 'load');
    165 
    166  t('src removed', function(img) {
    167    img.removeAttribute('src');
    168  }, 'timeout');
    169 
    170  t('srcset set', function(img) {
    171    img.srcset = '/images/green-2x2.png';
    172  }, 'load');
    173 
    174  t('srcset changed', function(img) {
    175    img.srcset = '/images/green-2x2.png ';
    176  }, 'load');
    177 
    178  t('srcset removed', function(img) {
    179    img.removeAttribute('srcset');
    180  }, 'timeout');
    181 
    182  t('sizes set', function(img) {
    183    img.sizes = '';
    184  }, 'timeout');
    185 
    186  t('sizes changed', function(img) {
    187    img.sizes = ' ';
    188  }, 'timeout');
    189 
    190  t('sizes removed', function(img) {
    191    img.removeAttribute('sizes');
    192  }, 'timeout');
    193 
    194  t('src set to same value', function(img) {
    195    img.src = '/images/green-2x2.png';
    196  }, 'load');
    197 
    198  // When src is absent, changing the crossorigin attribute state MUST NOT
    199  // generate events.
    200 
    201  t('crossorigin absent to empty, src absent', function(img) {
    202    img.crossOrigin = '';
    203  }, 'timeout');
    204 
    205  t('crossorigin absent to anonymous, src absent', function(img) {
    206    img.crossOrigin = 'anonymous';
    207  }, 'timeout');
    208 
    209  t('crossorigin absent to use-credentials, src absent', function(img) {
    210    img.crossOrigin = 'use-credentials';
    211  }, 'timeout');
    212 
    213  t('crossorigin empty to absent, src absent', function(img) {
    214    img.removeAttribute('crossorigin');
    215  }, 'timeout');
    216 
    217  t('crossorigin empty to use-credentials, src absent', function(img) {
    218    img.crossOrigin = 'use-credentials';
    219  }, 'timeout');
    220 
    221  t('crossorigin anonymous to absent, src absent', function(img) {
    222    img.removeAttribute('crossorigin');
    223  }, 'timeout');
    224 
    225  t('crossorigin anonymous to use-credentials, src absent', function(img) {
    226    img.crossOrigin = 'use-credentials';
    227  }, 'timeout');
    228 
    229  t('crossorigin use-credentials to absent, src absent', function(img) {
    230    img.removeAttribute('crossorigin');
    231  }, 'timeout');
    232 
    233  t('crossorigin use-credentials to empty, src absent', function(img) {
    234    img.crossOrigin = '';
    235  }, 'timeout');
    236 
    237  t('crossorigin use-credentials to anonymous, src absent', function(img) {
    238    img.crossOrigin = 'anonymous';
    239  }, 'timeout');
    240 
    241  t('crossorigin use-credentials to invalid, src absent', function(img) {
    242    img.crossOrigin = 'foobar';
    243  }, 'timeout');
    244 
    245  // When src is set, changing the crossorigin attribute state MUST generate
    246  // events.
    247 
    248  t('crossorigin absent to empty, src already set', function(img) {
    249    img.crossOrigin = '';
    250  }, 'load');
    251 
    252  t('crossorigin absent to anonymous, src already set', function(img) {
    253    img.crossOrigin = 'anonymous';
    254  }, 'load');
    255 
    256  t('crossorigin absent to use-credentials, src already set', function(img) {
    257    img.crossOrigin = 'use-credentials';
    258  }, 'load');
    259 
    260  t('crossorigin empty to absent, src already set', function(img) {
    261    img.removeAttribute('crossorigin');
    262  }, 'load');
    263 
    264  t('crossorigin empty to use-credentials, src already set', function(img) {
    265    img.crossOrigin = 'use-credentials';
    266  }, 'load');
    267 
    268  t('crossorigin anonymous to absent, src already set', function(img) {
    269    img.removeAttribute('crossorigin');
    270  }, 'load');
    271 
    272  t('crossorigin anonymous to use-credentials, src already set', function(img) {
    273    img.crossOrigin = 'use-credentials';
    274  }, 'load');
    275 
    276  t('crossorigin use-credentials to absent, src already set', function(img) {
    277    img.removeAttribute('crossorigin');
    278  }, 'load');
    279 
    280  t('crossorigin use-credentials to empty, src already set', function(img) {
    281    img.crossOrigin = '';
    282  }, 'load');
    283 
    284  t('crossorigin use-credentials to anonymous, src already set', function(img) {
    285    img.crossOrigin = 'anonymous';
    286  }, 'load');
    287 
    288  t('crossorigin use-credentials to invalid, src already set', function(img) {
    289    img.crossOrigin = 'foobar';
    290  }, 'load');
    291 
    292  // When src is absent, changing the referrerpolicy attribute state MUST NOT
    293  // generate events.
    294 
    295  t('referrerpolicy absent to no-referrer-when-downgrade, src absent', function(img) {
    296    img.referrerPolicy = 'no-referrer-when-downgrade';
    297  }, 'timeout');
    298 
    299  t('referrerpolicy absent to no-referrer, src absent', function(img) {
    300    img.referrerPolicy = 'no-referrer';
    301  }, 'timeout');
    302 
    303  t('referrerpolicy empty to no-referrer-when-downgrade, src absent', function(img) {
    304    img.referrerPolicy = 'no-referrer-when-downgrade';
    305  }, 'timeout');
    306 
    307  t('referrerpolicy empty to no-referrer, src absent', function(img) {
    308    img.referrerPolicy = 'no-referrer';
    309  }, 'timeout');
    310 
    311  t('referrerpolicy no-referrer-when-downgrade to absent, src absent', function(img) {
    312    img.removeAttribute('referrerpolicy');
    313  }, 'timeout');
    314 
    315  t('referrerpolicy no-referrer-when-downgrade to empty, src absent', function(img) {
    316    img.referrerPolicy = '';
    317  }, 'timeout');
    318 
    319  t('referrerpolicy no-referrer-when-downgrade to no-referrer, src absent', function(img) {
    320    img.referrerPolicy = 'no-referrer';
    321  }, 'timeout');
    322 
    323  t('referrerpolicy no-referrer-when-downgrade to invalid, src absent', function(img) {
    324    img.referrerPolicy = 'foobar';
    325  }, 'timeout');
    326 
    327  t('referrerpolicy no-referrer to absent, src absent', function(img) {
    328    img.removeAttribute('referrerpolicy');
    329  }, 'timeout');
    330 
    331  t('referrerpolicy no-referrer to empty, src absent', function(img) {
    332    img.referrerPolicy = '';
    333  }, 'timeout');
    334 
    335  t('referrerpolicy no-referrer to no-referrer-when-downgrade, src absent', function(img) {
    336    img.referrerPolicy = 'no-referrer-when-downgrade';
    337  }, 'timeout');
    338 
    339  t('referrerpolicy no-referrer to invalid, src absent', function(img) {
    340    img.removeAttribute('referrerpolicy');
    341  }, 'timeout');
    342 
    343  // When src is set, changing the referrerpolicy attribute state MUST generate
    344  // events.
    345 
    346  t('referrerpolicy absent to no-referrer-when-downgrade, src already set', function(img) {
    347    img.referrerPolicy = 'no-referrer-when-downgrade';
    348  }, 'load');
    349 
    350  t('referrerpolicy absent to no-referrer, src already set', function(img) {
    351    img.referrerPolicy = 'no-referrer';
    352  }, 'load');
    353 
    354  t('referrerpolicy empty to no-referrer-when-downgrade, src already set', function(img) {
    355    img.referrerPolicy = 'no-referrer-when-downgrade';
    356  }, 'load');
    357 
    358  t('referrerpolicy empty to no-referrer, src already set', function(img) {
    359    img.referrerPolicy = 'no-referrer';
    360  }, 'load');
    361 
    362  t('referrerpolicy no-referrer-when-downgrade to absent, src already set', function(img) {
    363    img.removeAttribute('referrerpolicy');
    364  }, 'load');
    365 
    366  t('referrerpolicy no-referrer-when-downgrade to empty, src already set', function(img) {
    367    img.referrerPolicy = '';
    368  }, 'load');
    369 
    370  t('referrerpolicy no-referrer-when-downgrade to no-referrer, src already set', function(img) {
    371    img.referrerPolicy = 'no-referrer';
    372  }, 'load');
    373 
    374  t('referrerpolicy no-referrer-when-downgrade to invalid, src already set', function(img) {
    375    img.referrerPolicy = 'foobar';
    376  }, 'load');
    377 
    378  t('referrerpolicy no-referrer to absent, src already set', function(img) {
    379    img.removeAttribute('referrerpolicy');
    380  }, 'load');
    381 
    382  t('referrerpolicy no-referrer to empty, src already set', function(img) {
    383    img.referrerPolicy = '';
    384  }, 'load');
    385 
    386  t('referrerpolicy no-referrer to no-referrer-when-downgrade, src already set', function(img) {
    387    img.referrerPolicy = 'no-referrer-when-downgrade';
    388  }, 'load');
    389 
    390  t('referrerpolicy no-referrer to invalid, src already set', function(img) {
    391    img.removeAttribute('referrerpolicy');
    392  }, 'load');
    393 
    394 
    395  t('inserted into picture', function(img) {
    396    img.nextSibling.appendChild(img);
    397  }, 'load');
    398 
    399  t('removed from picture', function(img) {
    400    img.parentNode.removeChild(img);
    401  }, 'load');
    402 
    403  t('parent is picture, previous source inserted', function(img) {
    404    img.parentNode.insertBefore(document.createElement('source'), img);
    405  }, 'load');
    406 
    407  t('parent is picture, previous source removed', function(img) {
    408    img.parentNode.removeChild(img.previousSibling);
    409  }, 'load');
    410 
    411  t('parent is picture, previous source has srcset set', function(img) {
    412    img.previousSibling.srcset = '';
    413  }, 'load');
    414 
    415  t('parent is picture, previous source has srcset changed', function(img) {
    416    img.previousSibling.srcset = ' ';
    417  }, 'load');
    418 
    419  t('parent is picture, previous source has srcset removed', function(img) {
    420    img.previousSibling.removeAttribute('srcset');
    421  }, 'load');
    422 
    423  t('parent is picture, previous source has sizes set', function(img) {
    424    img.previousSibling.sizes = '';
    425  }, 'load');
    426 
    427  t('parent is picture, previous source has sizes changed', function(img) {
    428    img.previousSibling.sizes = ' ';
    429  }, 'load');
    430 
    431  t('parent is picture, previous source has sizes removed', function(img) {
    432    img.previousSibling.removeAttribute('sizes');
    433  }, 'load');
    434 
    435  t('parent is picture, previous source has media set', function(img) {
    436    img.previousSibling.media = '';
    437  }, 'load');
    438 
    439  t('parent is picture, previous source has media changed', function(img) {
    440    img.previousSibling.media = ' ';
    441  }, 'load');
    442 
    443  t('parent is picture, previous source has media removed', function(img) {
    444    img.previousSibling.removeAttribute('media');
    445  }, 'load');
    446 
    447  t('parent is picture, previous source has type set', function(img) {
    448    img.previousSibling.type = '';
    449  }, 'load');
    450 
    451  t('parent is picture, previous source has type changed', function(img) {
    452    img.previousSibling.type = ' ';
    453  }, 'load');
    454 
    455  t('parent is picture, previous source has type removed', function(img) {
    456    img.previousSibling.removeAttribute('type');
    457  }, 'load');
    458 
    459  t('srcset is set to same value', function(img) {
    460    img.srcset = "/images/green-2x2.png";
    461  }, 'load');
    462 
    463  t('sizes is set to same value', function(img) {
    464    img.sizes = '';
    465  }, 'load');
    466 
    467  t('crossorigin state not changed: absent, removeAttribute', function(img) {
    468    img.removeAttribute('crossorigin');
    469  }, 'timeout');
    470 
    471  t('crossorigin state not changed: empty to anonymous', function(img) {
    472    img.crossOrigin = 'anonymous';
    473  }, 'timeout');
    474 
    475  t('crossorigin state not changed: anonymous to foobar', function(img) {
    476    img.crossOrigin = 'foobar';
    477  }, 'timeout');
    478 
    479  t('crossorigin state not changed: use-credentials to USE-CREDENTIALS', function(img) {
    480    img.crossOrigin = 'USE-CREDENTIALS';
    481  }, 'timeout');
    482 
    483  t('referrerpolicy state not changed: absent, removeAttribute', function(img) {
    484    img.removeAttribute('referrerpolicy');
    485  }, 'timeout');
    486 
    487  t('referrerpolicy state not changed: empty to empty', function(img) {
    488    img.referrerPolicy = '';
    489  }, 'timeout');
    490 
    491  t('referrerpolicy state not changed: empty to invalid', function(img) {
    492    img.referrerPolicy = 'foobar';
    493  }, 'timeout');
    494 
    495  t('referrerpolicy state not changed: absent to invalid', function(img) {
    496    img.referrerPolicy = 'foobar';
    497  }, 'timeout');
    498 
    499  t('referrerpolicy state not changed: no-referrer to NO-REFERRER', function(img) {
    500    img.referrerPolicy = 'NO-REFERRER';
    501  }, 'timeout');
    502 
    503  t('referrerpolicy state not changed: invalid to other-invalid', function(img) {
    504    img.referrerPolicy = 'foobar2';
    505  }, 'timeout');
    506 
    507  t('inserted into picture ancestor', function(img) {
    508    img.nextSibling.firstChild.appendChild(img);
    509  }, 'timeout');
    510 
    511  t('removed from picture ancestor', function(img) {
    512    img.parentNode.removeChild(img);
    513  }, 'timeout');
    514 
    515  t('ancestor picture has a source inserted', function(img) {
    516    img.parentNode.parentNode.insertBefore(document.createElement('source'), img.parentNode);
    517  }, 'timeout');
    518 
    519  t('ancestor picture has a source removed', function(img) {
    520    img.parentNode.parentNode.removeChild(img.parentNode.previousSibling);
    521  }, 'timeout');
    522 
    523  t('ancestor picture; previous sibling source inserted', function(img) {
    524    img.parentNode.insertBefore(document.createElement('source'), img);
    525  }, 'timeout');
    526 
    527  t('ancestor picture; previous sibling source removed', function(img) {
    528    img.parentNode.removeChild(img.previousSibling);
    529  }, 'timeout');
    530 
    531  t('parent is picture, following sibling source inserted', function(img) {
    532    img.parentNode.appendChild(document.createElement('source'));
    533  }, 'timeout');
    534 
    535  t('parent is picture, following sibling source removed', function(img) {
    536    img.parentNode.removeChild(img.nextSibling);
    537  }, 'timeout');
    538 
    539  t('parent is picture, following sibling source has srcset set', function(img) {
    540    img.nextSibling.srcset = '';
    541  }, 'timeout');
    542 
    543  t('media on img set', function(img) {
    544    img.setAttribute('media', '');
    545  }, 'timeout');
    546 
    547  t('type on img set', function(img) {
    548    img.setAttribute('type', '');
    549  }, 'timeout');
    550 
    551  t('class on img set', function(img) {
    552    img.className = '';
    553  }, 'timeout');
    554 
    555  t('alt on img set', function(img) {
    556    img.alt = '';
    557  }, 'timeout');
    558 
    559  t('src on previous sibling source set', function(img) {
    560    img.previousSibling.setAttribute('src', '');
    561  }, 'timeout');
    562 
    563  t('class on previous sibling source set', function(img) {
    564    img.previousSibling.className = '';
    565  }, 'timeout');
    566 
    567  t('inserted/removed children of img', function(img) {
    568    img.appendChild(document.createElement('source'));
    569    setTimeout(this.step_func(function() {
    570      img.removeChild(img.firstChild);
    571    }), 0);
    572  }, 'timeout');
    573 
    574  t('picture is inserted; img has src', function(img) {
    575    img.parentNode.nextSibling.appendChild(img.parentNode);
    576  }, 'timeout');
    577 
    578  t('picture is inserted; img has srcset', function(img) {
    579    img.parentNode.nextSibling.appendChild(img.parentNode);
    580  }, 'timeout');
    581 
    582  t('picture is inserted; img has previous sibling source', function(img) {
    583    img.parentNode.nextSibling.appendChild(img.parentNode);
    584  }, 'timeout');
    585 
    586  t('picture is inserted; img has following sibling source', function(img) {
    587    img.parentNode.nextSibling.appendChild(img.parentNode);
    588  }, 'timeout');
    589 
    590  t('picture is removed; img has src', function(img) {
    591    img.parentNode.parentNode.removeChild(img.parentNode);
    592  }, 'timeout');
    593 
    594  t('picture is removed; img has srcset', function(img) {
    595    img.parentNode.parentNode.removeChild(img.parentNode);
    596  }, 'timeout');
    597 
    598  t('picture is removed; img has previous sibling source', function(img) {
    599    img.parentNode.parentNode.removeChild(img.parentNode);
    600  }, 'timeout');
    601 
    602  t('picture is removed; img has following sibling source', function(img) {
    603    img.parentNode.parentNode.removeChild(img.parentNode);
    604  }, 'timeout');
    605 
    606  t('parent is picture, following img inserted', function(img) {
    607    img.parentNode.appendChild(document.createElement('img'));
    608  }, 'timeout');
    609 
    610  t('parent is picture, following img removed', function(img) {
    611    img.parentNode.removeChild(img.nextSibling);
    612  }, 'timeout');
    613 
    614  t('parent is picture, following img has src set', function(img) {
    615    img.nextSibling.src = '';
    616  }, 'timeout');
    617 
    618  t('parent is picture, following img has srcset set', function(img) {
    619    img.nextSibling.srcset = '';
    620  }, 'timeout');
    621 
    622  t('parent is picture, following img has sizes set', function(img) {
    623    img.nextSibling.sizes = '';
    624  }, 'timeout');
    625 
    626  done();
    627 };
    628 </script>