Make WordPress Core

Changeset 35561


Ignore:
Timestamp:
11/07/2015 02:09:56 AM (9 years ago)
Author:
azaozz
Message:

Responsive images: omit full size images from srcset attributes when the original file is an intermediate sized GIF so we don't accidentally add animation to an otherwise flat image. Update the tests to cover this case.

Props joemcgill, H-Shredder, SergeyBiryukov.
Fixes #34528.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/media.php

    r35524 r35561  
    984984    }
    985985
    986     // Don't add srcset attributes to (animated) gifs that are inserted at full size.
    987     if ( isset( $image_sizes['thumbnail']['mime-type'] ) && 'image/gif' === $image_sizes['thumbnail']['mime-type'] &&
    988         false !== strpos( $image_src, $image_meta['file'] ) ) {
    989 
    990         return false;
    991     }
    992 
    993986    $image_basename = wp_basename( $image_meta['file'] );
    994987    $image_baseurl = _wp_upload_dir_baseurl();
    995988
    996     // Add full size to the '$image_sizes' array.
    997     $image_sizes['full'] = array(
    998         'width'  => $image_meta['width'],
    999         'height' => $image_meta['height'],
    1000         'file'   => $image_basename,
    1001     );
     989    /*
     990     * WordPress flattens animated GIFs into one frame when generating intermediate sizes.
     991     * To avoid hiding animation in user content, if src is a full size GIF, a srcset attribute is not generated.
     992     * If src is an intermediate size GIF, the full size is excluded from srcset to keep a flattened GIF from becoming animated.
     993     */
     994    if ( ! isset( $image_sizes['thumbnail']['mime-type'] ) || 'image/gif' !== $image_sizes['thumbnail']['mime-type'] ) {
     995        $image_sizes['full'] = array(
     996            'width'  => $image_meta['width'],
     997            'height' => $image_meta['height'],
     998            'file'   => $image_basename,
     999        );
     1000    } elseif ( strpos( $image_src, $image_meta['file'] ) ) {
     1001        return false;
     1002    }
    10021003
    10031004    // Uploads are (or have been) in year/month sub-directories.
  • trunk/tests/phpunit/tests/media.php

    r35560 r35561  
    10131013        );
    10141014
    1015         $image_src = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . $image_meta['file'];
     1015        $full_src  = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . $image_meta['file'];
     1016        $large_src = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . $image_meta['sizes']['large']['file'];
     1017
    10161018        // Test with soft resized size array.
    10171019        $size_array = array(900, 450);
    10181020
    1019         $this->assertFalse( wp_calculate_image_srcset( $image_src, $size_array, $image_meta ) );
     1021        // Full size GIFs should not return a srcset.
     1022        $this->assertFalse( wp_calculate_image_srcset( $full_src, $size_array, $image_meta ) );
     1023        // Intermediate sized GIFs should not include the full size in the srcset.
     1024        $this->assertFalse( strpos( wp_calculate_image_srcset( $large_src, $size_array, $image_meta ), $full_src ) );
    10201025    }
    10211026}
Note: See TracChangeset for help on using the changeset viewer.