Make WordPress Core

Ticket #35030: 35030.4.patch

File 35030.4.patch, 14.3 KB (added by joemcgill, 6 years ago)
  • src/wp-includes/media.php

    diff --git src/wp-includes/media.php src/wp-includes/media.php
    index 1c8387b..9f35f79 100644
    function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac 
    10671067         * versions of the same edit.
    10681068         */
    10691069        foreach ( $image_sizes as $image ) {
     1070                $is_src = false;
    10701071
    10711072                // Check if image meta isn't corrupted.
    10721073                if ( ! is_array( $image ) ) {
    function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac 
    10751076
    10761077                // If the file name is part of the `src`, we've confirmed a match.
    10771078                if ( ! $src_matched && false !== strpos( $image_src, $dirname . $image['file'] ) ) {
    1078                         $src_matched = true;
     1079                        $src_matched = $is_src = true;
    10791080                }
    10801081
    10811082                // Filter out images that are from previous edits.
    function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac 
    10871088                 * Filter out images that are wider than '$max_srcset_image_width' unless
    10881089                 * that file is in the 'src' attribute.
    10891090                 */
    1090                 if ( $max_srcset_image_width && $image['width'] > $max_srcset_image_width &&
    1091                         false === strpos( $image_src, $image['file'] ) ) {
    1092 
     1091                if ( $max_srcset_image_width && $image['width'] > $max_srcset_image_width && ! $is_src ) {
    10931092                        continue;
    10941093                }
    10951094
    function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac 
    11091108                // If the image dimensions are within 1px of the expected size, use it.
    11101109                if ( abs( $constrained_size[0] - $expected_size[0] ) <= 1 && abs( $constrained_size[1] - $expected_size[1] ) <= 1 ) {
    11111110                        // Add the URL, descriptor, and value to the sources array to be returned.
    1112                         $sources[ $image['width'] ] = array(
     1111                        $source = array(
    11131112                                'url'        => $image_baseurl . $image['file'],
    11141113                                'descriptor' => 'w',
    11151114                                'value'      => $image['width'],
    11161115                        );
     1116
     1117                        // The 'src' image has to be the first in the 'srcset', because of a bug in iOS8. See #35030.
     1118                        if ( $is_src ) {
     1119                                $sources = array( $image['width'] => $source ) + $sources;
     1120                        } else {
     1121                                $sources[ $image['width'] ] = $source;
     1122                        }
    11171123                }
    11181124        }
    11191125
  • tests/phpunit/tests/media.php

    diff --git tests/phpunit/tests/media.php tests/phpunit/tests/media.php
    index a58360a..7e497a7 100644
    EOF; 
    833833        /**
    834834         * Helper function to get image size array from size "name"
    835835         */
    836         function _get_image_size_array_from_name( $size_name ) {
    837                 switch ( $size_name ) {
    838                         case 'thumbnail':
    839                                 return array( 150, 150 );
    840                         case 'medium':
    841                                 return array( 300, 225 );
    842                         case 'medium_large':
    843                                 return array( 768, 576 );
    844                         case 'large':
    845                                 return array( 1024, 768 );
    846                         case 'full':
    847                                 return array( 1600, 1200 ); // actual size of ../data/images/test-image-large.png
    848                         default:
    849                                 return array( 800, 600 ); // soft-resized image
     836        function _get_image_size_array_from_meta( $image_meta, $size_name ) {
     837                $array = false;
     838
     839                if ( is_array( $image_meta ) ) {
     840                        if ( 'full' === $size_name && isset( $image_meta['width'] ) && isset( $image_meta['height'] ) ) {
     841                                $array = array( $image_meta['width'], $image_meta['height'] );
     842                        } elseif ( isset( $image_meta['sizes'][ $size_name ]['width'] ) && isset( $image_meta['sizes'][ $size_name ]['height'] ) ) {
     843                                $array = array( $image_meta['sizes'][ $size_name ]['width'], $image_meta['sizes'][ $size_name ]['height'] );
     844                        }
    850845                }
     846
     847                return $array;
     848        }
     849
     850        /**
     851         * Helper function to move the src image to the first position in the expected srcset string.
     852         */
     853        function _src_first( $srcset, $src_url, $src_width ) {
     854                $src_string = $src_url . ' ' . $src_width . 'w';
     855                $src_not_first = ', ' . $src_string;
     856
     857                if ( strpos( $srcset, $src_not_first ) ) {
     858                        $srcset = str_replace( $src_not_first, '', $srcset );
     859                        $srcset = $src_string . ', ' . $srcset;
     860                }
     861
     862                return $srcset;
    851863        }
    852864
    853865        /**
    EOF; 
    884896
    885897                foreach ( $intermediates as $int ) {
    886898                        $image_url = wp_get_attachment_image_url( self::$large_id, $int );
    887                         $size_array = $this->_get_image_size_array_from_name( $int );
    888                         $this->assertSame( $expected, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
    889                 }
     899                        $size_array = $this->_get_image_size_array_from_meta( $image_meta, $int );
     900                        $expected_srcset = $this->_src_first( $expected, $image_url, $size_array[0] );
     901                        $this->assertSame( $expected_srcset, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
     902                }
    890903        }
    891904
    892905        /**
    EOF; 
    914927                        }
    915928                }
    916929
    917                 $expected = "";
     930                $expected = '';
    918931
    919                 foreach( $image_meta['sizes'] as $name => $size ) {
     932                foreach ( $image_meta['sizes'] as $name => $size ) {
    920933                        // Whitelist the sizes that should be included so we pick up 'medium_large' in 4.4.
    921934                        if ( in_array( $name, $intermediates ) ) {
    922935                                $expected .= $uploads_dir_url . $size['file'] . ' ' . $size['width'] . 'w, ';
    EOF; 
    927940                $expected .= $uploads_dir_url . $image_meta['file'] . ' ' . $image_meta['width'] .'w';
    928941
    929942                foreach ( $intermediates as $int ) {
    930                         $size_array = $this->_get_image_size_array_from_name( $int );
     943                        $size_array = $this->_get_image_size_array_from_meta( $image_meta, $int );
    931944                        $image_url = wp_get_attachment_image_url( $id, $int );
    932                         $this->assertSame( $expected, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
    933                 }
     945                        $expected_srcset = $this->_src_first( $expected, $image_url, $size_array[0] );
     946                        $this->assertSame( $expected_srcset, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
     947                }
    934948
    935949                // Remove the attachment
    936950                wp_delete_attachment( $id );
    EOF; 
    945959                // Start by getting the attachment metadata.
    946960                $image_meta = wp_get_attachment_metadata( self::$large_id );
    947961                $image_url = wp_get_attachment_image_url( self::$large_id, 'medium' );
    948                 $size_array = $this->_get_image_size_array_from_name( 'medium' );
     962                $size_array = $this->_get_image_size_array_from_meta( $image_meta, 'medium' );
    949963
    950964                // Copy hash generation method used in wp_save_image().
    951965                $hash = 'e' . time() . rand(100, 999);
    EOF; 
    10071021
    10081022                foreach ( $intermediates as $int ) {
    10091023                        $image_url = wp_get_attachment_image_url( self::$large_id, $int );
    1010                         $size_array = $this->_get_image_size_array_from_name( $int );
    1011                         $this->assertSame( $expected, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
    1012                 }
     1024                        $size_array = $this->_get_image_size_array_from_meta( $image_meta, $int );
     1025                        $expected_srcset = $this->_src_first( $expected, $image_url, $size_array[0] );
     1026                        $this->assertSame( $expected_srcset, wp_calculate_image_srcset( $size_array, $image_url, $image_meta ) );
     1027                }
    10131028        }
    10141029
    10151030        /**
    EOF; 
    11231138                        ),
    11241139                );
    11251140
    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';
     1141                $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';
    11271142
    11281143                $this->assertSame( $expected_srcset, wp_calculate_image_srcset( $size_array, $image_src, $image_meta ) );
    11291144        }
    EOF; 
    12021217        }
    12031218
    12041219        /**
     1220         * Helper filter function to shuffle the image meta sizes array.
     1221         */
     1222        function _shuffle_sizes( $image_meta ) {
     1223                $sizes = $image_meta['sizes'];
     1224                $keys = array_keys( $sizes );
     1225                $image_meta_sizes = array();
     1226
     1227                shuffle( $keys );
     1228
     1229                foreach ( $keys as $key ) {
     1230                        $image_meta_sizes[ $key ] = $sizes[ $key ];
     1231                }
     1232
     1233                $image_meta['sizes'] = $image_meta_sizes;
     1234
     1235                return $image_meta;
     1236        }
     1237
     1238        /**
     1239         * @ticket 35030
     1240         */
     1241        function test_wp_calculate_image_srcset_src_first() {
     1242                global $_wp_additional_image_sizes;
     1243
     1244                $year_month = date( 'Y/m' );
     1245                $image_meta = wp_get_attachment_metadata( self::$large_id );
     1246                $uploads_dir_url = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/';
     1247
     1248                // Set up test cases for all expected size names.
     1249                $intermediates = array( 'medium', 'medium_large', 'large', 'full' );
     1250
     1251                // Add any soft crop intermediate sizes.
     1252                foreach ( $_wp_additional_image_sizes as $name => $additional_size ) {
     1253                        if ( ! $_wp_additional_image_sizes[ $name ]['crop'] || 0 === $_wp_additional_image_sizes[ $name ]['height'] ) {
     1254                                $intermediates[] = $name;
     1255                        }
     1256                }
     1257
     1258                $expected = '';
     1259
     1260                foreach ( $image_meta['sizes'] as $name => $size ) {
     1261                        // Whitelist the sizes that should be included so we pick up 'medium_large' in 4.4.
     1262                        if ( in_array( $name, $intermediates ) ) {
     1263                                $expected .= $uploads_dir_url . $year_month . '/' . $size['file'] . ' ' . $size['width'] . 'w, ';
     1264                        }
     1265                }
     1266
     1267                // Add the full size width at the end.
     1268                $expected .= $uploads_dir_url . $image_meta['file'] . ' ' . $image_meta['width'] .'w';
     1269
     1270                foreach ( $intermediates as $int ) {
     1271                        $image_url = wp_get_attachment_image_url( self::$large_id, $int );
     1272                        $size_array = $this->_get_image_size_array_from_meta( $image_meta, $int );
     1273
     1274                        // The expected first source in the srcset is the src image.
     1275                        $expected_first = $image_url . ' ' . $size_array[0] . 'w';
     1276
     1277                        // Shuffle the sizes array used by 'wp_calculate_image_srcset()' to create the srcset.
     1278                        add_filter( 'wp_calculate_image_srcset_meta', array( $this, '_shuffle_sizes' ) );
     1279
     1280                        // Get the first source from the calculated srcset and compare with the expected first source.
     1281                        preg_match( '/[^,]+/', wp_calculate_image_srcset( $size_array, $image_url, $image_meta ), $srcset_first );
     1282                        $this->assertSame( $expected_first, $srcset_first[0] );
     1283
     1284                        remove_filter( 'wp_calculate_image_srcset_meta', array( $this, '_shuffle_sizes' ) );
     1285                }
     1286        }
     1287
     1288        /**
    12051289         * @ticket 33641
    12061290         */
    12071291        function test_wp_get_attachment_image_srcset() {
    EOF; 
    12261310
    12271311                $expected = "";
    12281312
    1229                 foreach( $image_meta['sizes'] as $name => $size ) {
     1313                foreach ( $image_meta['sizes'] as $name => $size ) {
    12301314                        // Whitelist the sizes that should be included so we pick up 'medium_large' in 4.4.
    12311315                        if ( in_array( $name, $intermediates ) ) {
    12321316                                $expected .= $uploads_dir . $year_month . '/' . $size['file'] . ' ' . $size['width'] . 'w, ';
    EOF; 
    12351319
    12361320                $expected .= $uploads_dir . $image_meta['file'] . ' ' . $image_meta['width'] .'w';
    12371321
    1238                 $this->assertSame( $expected, $srcset );
     1322                $expected_srcset = $this->_src_first( $expected, $uploads_dir . $image_meta['file'], $size_array[0] );
     1323
     1324                $this->assertSame( $expected_srcset, $srcset );
    12391325        }
    12401326
    12411327        /**
    EOF; 
    12731359         * @ticket 33641
    12741360         */
    12751361        function test_wp_get_attachment_image_sizes() {
    1276                 // Test sizes against the default WP sizes.
    1277                 $intermediates = array('thumbnail', 'medium', 'medium_large', 'large');
     1362                // Test sizes against the default WP sizes.
     1363                $intermediates = array('thumbnail', 'medium', 'medium_large', 'large');
    12781364
    12791365                // Make sure themes aren't filtering the sizes array.
    12801366                remove_all_filters( 'wp_calculate_image_sizes' );
    12811367
    1282                 foreach( $intermediates as $int_size ) {
    1283                         $image = wp_get_attachment_image_src( self::$large_id, $int_size );
     1368                foreach( $intermediates as $int_size ) {
     1369                        $image = wp_get_attachment_image_src( self::$large_id, $int_size );
    12841370
    12851371                        $expected = '(max-width: ' . $image[1] . 'px) 100vw, ' . $image[1] . 'px';
    12861372                        $sizes = wp_get_attachment_image_sizes( self::$large_id, $int_size );
    EOF; 
    12941380         */
    12951381        function test_wp_calculate_image_sizes() {
    12961382                // Test sizes against the default WP sizes.
    1297                 $intermediates = array('thumbnail', 'medium', 'medium_large', 'large');
    1298                 $image_meta = wp_get_attachment_metadata( self::$large_id );
     1383                $intermediates = array( 'thumbnail', 'medium', 'medium_large', 'large' );
     1384                $image_meta = wp_get_attachment_metadata( self::$large_id );
    12991385
    13001386                // Make sure themes aren't filtering the sizes array.
    13011387                remove_all_filters( 'wp_calculate_image_sizes' );
    13021388
    1303                 foreach( $intermediates as $int_size ) {
    1304                         $size_array = $this->_get_image_size_array_from_name( $int_size );
    1305                         $image_src = $image_meta['sizes'][$int_size]['file'];
     1389                foreach ( $intermediates as $int_size ) {
     1390                        $size_array = $this->_get_image_size_array_from_meta( $image_meta, $int_size );
     1391                        $image_src = $image_meta['sizes'][ $int_size ]['file'];
    13061392                        list( $width, $height ) = $size_array;
    13071393
    13081394                        $expected = '(max-width: ' . $width . 'px) 100vw, ' . $width . 'px';
    EOF; 
    13171403         */
    13181404        function test_wp_make_content_images_responsive() {
    13191405                $image_meta = wp_get_attachment_metadata( self::$large_id );
    1320                 $size_array = $this->_get_image_size_array_from_name( 'medium' );
     1406                $size_array = $this->_get_image_size_array_from_meta( $image_meta, 'medium' );
    13211407
    13221408                $srcset = sprintf( 'srcset="%s"', wp_get_attachment_image_srcset( self::$large_id, $size_array, $image_meta ) );
    13231409                $sizes = sprintf( 'sizes="%s"', wp_get_attachment_image_sizes( self::$large_id, $size_array, $image_meta ) );
    EOF; 
    14501536         */
    14511537        function test_wp_make_content_images_responsive_schemes() {
    14521538                $image_meta = wp_get_attachment_metadata( self::$large_id );
    1453                 $size_array = $this->_get_image_size_array_from_name( 'medium' );
     1539                $size_array = $this->_get_image_size_array_from_meta( $image_meta, 'medium' );
    14541540
    14551541                $srcset = sprintf( 'srcset="%s"', wp_get_attachment_image_srcset( self::$large_id, $size_array, $image_meta ) );
    14561542                $sizes  = sprintf( 'sizes="%s"', wp_get_attachment_image_sizes( self::$large_id, $size_array, $image_meta ) );
    EOF; 
    14801566                $actual     = wp_make_content_images_responsive( $unfiltered );
    14811567
    14821568                $this->assertSame( $expected, $actual );
    1483 }
     1569        }
    14841570
    14851571        /**
    14861572         * @ticket 34945
    EOF; 
    15171603
    15181604                $_SERVER['HTTPS'] = 'on';
    15191605
    1520                 $expected = 'https://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test-300x150.jpg 300w, https://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test-1024x512.jpg 1024w, https://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg 1200w';
     1606                $expected = 'https://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test-1024x512.jpg 1024w, https://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test-300x150.jpg 300w, https://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg 1200w';
    15211607                $actual   = wp_calculate_image_srcset( $size_array, $image_url, $image_meta );
    15221608
    15231609                $this->assertSame( $expected, $actual );