Make WordPress Core

Ticket #35725: 35725.4.diff

File 35725.4.diff, 25.9 KB (added by adamsilverstein, 4 years ago)
  • src/wp-admin/includes/ajax-actions.php

    diff --git src/wp-admin/includes/ajax-actions.php src/wp-admin/includes/ajax-actions.php
    index a6f4a21e45..02f8c5ae8b 100644
    function wp_ajax_crop_image() { 
    39263926                        $parent_url = wp_get_attachment_url( $attachment_id );
    39273927                        $url        = str_replace( wp_basename( $parent_url ), wp_basename( $cropped ), $parent_url );
    39283928
    3929                         $size       = wp_getimagesize( $cropped );
     3929                        $size       = wp_get_image_size( $cropped );
    39303930                        $image_type = ( $size ) ? $size['mime'] : 'image/jpeg';
    39313931
    39323932                        $object = array(
  • src/wp-admin/includes/class-custom-image-header.php

    diff --git src/wp-admin/includes/class-custom-image-header.php src/wp-admin/includes/class-custom-image-header.php
    index 76eddff973..c5c4cccf76 100644
    endif; 
    791791                }
    792792
    793793                if ( file_exists( $file ) ) {
    794                         list( $width, $height, $type, $attr ) = wp_getimagesize( $file );
     794                        list( $width, $height, $type, $attr ) = wp_get_image_size( $file );
    795795                } else {
    796796                        $data   = wp_get_attachment_metadata( $attachment_id );
    797797                        $height = isset( $data['height'] ) ? $data['height'] : 0;
    endif; 
    12231223                $parent_url = wp_get_attachment_url( $parent->ID );
    12241224                $url        = str_replace( wp_basename( $parent_url ), wp_basename( $cropped ), $parent_url );
    12251225
    1226                 $size       = wp_getimagesize( $cropped );
     1226                $size       = wp_get_image_size( $cropped );
    12271227                $image_type = ( $size ) ? $size['mime'] : 'image/jpeg';
    12281228
    12291229                $object = array(
  • src/wp-admin/includes/class-wp-site-icon.php

    diff --git src/wp-admin/includes/class-wp-site-icon.php src/wp-admin/includes/class-wp-site-icon.php
    index 9aff0f2a8d..151a88fbb3 100644
    class WP_Site_Icon { 
    8787                $parent_url = wp_get_attachment_url( $parent->ID );
    8888                $url        = str_replace( wp_basename( $parent_url ), wp_basename( $cropped ), $parent_url );
    8989
    90                 $size       = wp_getimagesize( $cropped );
     90                $size       = wp_get_image_size( $cropped );
    9191                $image_type = ( $size ) ? $size['mime'] : 'image/jpeg';
    9292
    9393                $object = array(
  • src/wp-admin/includes/image-edit.php

    diff --git src/wp-admin/includes/image-edit.php src/wp-admin/includes/image-edit.php
    index ce80a69ad5..416f69c998 100644
    function wp_stream_image( $image, $mime_type, $attachment_id ) { 
    306306                        case 'image/gif':
    307307                                header( 'Content-Type: image/gif' );
    308308                                return imagegif( $image );
     309                        case 'image/webp':
     310                                if ( function_exists( 'imagewebp' ) ) {
     311                                        header( 'Content-Type: image/webp' );
     312                                        return imagewebp( $image, null, 90 );
     313                                }
     314                                return false;
    309315                        default:
    310316                                return false;
    311317                }
    function wp_save_image_file( $filename, $image, $mime_type, $post_id ) { 
    391397                                return imagepng( $image, $filename );
    392398                        case 'image/gif':
    393399                                return imagegif( $image, $filename );
     400                        case 'image/webp':
     401                                if ( function_exists( 'imagewebp' ) ) {
     402                                        return imagewebp( $image, null, apply_filters( 'jpeg_quality', 90, 'edit_image' ) );
     403                                }
     404                                return false;
    394405                        default:
    395406                                return false;
    396407                }
  • src/wp-admin/includes/image.php

    diff --git src/wp-admin/includes/image.php src/wp-admin/includes/image.php
    index 56b9c0a36f..839592ab86 100644
    function wp_get_missing_image_subsizes( $attachment_id ) { 
    9393        // Use the originally uploaded image dimensions as full_width and full_height.
    9494        if ( ! empty( $image_meta['original_image'] ) ) {
    9595                $image_file = wp_get_original_image_path( $attachment_id );
    96                 $imagesize  = wp_getimagesize( $image_file );
     96                $imagesize  = wp_get_image_size( $image_file );
    9797        }
    9898
    9999        if ( ! empty( $imagesize ) ) {
    function _wp_image_meta_replace_original( $saved_data, $original_file, $image_me 
    224224 * @return array The image attachment meta data.
    225225 */
    226226function wp_create_image_subsizes( $file, $attachment_id ) {
    227         $imagesize = wp_getimagesize( $file );
     227        $imagesize = wp_get_image_size( $file );
    228228
    229229        if ( empty( $imagesize ) ) {
    230230                // File is not an image.
    function wp_generate_attachment_metadata( $attachment_id, $file ) { 
    517517                                case 'image/png':
    518518                                        $ext = '.png';
    519519                                        break;
     520                                case 'image/webp':
     521                                        $ext = '.webp';
     522                                        break;
    520523                        }
    521524                        $basename = str_replace( '.', '-', wp_basename( $file ) ) . '-image' . $ext;
    522525                        $uploaded = wp_upload_bits( $basename, '', $metadata['image']['data'] );
    function wp_read_image_metadata( $file ) { 
    687690                return false;
    688691        }
    689692
    690         list( , , $image_type ) = wp_getimagesize( $file );
     693        list( , , $image_type ) = wp_get_image_size( $file );
    691694
    692695        /*
    693696         * EXIF contains a bunch of data we'll probably never need formatted in ways
    function wp_read_image_metadata( $file ) { 
    716719         * as caption, description etc.
    717720         */
    718721        if ( is_callable( 'iptcparse' ) ) {
    719                 wp_getimagesize( $file, $info );
     722                wp_get_image_size( $file, $info );
    720723
    721724                if ( ! empty( $info['APP13'] ) ) {
    722725                        if (
    function wp_read_image_metadata( $file ) { 
    899902 * @return bool True if valid image, false if not valid image.
    900903 */
    901904function file_is_valid_image( $path ) {
    902         $size = wp_getimagesize( $path );
     905        $size = wp_get_image_size( $path );
    903906        return ! empty( $size );
    904907}
    905908
    function file_is_valid_image( $path ) { 
    914917function file_is_displayable_image( $path ) {
    915918        $displayable_image_types = array( IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP, IMAGETYPE_ICO );
    916919
    917         $info = wp_getimagesize( $path );
     920        $info = wp_get_image_size( $path );
    918921        if ( empty( $info ) ) {
    919922                $result = false;
    920923        } elseif ( ! in_array( $info[2], $displayable_image_types, true ) ) {
    function load_image_to_edit( $attachment_id, $mime_type, $size = 'full' ) { 
    962965                case 'image/gif':
    963966                        $image = imagecreatefromgif( $filepath );
    964967                        break;
     968                case 'image/webp':
     969                        if ( function_exists( 'imagecreatefromwebp' ) ) {
     970                                $image = imagecreatefromwebp( $filepath );
     971                        } else {
     972                                $image = false;
     973                        }
     974                        break;
    965975                default:
    966976                        $image = false;
    967977                        break;
  • src/wp-admin/includes/media.php

    diff --git src/wp-admin/includes/media.php src/wp-admin/includes/media.php
    index 93d850d606..12b079ac69 100644
    function wp_media_upload_handler() { 
    982982function media_sideload_image( $file, $post_id = 0, $desc = null, $return = 'html' ) {
    983983        if ( ! empty( $file ) ) {
    984984
    985                 $allowed_extensions = array( 'jpg', 'jpeg', 'jpe', 'png', 'gif' );
     985                $allowed_extensions = array( 'jpg', 'jpeg', 'jpe', 'png', 'gif', 'webp' );
    986986
    987987                /**
    988988                 * Filters the list of allowed file extensions when sideloading an image from a URL.
  • src/wp-admin/includes/schema.php

    diff --git src/wp-admin/includes/schema.php src/wp-admin/includes/schema.php
    index a59c7c36ce..6f528f2288 100644
    We hope you enjoy your new site. Thanks! 
    12151215                'jpeg',
    12161216                'png',
    12171217                'gif',
     1218                'webp',
    12181219                // Video.
    12191220                'mov',
    12201221                'avi',
  • src/wp-admin/options-privacy.php

    diff --git src/wp-admin/options-privacy.php src/wp-admin/options-privacy.php
    index a183abdf3f..3e4902daf4 100644
    if ( ! current_user_can( 'manage_privacy_options' ) ) { 
    1414}
    1515
    1616if ( isset( $_GET['tab'] ) && 'policyguide' === $_GET['tab'] ) {
    17         require_once( dirname( __FILE__ ) . '/privacy-policy-guide.php' );
     17        require_once dirname( __FILE__ ) . '/privacy-policy-guide.php';
    1818        return;
    1919}
    2020
  • src/wp-includes/ID3/getid3.lib.php

    diff --git src/wp-includes/ID3/getid3.lib.php src/wp-includes/ID3/getid3.lib.php
    index 3a5983fc26..164cb31784 100644
    class getid3_lib 
    15111511                        if (is_writable($tempfilename) && is_file($tempfilename) && ($tmp = fopen($tempfilename, 'wb'))) {
    15121512                                fwrite($tmp, $imgData);
    15131513                                fclose($tmp);
    1514                                 $GetDataImageSize = @getimagesize($tempfilename, $imageinfo);
     1514                                $GetDataImageSize = wp_get_image_size($tempfilename, $imageinfo);
    15151515                                if (($GetDataImageSize === false) || !isset($GetDataImageSize[0]) || !isset($GetDataImageSize[1])) {
    15161516                                        return false;
    15171517                                }
  • src/wp-includes/ID3/getid3.php

    diff --git src/wp-includes/ID3/getid3.php src/wp-includes/ID3/getid3.php
    index 5cb3c036c0..fbc05ba3f7 100644
    class getID3 
    11831183                                                        'fail_id3'  => 'ERROR',
    11841184                                                        'fail_ape'  => 'ERROR',
    11851185                                                ),
    1186 
     1186                                        'jpg'  => array(
     1187                                                        'pattern'   => '^WEBP',
     1188                                                        'group'     => 'graphic',
     1189                                                        'module'    => 'webp',
     1190                                                        'mime_type' => 'image/webp',
     1191                                                        'fail_id3'  => 'ERROR',
     1192                                                        'fail_ape'  => 'ERROR',
     1193                                                ),
    11871194                                // PCD  - still image - Kodak Photo CD
    11881195                                'pcd'  => array(
    11891196                                                        'pattern'   => '^.{2048}PCD_IPI\\x00',
  • src/wp-includes/class-wp-image-editor-gd.php

    diff --git src/wp-includes/class-wp-image-editor-gd.php src/wp-includes/class-wp-image-editor-gd.php
    index ed0a7be279..9fca3a692a 100644
    class WP_Image_Editor_GD extends WP_Image_Editor { 
    6969                                return ( $image_types & IMG_PNG ) != 0;
    7070                        case 'image/gif':
    7171                                return ( $image_types & IMG_GIF ) != 0;
     72                        case 'image/webp':
     73                                return ( $image_types & IMG_WEBP ) != 0;
    7274                }
    7375
    7476                return false;
    class WP_Image_Editor_GD extends WP_Image_Editor { 
    99101                        return new WP_Error( 'error_loading_image', __( 'File doesn’t exist?' ), $this->file );
    100102                }
    101103
    102                 $this->image = @imagecreatefromstring( $file_contents );
     104                // WebP may not work with imagecreatefromstring().
     105                if (
     106                        function_exists( 'imagecreatefromwebp' ) &&
     107                        ( 'image/webp' === wp_get_image_mime( $this->file ) )
     108                ) {
     109                        $this->image = @imagecreatefromwebp( $this->file );
     110                } else {
     111                        $this->image = @imagecreatefromstring( $file_contents );
     112                }
    103113
    104114                if ( ! is_gd_image( $this->image ) ) {
    105115                        return new WP_Error( 'invalid_image', __( 'File is not an image.' ), $this->file );
    106116                }
    107117
    108                 $size = wp_getimagesize( $this->file );
     118                $size = wp_get_image_size( $this->file );
    109119
    110120                if ( ! $size ) {
    111121                        return new WP_Error( 'invalid_image', __( 'Could not read image size.' ), $this->file );
    class WP_Image_Editor_GD extends WP_Image_Editor { 
    459469                        if ( ! $this->make_image( $filename, 'imagejpeg', array( $image, $filename, $this->get_quality() ) ) ) {
    460470                                return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
    461471                        }
     472                } elseif ( 'image/webp' == $mime_type ) {
     473                        if ( ! $this->make_image( $filename, 'imagewebp', array( $image, $filename, $this->get_quality() ) ) ) {
     474                                return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
     475                        }
    462476                } else {
    463477                        return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
    464478                }
    class WP_Image_Editor_GD extends WP_Image_Editor { 
    502516                        case 'image/gif':
    503517                                header( 'Content-Type: image/gif' );
    504518                                return imagegif( $this->image );
     519                        case 'image/webp':
     520                                if ( function_exists( 'imagewebp' ) ) {
     521                                        header( 'Content-Type: image/webp' );
     522                                        return imagewebp( $this->image, null, $this->get_quality() );
     523                                }
     524                                // Fall back to the default if webp isn't supported.
    505525                        default:
    506526                                header( 'Content-Type: image/jpeg' );
    507527                                return imagejpeg( $this->image, null, $this->get_quality() );
  • src/wp-includes/class-wp-image-editor-imagick.php

    diff --git src/wp-includes/class-wp-image-editor-imagick.php src/wp-includes/class-wp-image-editor-imagick.php
    index e4f1ea1b16..8744780330 100644
    class WP_Image_Editor_Imagick extends WP_Image_Editor { 
    380380                                $this->image->setOption( 'png:exclude-chunk', 'all' );
    381381                        }
    382382
     383                        if ( 'image/webp' === $this->mime_type ) {
     384                                $this->image->setOption( 'webp:emulate-jpeg-size', true );
     385                        }
     386
    383387                        /*
    384388                         * If alpha channel is not defined, set it opaque.
    385389                         *
  • src/wp-includes/class-wp-theme.php

    diff --git src/wp-includes/class-wp-theme.php src/wp-includes/class-wp-theme.php
    index 338df4b8f4..7d2c4294b7 100644
    final class WP_Theme implements ArrayAccess { 
    11411141                        return false;
    11421142                }
    11431143
    1144                 foreach ( array( 'png', 'gif', 'jpg', 'jpeg' ) as $ext ) {
     1144                foreach ( array( 'png', 'gif', 'jpg', 'jpeg', 'webp' ) as $ext ) {
    11451145                        if ( file_exists( $this->get_stylesheet_directory() . "/screenshot.$ext" ) ) {
    11461146                                $this->cache_add( 'screenshot', 'screenshot.' . $ext );
    11471147                                if ( 'relative' === $uri ) {
  • src/wp-includes/compat.php

    diff --git src/wp-includes/compat.php src/wp-includes/compat.php
    index 7f6c59f03c..c68c215bd3 100644
    if ( ! function_exists( 'is_iterable' ) ) { 
    370370                return ( is_array( $var ) || $var instanceof Traversable );
    371371        }
    372372}
     373
     374// WebP constants may not be defined, even in cases where the format is supported.
     375if ( ! defined( 'IMAGETYPE_WEBP' ) ) {
     376        define( 'IMAGETYPE_WEBP', 18 );
     377}
     378if ( ! defined( 'IMG_WEBP' ) ) {
     379        define( 'IMG_WEBP', IMAGETYPE_WEBP );
     380}
  • src/wp-includes/customize/class-wp-customize-media-control.php

    diff --git src/wp-includes/customize/class-wp-customize-media-control.php src/wp-includes/customize/class-wp-customize-media-control.php
    index fc4801a96e..1dc1b8c277 100644
    class WP_Customize_Media_Control extends WP_Customize_Control { 
    9191                                // Fake an attachment model - needs all fields used by template.
    9292                                // Note that the default value must be a URL, NOT an attachment ID.
    9393                                $ext  = substr( $this->setting->default, -3 );
    94                                 $type = in_array( $ext, array( 'jpg', 'png', 'gif', 'bmp' ), true ) ? 'image' : 'document';
     94                                $type = in_array( $ext, array( 'jpg', 'png', 'gif', 'bmp', 'webp' ), true ) ? 'image' : 'document';
    9595
    9696                                $default_attachment = array(
    9797                                        'id'    => 1,
  • src/wp-includes/deprecated.php

    diff --git src/wp-includes/deprecated.php src/wp-includes/deprecated.php
    index 72a23cd836..4379fadda5 100644
    function gd_edit_image_support($mime_type) { 
    33403340                                return (imagetypes() & IMG_PNG) != 0;
    33413341                        case 'image/gif':
    33423342                                return (imagetypes() & IMG_GIF) != 0;
     3343                        case 'image/webp':
     3344                                return (imagetypes() & IMG_WEBP) != 0;
    33433345                }
    33443346        } else {
    33453347                switch( $mime_type ) {
    function gd_edit_image_support($mime_type) { 
    33493351                                return function_exists('imagecreatefrompng');
    33503352                        case 'image/gif':
    33513353                                return function_exists('imagecreatefromgif');
     3354                        case 'image/webp':
     3355                                return function_exists('imagecreatefromwebp');
    33523356                }
    33533357        }
    33543358        return false;
  • src/wp-includes/formatting.php

    diff --git src/wp-includes/formatting.php src/wp-includes/formatting.php
    index b716c6bc1f..8dda8c738d 100644
    function translate_smiley( $matches ) { 
    33183318
    33193319        $matches    = array();
    33203320        $ext        = preg_match( '/\.([^.]+)$/', $img, $matches ) ? strtolower( $matches[1] ) : false;
    3321         $image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' );
     3321        $image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp' );
    33223322
    33233323        // Don't convert smilies that aren't images - they're probably emoji.
    33243324        if ( ! in_array( $ext, $image_exts, true ) ) {
  • src/wp-includes/functions.php

    diff --git src/wp-includes/functions.php src/wp-includes/functions.php
    index 56f50ce2de..4e9557286a 100644
    function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) { 
    28802880                                        'image/gif'  => 'gif',
    28812881                                        'image/bmp'  => 'bmp',
    28822882                                        'image/tiff' => 'tif',
     2883                                        'image/webp' => 'webp',
    28832884                                )
    28842885                        );
    28852886
    function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) { 
    30313032        return apply_filters( 'wp_check_filetype_and_ext', compact( 'ext', 'type', 'proper_filename' ), $file, $filename, $mimes, $real_mime );
    30323033}
    30333034
     3035/**
     3036 * Wrapper for getimagesize()
     3037 *
     3038 * The native PHP function might not support newer formats.
     3039 *
     3040 * @since 5.0
     3041 *
     3042 * @see {https://core.trac.wordpress.org/ticket/35725}
     3043 *
     3044 * @param string $file Full path to the file.
     3045 * @param array $info Additional metadata to pull.
     3046 * @return array|false An array containing width, height, type constant, attributes, and media type.
     3047 */
     3048function wp_get_image_size( $file, &$info = array() ) {
     3049        // Try getimagesize() first.
     3050        $info = @getimagesize( $file, $info );
     3051        if ( false !== $info ) {
     3052                return $info;
     3053        }
     3054
     3055        // Support for WebP did not land in getimagesize() until PHP 7.1. But that's OK,
     3056        // we can pull what we need from the file headers.
     3057        if ( 'image/webp' === wp_get_image_mime( $file ) ) {
     3058                try {
     3059                        $handle = fopen( $file, 'rb' );
     3060                        if ( $handle ) {
     3061                                $magic = fread( $handle, 40 );
     3062                                fclose( $handle );
     3063
     3064                                // Make sure we got enough bytes.
     3065                                if ( strlen( $magic ) < 40 ) {
     3066                                        return false;
     3067                                }
     3068
     3069                                $width = false;
     3070                                $height = false;
     3071
     3072                                // The headers are a little different for each of the three formats.
     3073                                switch ( substr( $magic, 12, 4 ) ) {
     3074                                        // Lossy WebP.
     3075                                        case 'VP8 ':
     3076                                                $parts  = unpack( 'v2', substr( $magic, 26, 4 ) );
     3077                                                $width  = (int) ( $parts[1] & 0x3FFF );
     3078                                                $height = (int) ( $parts[2] & 0x3FFF );
     3079                                                break;
     3080                                        // Lossless WebP.
     3081                                        case 'VP8L':
     3082                                                $parts  = unpack( 'C4', substr( $magic, 21, 4 ) );
     3083                                                $width  = (int) ( $parts[1] | ( ( $parts[2] & 0x3F ) << 8 ) ) + 1;
     3084                                                $height = (int) ( ( ( $parts[2] & 0xC0 ) >> 6 ) |
     3085                                                                                ( $parts[3] << 2 ) | ( ( $parts[4] & 0x03 ) << 10 ) ) + 1;
     3086                                                break;
     3087                                        // Animated/alpha WebP.
     3088                                        case 'VP8X':
     3089                                                // Pad 24-bit int.
     3090                                                $width = unpack( 'V', substr( $magic, 24, 3 ) . "\x00" );
     3091                                                $width = (int) ( $width[1] & 0xFFFFFF ) + 1;
     3092
     3093                                                // Pad 24-bit int.
     3094                                                $height = unpack( 'V', substr( $magic, 27, 3 ) . "\x00" );
     3095                                                $height = (int) ( $height[1] & 0xFFFFFF ) + 1;
     3096                                                break;
     3097                                }
     3098
     3099                                // Mimic the native return format.
     3100                                if ( $width && $height ) {
     3101                                        return array(
     3102                                                $width,
     3103                                                $height,
     3104                                                IMAGETYPE_WEBP,
     3105                                                sprintf(
     3106                                                        'width="%d" height="%d"',
     3107                                                        $width,
     3108                                                        $height
     3109                                                ),
     3110                                                'mime' => 'image/webp',
     3111                                        );
     3112                                }
     3113
     3114                                // The image could not be parsed.
     3115                                return false;
     3116                        }
     3117                } catch ( Exception $e ) {
     3118                        return false;
     3119                }
     3120
     3121                return false;
     3122        }
     3123}
     3124
    30343125/**
    30353126 * Returns the real mime type of an image file.
    30363127 *
    function wp_get_image_mime( $file ) { 
    30523143                        $imagetype = exif_imagetype( $file );
    30533144                        $mime      = ( $imagetype ) ? image_type_to_mime_type( $imagetype ) : false;
    30543145                } elseif ( function_exists( 'getimagesize' ) ) {
    3055                         $imagesize = wp_getimagesize( $file );
     3146                        $imagesize = wp_get_image_size( $file );
    30563147                        $mime      = ( isset( $imagesize['mime'] ) ) ? $imagesize['mime'] : false;
    30573148                } else {
    30583149                        $mime = false;
    30593150                }
     3151
     3152                // WebP support took longer to land in Exif than GD.
     3153                if ( ! $mime ) {
     3154                        $handle = fopen( $file, 'rb' );
     3155                        if ( $handle ) {
     3156                                $magic = bin2hex( fread( $handle, 12 ) );
     3157                                if (
     3158                                        // RIFF.
     3159                                        ( 0 === strpos( $magic, '52494646' ) ) &&
     3160                                        // WEBP.
     3161                                        ( 16 === strpos( $magic, '57454250' ) )
     3162                                ) {
     3163                                        $mime = 'image/webp';
     3164                                }
     3165                                fclose( $handle );
     3166                        }
     3167                }
    30603168        } catch ( Exception $e ) {
    30613169                $mime = false;
    30623170        }
    function wp_get_ext_types() { 
    32163324        return apply_filters(
    32173325                'ext2type',
    32183326                array(
    3219                         'image'       => array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'tif', 'tiff', 'ico', 'heic' ),
     3327                        'image'       => array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'tif', 'tiff', 'ico', 'heic', 'webp' ),
    32203328                        'audio'       => array( 'aac', 'ac3', 'aif', 'aiff', 'flac', 'm3a', 'm4a', 'm4b', 'mka', 'mp1', 'mp2', 'mp3', 'ogg', 'oga', 'ram', 'wav', 'wma' ),
    32213329                        'video'       => array( '3g2', '3gp', '3gpp', 'asf', 'avi', 'divx', 'dv', 'flv', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'mpv', 'ogm', 'ogv', 'qt', 'rm', 'vob', 'wmv' ),
    32223330                        'document'    => array( 'doc', 'docx', 'docm', 'dotm', 'odt', 'pages', 'pdf', 'xps', 'oxps', 'rtf', 'wp', 'wpd', 'psd', 'xcf' ),
  • src/wp-includes/media.php

    diff --git src/wp-includes/media.php src/wp-includes/media.php
    index 349bcbae1d..a9c725250c 100644
    function image_downsize( $id, $size = 'medium' ) { 
    244244                $info       = null;
    245245
    246246                if ( $thumb_file ) {
    247                         $info = wp_getimagesize( $thumb_file );
     247                        $info = wp_get_image_size( $thumb_file );
    248248                }
    249249
    250250                if ( $thumb_file && $info ) {
    function wp_get_attachment_image_src( $attachment_id, $size = 'thumbnail', $icon 
    962962                                $icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/media' );
    963963
    964964                                $src_file               = $icon_dir . '/' . wp_basename( $src );
    965                                 list( $width, $height ) = wp_getimagesize( $src_file );
     965                                list( $width, $height ) = wp_get_image_size( $src_file );
    966966                        }
    967967                }
    968968
  • src/wp-includes/post.php

    diff --git src/wp-includes/post.php src/wp-includes/post.php
    index b46d97bf14..42359e5f2c 100644
    function wp_attachment_is( $type, $post = null ) { 
    64976497
    64986498        switch ( $type ) {
    64996499                case 'image':
    6500                         $image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' );
     6500                        $image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp' );
    65016501                        return in_array( $ext, $image_exts, true );
    65026502
    65036503                case 'audio':
  • tests/phpunit/tests/functions.php

    diff --git tests/phpunit/tests/functions.php tests/phpunit/tests/functions.php
    index f485d3b4ec..980486b022 100644
    class Tests_Functions extends WP_UnitTestCase { 
    12251225                $this->assertSame( $expected, wp_get_image_mime( $file ) );
    12261226        }
    12271227
     1228        /**
     1229         * @ticket 35725
     1230         * @dataProvider _wp_get_image_size
     1231         */
     1232        public function test_wp_get_image_size( $file, $expected ) {
     1233                if ( ! is_callable( 'exif_imagetype' ) && ! function_exists( 'getimagesize' ) ) {
     1234                        $this->markTestSkipped( 'The exif PHP extension is not loaded.' );
     1235                }
     1236
     1237                $result = wp_get_image_size( $file );
     1238
     1239                // The getimagesize() function varies in its response, so
     1240                // let's restrict comparison to expected keys only.
     1241                if ( is_array( $expected ) ) {
     1242                        foreach ( $expected as $k => $v ) {
     1243                                $this->assertEquals( true, isset( $result[ $k ] ) );
     1244                                $this->assertEquals( $expected[ $k ], $result[ $k ] );
     1245                        }
     1246                } else {
     1247                        $this->assertEquals( $expected, $result );
     1248                }
     1249        }
     1250
    12281251        /**
    12291252         * @ticket 39550
    12301253         * @dataProvider _wp_check_filetype_and_ext_data
    class Tests_Functions extends WP_UnitTestCase { 
    13131336                                DIR_TESTDATA . '/images/test-image-mime-jpg.png',
    13141337                                'image/jpeg',
    13151338                        ),
     1339                        // Animated WebP.
     1340                        array(
     1341                                DIR_TESTDATA . '/images/webp-animated.webp',
     1342                                'image/webp',
     1343                        ),
     1344                        // Lossless WebP.
     1345                        array(
     1346                                DIR_TESTDATA . '/images/webp-lossless.webp',
     1347                                'image/webp',
     1348                        ),
     1349                        // Lossy WebP.
     1350                        array(
     1351                                DIR_TESTDATA . '/images/webp-lossy.webp',
     1352                                'image/webp',
     1353                        ),
     1354                        // Transparent WebP.
     1355                        array(
     1356                                DIR_TESTDATA . '/images/webp-transparent.webp',
     1357                                'image/webp',
     1358                        ),
     1359                        // Not an image.
     1360                        array(
     1361                                DIR_TESTDATA . '/uploads/dashicons.woff',
     1362                                false,
     1363                        ),
     1364                );
     1365
     1366                return $data;
     1367        }
     1368
     1369        /**
     1370         * Data profider for test_wp_get_image_size();
     1371         */
     1372        public function _wp_get_image_size() {
     1373                $data = array(
     1374                        // Standard JPEG.
     1375                        array(
     1376                                DIR_TESTDATA . '/images/test-image.jpg',
     1377                                array(
     1378                                        50,
     1379                                        50,
     1380                                        IMAGETYPE_JPEG,
     1381                                        'width="50" height="50"',
     1382                                        'mime' => 'image/jpeg',
     1383                                ),
     1384                        ),
     1385                        // Standard GIF.
     1386                        array(
     1387                                DIR_TESTDATA . '/images/test-image.gif',
     1388                                array(
     1389                                        50,
     1390                                        50,
     1391                                        IMAGETYPE_GIF,
     1392                                        'width="50" height="50"',
     1393                                        'mime' => 'image/gif',
     1394                                ),
     1395                        ),
     1396                        // Standard PNG.
     1397                        array(
     1398                                DIR_TESTDATA . '/images/test-image.png',
     1399                                array(
     1400                                        50,
     1401                                        50,
     1402                                        IMAGETYPE_PNG,
     1403                                        'width="50" height="50"',
     1404                                        'mime' => 'image/png',
     1405                                ),
     1406                        ),
     1407                        // Image with wrong extension.
     1408                        array(
     1409                                DIR_TESTDATA . '/images/test-image-mime-jpg.png',
     1410                                array(
     1411                                        50,
     1412                                        50,
     1413                                        IMAGETYPE_JPEG,
     1414                                        'width="50" height="50"',
     1415                                        'mime' => 'image/jpeg',
     1416                                ),
     1417                        ),
     1418                        // Animated WebP.
     1419                        array(
     1420                                DIR_TESTDATA . '/images/webp-animated.webp',
     1421                                array(
     1422                                        100,
     1423                                        100,
     1424                                        IMAGETYPE_WEBP,
     1425                                        'width="100" height="100"',
     1426                                        'mime' => 'image/webp',
     1427                                ),
     1428                        ),
     1429                        // Lossless WebP.
     1430                        array(
     1431                                DIR_TESTDATA . '/images/webp-lossless.webp',
     1432                                array(
     1433                                        1200,
     1434                                        675,
     1435                                        IMAGETYPE_WEBP,
     1436                                        'width="1200" height="675"',
     1437                                        'mime' => 'image/webp',
     1438                                ),
     1439                        ),
     1440                        // Lossy WebP.
     1441                        array(
     1442                                DIR_TESTDATA . '/images/webp-lossy.webp',
     1443                                array(
     1444                                        1200,
     1445                                        675,
     1446                                        IMAGETYPE_WEBP,
     1447                                        'width="1200" height="675"',
     1448                                        'mime' => 'image/webp',
     1449                                ),
     1450                        ),
     1451                        // Transparent WebP.
     1452                        array(
     1453                                DIR_TESTDATA . '/images/webp-transparent.webp',
     1454                                array(
     1455                                        1200,
     1456                                        675,
     1457                                        IMAGETYPE_WEBP,
     1458                                        'width="1200" height="675"',
     1459                                        'mime' => 'image/webp',
     1460                                ),
     1461                        ),
    13161462                        // Not an image.
    13171463                        array(
    13181464                                DIR_TESTDATA . '/uploads/dashicons.woff',
  • tests/phpunit/tests/image/functions.php

    diff --git tests/phpunit/tests/image/functions.php tests/phpunit/tests/image/functions.php
    index 1694c1e7f1..f2fb854f28 100644
    class Tests_Image_Functions extends WP_UnitTestCase { 
    5959                        'test-image.psd',
    6060                        'test-image-zip.tiff',
    6161                        'test-image.jpg',
     62                        'webp-animated.webp',
     63                        'webp-lossless.webp',
     64                        'webp-lossy.webp',
     65                        'webp-transparent.webp',
    6266                );
    6367
    6468                // IMAGETYPE_ICO is only defined in PHP 5.3+.
    class Tests_Image_Functions extends WP_UnitTestCase { 
    9094                        'test-image.gif',
    9195                        'test-image.png',
    9296                        'test-image.jpg',
     97                        'webp-animated.webp',
     98                        'webp-lossless.webp',
     99                        'webp-lossy.webp',
     100                        'webp-transparent.webp',
    93101                );
    94102
    95103                // IMAGETYPE_ICO is only defined in PHP 5.3+.
    class Tests_Image_Functions extends WP_UnitTestCase { 
    172180                        'image/jpeg',
    173181                        'image/gif',
    174182                        'image/png',
     183                        'image/webp',
    175184                );
    176185
    177186                // Test each image editor engine.
    class Tests_Image_Functions extends WP_UnitTestCase { 
    270279                        'jpe'  => 'image/jpeg',
    271280                        'gif'  => 'image/gif',
    272281                        'png'  => 'image/png',
    273                         'unk'  => 'image/jpeg', // Default, unknown.
     282                        'webp' => 'image/webp',
     283                        'unk'  => 'image/jpeg',   // Default, unknown.
    274284                );
    275285
    276286                // Test each image editor engine.