From 3b5433eb2ed2023060c4fa2a5dc378e89a3bee19 Mon Sep 17 00:00:00 2001 From: Andrew Ozz Date: Sat, 7 Nov 2015 02:09:56 +0000 Subject: [PATCH] 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. git-svn-id: https://develop.svn.wordpress.org/trunk@35561 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/media.php | 27 ++++++++++++++------------- tests/phpunit/tests/media.php | 9 +++++++-- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index 562f2834dc..23d813f512 100644 --- a/src/wp-includes/media.php +++ b/src/wp-includes/media.php @@ -983,22 +983,23 @@ function wp_calculate_image_srcset( $image_src, $size_array, $image_meta, $attac return false; } - // Don't add srcset attributes to (animated) gifs that are inserted at full size. - if ( isset( $image_sizes['thumbnail']['mime-type'] ) && 'image/gif' === $image_sizes['thumbnail']['mime-type'] && - false !== strpos( $image_src, $image_meta['file'] ) ) { - - return false; - } - $image_basename = wp_basename( $image_meta['file'] ); $image_baseurl = _wp_upload_dir_baseurl(); - // Add full size to the '$image_sizes' array. - $image_sizes['full'] = array( - 'width' => $image_meta['width'], - 'height' => $image_meta['height'], - 'file' => $image_basename, - ); + /* + * WordPress flattens animated GIFs into one frame when generating intermediate sizes. + * To avoid hiding animation in user content, if src is a full size GIF, a srcset attribute is not generated. + * If src is an intermediate size GIF, the full size is excluded from srcset to keep a flattened GIF from becoming animated. + */ + if ( ! isset( $image_sizes['thumbnail']['mime-type'] ) || 'image/gif' !== $image_sizes['thumbnail']['mime-type'] ) { + $image_sizes['full'] = array( + 'width' => $image_meta['width'], + 'height' => $image_meta['height'], + 'file' => $image_basename, + ); + } elseif ( strpos( $image_src, $image_meta['file'] ) ) { + return false; + } // Uploads are (or have been) in year/month sub-directories. if ( $image_basename !== $image_meta['file'] ) { diff --git a/tests/phpunit/tests/media.php b/tests/phpunit/tests/media.php index 75e7df5593..e4feb8b77f 100644 --- a/tests/phpunit/tests/media.php +++ b/tests/phpunit/tests/media.php @@ -1012,10 +1012,15 @@ EOF; ) ); - $image_src = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . $image_meta['file']; + $full_src = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . $image_meta['file']; + $large_src = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . $image_meta['sizes']['large']['file']; + // Test with soft resized size array. $size_array = array(900, 450); - $this->assertFalse( wp_calculate_image_srcset( $image_src, $size_array, $image_meta ) ); + // Full size GIFs should not return a srcset. + $this->assertFalse( wp_calculate_image_srcset( $full_src, $size_array, $image_meta ) ); + // Intermediate sized GIFs should not include the full size in the srcset. + $this->assertFalse( strpos( wp_calculate_image_srcset( $large_src, $size_array, $image_meta ), $full_src ) ); } }