Make WordPress Core

Ticket #35030: 35030.patch

File 35030.patch, 8.5 KB (added by jaspermdegroot, 6 years ago)
  • src/wp-includes/media.php

    diff --git src/wp-includes/media.php src/wp-includes/media.php
    index 6b0187a..519864b 100644
    function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac 
    10441044         */
    10451045        $max_srcset_image_width = apply_filters( 'max_srcset_image_width', 1600, $size_array );
    10461046
    1047         // Array to hold URL candidates.
    1048         $sources = array();
     1047        // Arrays to hold URL candidates.
     1048        $sources = $src = $alternatives = array();
    10491049
    10501050        /**
    10511051         * To make sure the ID matches our image src, we will check to see if any sizes in our attachment
    function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac 
    10591059         * versions of the same edit.
    10601060         */
    10611061        foreach ( $image_sizes as $image ) {
     1062                $is_src = false;
    10621063
    10631064                // If the file name is part of the `src`, we've confirmed a match.
    10641065                if ( ! $src_matched && false !== strpos( $image_src, $dirname . $image['file'] ) ) {
    10651066                        $src_matched = true;
     1067                        $is_src      = true;
    10661068                }
    10671069
    10681070                // Filter out images that are from previous edits.
    function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac 
    10741076                 * Filter out images that are wider than '$max_srcset_image_width' unless
    10751077                 * that file is in the 'src' attribute.
    10761078                 */
    1077                 if ( $max_srcset_image_width && $image['width'] > $max_srcset_image_width &&
    1078                         false === strpos( $image_src, $image['file'] ) ) {
    1079 
     1079                if ( $max_srcset_image_width && $image['width'] > $max_srcset_image_width && ! $is_src ) {
    10801080                        continue;
    10811081                }
    10821082
    function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac 
    10961096                // If the image dimensions are within 1px of the expected size, use it.
    10971097                if ( abs( $constrained_size[0] - $expected_size[0] ) <= 1 && abs( $constrained_size[1] - $expected_size[1] ) <= 1 ) {
    10981098                        // Add the URL, descriptor, and value to the sources array to be returned.
    1099                         $sources[ $image['width'] ] = array(
     1099                        $source = array(
    11001100                                'url'        => $image_baseurl . $image['file'],
    11011101                                'descriptor' => 'w',
    11021102                                'value'      => $image['width'],
    11031103                        );
     1104
     1105                        // Use two arrays to make sure the 'src' image becomes first in the 'srcset'. See #35030.
     1106                        if ( $is_src ) {
     1107                                $src[ $image['width'] ] = $source;
     1108                        } else {
     1109                                $alternatives[ $image['width'] ] = $source;
     1110                        }
    11041111                }
    11051112        }
    11061113
     1114        $sources = $src + $alternatives;
     1115
    11071116        /**
    11081117         * Filter an image's 'srcset' sources.
    11091118         *
  • tests/phpunit/tests/media.php

    diff --git tests/phpunit/tests/media.php tests/phpunit/tests/media.php
    index d5ae231..e05deb5 100644
    EOF; 
    845845                                return array( 1024, 768 );
    846846                        case 'full':
    847847                                return array( 1600, 1200 ); // actual size of ../data/images/test-image-large.png
     848                        case 'twentyfifteen-logo':
     849                                return array( 248, 186 );
    848850                        default:
    849851                                return array( 800, 600 ); // soft-resized image
    850852                }
    851853        }
    852854
    853855        /**
     856         * Helper function to move the src image to the first position in the expected srcset string.
     857         */
     858        function _src_first( $srcset, $src_url, $src_width ) {
     859                $src_string = $src_url . ' ' . $src_width . 'w';
     860                $src_not_first = ', ' . $src_string;
     861
     862                if ( strpos( $srcset, $src_not_first ) ) {
     863                        $srcset = str_replace( $src_not_first, '', $srcset );
     864                        $srcset = $src_string . ', ' . $srcset;
     865                }
     866
     867                return $srcset;
     868        }
     869
     870        /**
    854871         * @ticket 33641
    855872         */
    856873        function test_wp_calculate_image_srcset() {
    EOF; 
    885902                foreach ( $intermediates as $int ) {
    886903                        $image_url = wp_get_attachment_image_url( self::$large_id, $int );
    887904                        $size_array = $this->_get_image_size_array_from_name( $int );
    888                         $this->assertSame( $expected, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
     905                        $expected_srcset = $this->_src_first( $expected, $image_url, $size_array[0] );
     906                        $this->assertSame( $expected_srcset, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
    889907                }
    890908        }
    891909
    EOF; 
    929947                foreach ( $intermediates as $int ) {
    930948                        $size_array = $this->_get_image_size_array_from_name( $int );
    931949                        $image_url = wp_get_attachment_image_url( $id, $int );
    932                         $this->assertSame( $expected, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
     950                        $expected_srcset = $this->_src_first( $expected, $image_url, $size_array[0] );
     951                        $this->assertSame( $expected_srcset, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
    933952                }
    934953
    935954                // Remove the attachment
    EOF; 
    10081027                foreach ( $intermediates as $int ) {
    10091028                        $image_url = wp_get_attachment_image_url( self::$large_id, $int );
    10101029                        $size_array = $this->_get_image_size_array_from_name( $int );
    1011                         $this->assertSame( $expected, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
     1030                        $expected_srcset = $this->_src_first( $expected, $image_url, $size_array[0] );
     1031                        $this->assertSame( $expected_srcset, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
    10121032                }
    10131033        }
    10141034
    EOF; 
    11231143                        ),
    11241144                );
    11251145
    1126                 $expected_srcset = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/2015/12/test-300x150.png 300w, http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/2015/12/test-768x384.png 768w, http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/2015/12/test-1024x512.png 1024w, http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/2015/12/test.png 2000w';
     1146                $expected_srcset = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/2015/12/test.png 2000w, http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/2015/12/test-300x150.png 300w, http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/2015/12/test-768x384.png 768w, http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/2015/12/test-1024x512.png 1024w';
    11271147
    11281148                $this->assertSame( $expected_srcset, wp_calculate_image_srcset( $size_array, $image_src, $image_meta ) );
    11291149        }
    11301150
    11311151        /**
     1152         * Helper filter function to shuffle the image meta sizes array.
     1153         */
     1154        function _shuffle_sizes( $image_meta ) {
     1155                $sizes = $image_meta['sizes'];
     1156                $keys = array_keys( $sizes );
     1157                $image_meta_sizes = array();
     1158
     1159                shuffle( $keys );
     1160
     1161                foreach( $keys as $key ) {
     1162                        $image_meta_sizes[ $key ] = $sizes[ $key ];
     1163                }
     1164
     1165                $image_meta['sizes'] = $image_meta_sizes;
     1166
     1167                return $image_meta;
     1168        }
     1169
     1170        /**
     1171         * @ticket 35030
     1172         */
     1173        function test_wp_calculate_image_srcset_src_first() {
     1174                global $_wp_additional_image_sizes;
     1175
     1176                $year_month = date('Y/m');
     1177                $image_meta = wp_get_attachment_metadata( self::$large_id );
     1178                $uploads_dir_url = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/';
     1179
     1180                // Set up test cases for all expected size names.
     1181                $intermediates = array( 'medium', 'medium_large', 'large', 'full' );
     1182
     1183                // Add any soft crop intermediate sizes.
     1184                foreach ( $_wp_additional_image_sizes as $name => $additional_size ) {
     1185                        if ( ! $_wp_additional_image_sizes[$name]['crop'] || 0 === $_wp_additional_image_sizes[$name]['height'] ) {
     1186                                $intermediates[] = $name;
     1187                        }
     1188                }
     1189
     1190                $expected = "";
     1191
     1192                foreach( $image_meta['sizes'] as $name => $size ) {
     1193                        // Whitelist the sizes that should be included so we pick up 'medium_large' in 4.4.
     1194                        if ( in_array( $name, $intermediates ) ) {
     1195                                $expected .= $uploads_dir_url . $year_month . '/' . $size['file'] . ' ' . $size['width'] . 'w, ';
     1196                        }
     1197                }
     1198
     1199                // Add the full size width at the end.
     1200                $expected .= $uploads_dir_url . $image_meta['file'] . ' ' . $image_meta['width'] .'w';
     1201
     1202                foreach ( $intermediates as $int ) {
     1203                        $image_url = wp_get_attachment_image_url( self::$large_id, $int );
     1204                        $size_array = $this->_get_image_size_array_from_name( $int );
     1205
     1206                        // The expected first source in the srcset is the src image.
     1207                        $expected_first = $image_url . ' ' . $size_array[0] . 'w';
     1208
     1209                        // Shuffle the sizes array used by 'wp_calculate_image_srcset()' to create the srcset.
     1210                        add_filter( 'wp_calculate_image_srcset_meta', array( $this, '_shuffle_sizes' ) );
     1211
     1212                        // Get the first source from the calculated srcset and compare with the expected first source.
     1213                        preg_match( '/[^,]+/', wp_calculate_image_srcset( $size_array, $image_url, $image_meta ), $srcset_first );
     1214                        $this->assertSame( $expected_first, $srcset_first[0] );
     1215
     1216                        remove_filter( 'wp_calculate_image_srcset_meta', array( $this, '_shuffle_sizes' ) );
     1217                }
     1218        }
     1219
     1220        /**
    11321221         * @ticket 33641
    11331222         */
    11341223        function test_wp_get_attachment_image_srcset() {
    EOF; 
    11621251
    11631252                $expected .= $uploads_dir . $image_meta['file'] . ' ' . $image_meta['width'] .'w';
    11641253
    1165                 $this->assertSame( $expected, $srcset );
     1254                $expected_srcset = $this->_src_first( $expected, $uploads_dir . $image_meta['file'], $size_array[0] );
     1255
     1256                $this->assertSame( $expected_srcset, $srcset );
    11661257        }
    11671258
    11681259        /**