<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[50810] trunk: Images: enable WebP support.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/50810">50810</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/50810","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>adamsilverstein</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2021-05-04 14:43:36 +0000 (Tue, 04 May 2021)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Images: enable WebP support.

Add support for uploading, editing and saving WebP images when supported by the server.

Add 'image/webp' to supported mime types. Correctly identify WebP images and sizes even when PHP doesn't support WebP. Resize uploaded WebP files (when supported) and use for front end markup.

Props markoheijne, blobfolio, Clorith, joemcgill, atjn, desrosj, spacedmonkey, marylauc, mikeschroder, hellofromtonya, flixos90.
Fixes <a href="https://core.trac.wordpress.org/ticket/35725">#35725</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludesimageeditphp">trunk/src/wp-admin/includes/image-edit.php</a></li>
<li><a href="#trunksrcwpadminincludesimagephp">trunk/src/wp-admin/includes/image.php</a></li>
<li><a href="#trunksrcwpadminincludesmediaphp">trunk/src/wp-admin/includes/media.php</a></li>
<li><a href="#trunksrcwpadminincludesschemaphp">trunk/src/wp-admin/includes/schema.php</a></li>
<li><a href="#trunksrcwpincludesclasswpimageeditorgdphp">trunk/src/wp-includes/class-wp-image-editor-gd.php</a></li>
<li><a href="#trunksrcwpincludesclasswpimageeditorimagickphp">trunk/src/wp-includes/class-wp-image-editor-imagick.php</a></li>
<li><a href="#trunksrcwpincludesclasswpthemephp">trunk/src/wp-includes/class-wp-theme.php</a></li>
<li><a href="#trunksrcwpincludescompatphp">trunk/src/wp-includes/compat.php</a></li>
<li><a href="#trunksrcwpincludescustomizeclasswpcustomizemediacontrolphp">trunk/src/wp-includes/customize/class-wp-customize-media-control.php</a></li>
<li><a href="#trunksrcwpincludesdeprecatedphp">trunk/src/wp-includes/deprecated.php</a></li>
<li><a href="#trunksrcwpincludesformattingphp">trunk/src/wp-includes/formatting.php</a></li>
<li><a href="#trunksrcwpincludesfunctionsphp">trunk/src/wp-includes/functions.php</a></li>
<li><a href="#trunksrcwpincludesmediaphp">trunk/src/wp-includes/media.php</a></li>
<li><a href="#trunksrcwpincludespostphp">trunk/src/wp-includes/post.php</a></li>
<li><a href="#trunksrcwpincludesrestapiendpointsclasswprestattachmentscontrollerphp">trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php</a></li>
<li><a href="#trunktestsphpunittestsfunctionsphp">trunk/tests/phpunit/tests/functions.php</a></li>
<li><a href="#trunktestsphpunittestsimageeditorphp">trunk/tests/phpunit/tests/image/editor.php</a></li>
<li><a href="#trunktestsphpunittestsimagefunctionsphp">trunk/tests/phpunit/tests/image/functions.php</a></li>
<li><a href="#trunktestsphpunittestsimageresizephp">trunk/tests/phpunit/tests/image/resize.php</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunktestsphpunitdataimagestestimagewebp">trunk/tests/phpunit/data/images/test-image.webp</a></li>
<li><a href="#trunktestsphpunitdataimageswebpanimatedwebp">trunk/tests/phpunit/data/images/webp-animated.webp</a></li>
<li><a href="#trunktestsphpunitdataimageswebplosslesswebp">trunk/tests/phpunit/data/images/webp-lossless.webp</a></li>
<li><a href="#trunktestsphpunitdataimageswebplossywebp">trunk/tests/phpunit/data/images/webp-lossy.webp</a></li>
<li><a href="#trunktestsphpunitdataimageswebptransparentwebp">trunk/tests/phpunit/data/images/webp-transparent.webp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminincludesimageeditphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/image-edit.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/image-edit.php        2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-admin/includes/image-edit.php  2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -306,6 +306,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        case 'image/gif':
</span><span class="cx" style="display: block; padding: 0 10px">                                header( 'Content-Type: image/gif' );
</span><span class="cx" style="display: block; padding: 0 10px">                                return imagegif( $image );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        case 'image/webp':
+                               if ( function_exists( 'imagewebp' ) ) {
+                                       header( 'Content-Type: image/webp' );
+                                       return imagewebp( $image, null, 90 );
+                               }
+                               return false;
</ins><span class="cx" style="display: block; padding: 0 10px">                         default:
</span><span class="cx" style="display: block; padding: 0 10px">                                return false;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -391,6 +397,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                return imagepng( $image, $filename );
</span><span class="cx" style="display: block; padding: 0 10px">                        case 'image/gif':
</span><span class="cx" style="display: block; padding: 0 10px">                                return imagegif( $image, $filename );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        case 'image/webp':
+                               if ( function_exists( 'imagewebp' ) ) {
+                                       return imagewebp( $image, $filename );
+                               }
+                               return false;
</ins><span class="cx" style="display: block; padding: 0 10px">                         default:
</span><span class="cx" style="display: block; padding: 0 10px">                                return false;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span></span></pre></div>
<a id="trunksrcwpadminincludesimagephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/image.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/image.php     2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-admin/includes/image.php       2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -517,6 +517,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                case 'image/png':
</span><span class="cx" style="display: block; padding: 0 10px">                                        $ext = '.png';
</span><span class="cx" style="display: block; padding: 0 10px">                                        break;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                case 'image/webp':
+                                       $ext = '.webp';
+                                       break;
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><span class="cx" style="display: block; padding: 0 10px">                        $basename = str_replace( '.', '-', wp_basename( $file ) ) . '-image' . $ext;
</span><span class="cx" style="display: block; padding: 0 10px">                        $uploaded = wp_upload_bits( $basename, '', $metadata['image']['data'] );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -913,7 +916,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return bool True if suitable, false if not suitable.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function file_is_displayable_image( $path ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $displayable_image_types = array( IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP, IMAGETYPE_ICO );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $displayable_image_types = array( IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP, IMAGETYPE_ICO, IMAGETYPE_WEBP ); // phpcs:ignore PHPCompatibility.Constants.NewConstants.imagetype_webpFound
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $info = wp_getimagesize( $path );
</span><span class="cx" style="display: block; padding: 0 10px">        if ( empty( $info ) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -963,6 +966,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">                case 'image/gif':
</span><span class="cx" style="display: block; padding: 0 10px">                        $image = imagecreatefromgif( $filepath );
</span><span class="cx" style="display: block; padding: 0 10px">                        break;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                case 'image/webp':
+                       $image = false;
+                       if ( function_exists( 'imagecreatefromwebp' ) ) {
+                               $image = imagecreatefromwebp( $filepath );
+                       }
+                       break;
</ins><span class="cx" style="display: block; padding: 0 10px">                 default:
</span><span class="cx" style="display: block; padding: 0 10px">                        $image = false;
</span><span class="cx" style="display: block; padding: 0 10px">                        break;
</span></span></pre></div>
<a id="trunksrcwpadminincludesmediaphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/media.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/media.php     2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-admin/includes/media.php       2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -993,7 +993,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> function media_sideload_image( $file, $post_id = 0, $desc = null, $return = 'html' ) {
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! empty( $file ) ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $allowed_extensions = array( 'jpg', 'jpeg', 'jpe', 'png', 'gif' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $allowed_extensions = array( 'jpg', 'jpeg', 'jpe', 'png', 'gif', 'webp' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                /**
</span><span class="cx" style="display: block; padding: 0 10px">                 * Filters the list of allowed file extensions when sideloading an image from a URL.
</span></span></pre></div>
<a id="trunksrcwpadminincludesschemaphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/schema.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/schema.php    2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-admin/includes/schema.php      2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1215,6 +1215,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                'jpeg',
</span><span class="cx" style="display: block; padding: 0 10px">                'png',
</span><span class="cx" style="display: block; padding: 0 10px">                'gif',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                'webp',
</ins><span class="cx" style="display: block; padding: 0 10px">                 // Video.
</span><span class="cx" style="display: block; padding: 0 10px">                'mov',
</span><span class="cx" style="display: block; padding: 0 10px">                'avi',
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpimageeditorgdphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-image-editor-gd.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-image-editor-gd.php        2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-includes/class-wp-image-editor-gd.php  2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -69,6 +69,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                return ( $image_types & IMG_PNG ) != 0;
</span><span class="cx" style="display: block; padding: 0 10px">                        case 'image/gif':
</span><span class="cx" style="display: block; padding: 0 10px">                                return ( $image_types & IMG_GIF ) != 0;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        case 'image/webp':
+                               return ( $image_types & IMG_WEBP ) != 0; // phpcs:ignore PHPCompatibility.Constants.NewConstants.img_webpFound
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                return false;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -99,7 +101,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        return new WP_Error( 'error_loading_image', __( 'File doesn&#8217;t exist?' ), $this->file );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->image = @imagecreatefromstring( $file_contents );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         // WebP may not work with imagecreatefromstring().
+               if (
+                       function_exists( 'imagecreatefromwebp' ) &&
+                       ( 'image/webp' === wp_get_image_mime( $this->file ) )
+               ) {
+                       $this->image = @imagecreatefromwebp( $this->file );
+               } else {
+                       $this->image = @imagecreatefromstring( $file_contents );
+               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ! is_gd_image( $this->image ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        return new WP_Error( 'invalid_image', __( 'File is not an image.' ), $this->file );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -459,6 +469,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( ! $this->make_image( $filename, 'imagejpeg', array( $image, $filename, $this->get_quality() ) ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                } elseif ( 'image/webp' == $mime_type ) {
+                       if ( ! function_exists( 'imagewebp' ) || ! $this->make_image( $filename, 'imagewebp', array( $image, $filename, $this->get_quality() ) ) ) {
+                               return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
+                       }
</ins><span class="cx" style="display: block; padding: 0 10px">                 } else {
</span><span class="cx" style="display: block; padding: 0 10px">                        return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -502,6 +516,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        case 'image/gif':
</span><span class="cx" style="display: block; padding: 0 10px">                                header( 'Content-Type: image/gif' );
</span><span class="cx" style="display: block; padding: 0 10px">                                return imagegif( $this->image );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        case 'image/webp':
+                               if ( function_exists( 'imagewebp' ) ) {
+                                       header( 'Content-Type: image/webp' );
+                                       return imagewebp( $this->image, null, $this->get_quality() );
+                               }
+                               // Fall back to the default if webp isn't supported.
</ins><span class="cx" style="display: block; padding: 0 10px">                         default:
</span><span class="cx" style="display: block; padding: 0 10px">                                header( 'Content-Type: image/jpeg' );
</span><span class="cx" style="display: block; padding: 0 10px">                                return imagejpeg( $this->image, null, $this->get_quality() );
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpimageeditorimagickphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-image-editor-imagick.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-image-editor-imagick.php   2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-includes/class-wp-image-editor-imagick.php     2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -197,19 +197,30 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                try {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( 'image/jpeg' === $this->mime_type ) {
-                               $this->image->setImageCompressionQuality( $quality );
-                               $this->image->setImageCompression( imagick::COMPRESSION_JPEG );
-                       } else {
-                               $this->image->setImageCompressionQuality( $quality );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 switch ( $this->mime_type ) {
+                               case 'image/jpeg':
+                                       $this->image->setImageCompressionQuality( $quality );
+                                       $this->image->setImageCompression( imagick::COMPRESSION_JPEG );
+                                       break;
+                               case 'image/webp':
+                                       if ( _wp_webp_is_lossy( $this->file ) ) {
+                                               $this->image->setImageCompressionQuality( $quality );
+                                       } else {
+                                               // Use WebP lossless settings.
+                                               $this->image->setImageCompressionQuality( 100 );
+                                               $this->image->setOption( 'webp:lossless', 'true' );
+                                       }
+                                       break;
+                               default:
+                                       $this->image->setImageCompressionQuality( $quality );
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><span class="cx" style="display: block; padding: 0 10px">                } catch ( Exception $e ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        return new WP_Error( 'image_quality_error', $e->getMessage() );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-
</del><span class="cx" style="display: block; padding: 0 10px">                 return true;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Sets or updates current image size.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpthemephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-theme.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-theme.php  2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-includes/class-wp-theme.php    2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1141,7 +1141,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        return false;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                foreach ( array( 'png', 'gif', 'jpg', 'jpeg' ) as $ext ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         foreach ( array( 'png', 'gif', 'jpg', 'jpeg', 'webp' ) as $ext ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         if ( file_exists( $this->get_stylesheet_directory() . "/screenshot.$ext" ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $this->cache_add( 'screenshot', 'screenshot.' . $ext );
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( 'relative' === $uri ) {
</span></span></pre></div>
<a id="trunksrcwpincludescompatphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/compat.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/compat.php  2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-includes/compat.php    2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -370,3 +370,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return ( is_array( $var ) || $var instanceof Traversable );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+// WebP constants may not be defined, even in cases where the format is supported.
+if ( ! defined( 'IMAGETYPE_WEBP' ) ) {
+       define( 'IMAGETYPE_WEBP', 18 );
+}
+if ( ! defined( 'IMG_WEBP' ) ) {
+       define( 'IMG_WEBP', IMAGETYPE_WEBP ); // phpcs:ignore PHPCompatibility.Constants.NewConstants.imagetype_webpFound
+}
</ins></span></pre></div>
<a id="trunksrcwpincludescustomizeclasswpcustomizemediacontrolphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/customize/class-wp-customize-media-control.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/customize/class-wp-customize-media-control.php      2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-includes/customize/class-wp-customize-media-control.php        2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -91,7 +91,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                // Fake an attachment model - needs all fields used by template.
</span><span class="cx" style="display: block; padding: 0 10px">                                // Note that the default value must be a URL, NOT an attachment ID.
</span><span class="cx" style="display: block; padding: 0 10px">                                $ext  = substr( $this->setting->default, -3 );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $type = in_array( $ext, array( 'jpg', 'png', 'gif', 'bmp' ), true ) ? 'image' : 'document';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $type = in_array( $ext, array( 'jpg', 'png', 'gif', 'bmp', 'webp' ), true ) ? 'image' : 'document';
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                $default_attachment = array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'id'    => 1,
</span></span></pre></div>
<a id="trunksrcwpincludesdeprecatedphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/deprecated.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/deprecated.php      2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-includes/deprecated.php        2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3340,6 +3340,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                return (imagetypes() & IMG_PNG) != 0;
</span><span class="cx" style="display: block; padding: 0 10px">                        case 'image/gif':
</span><span class="cx" style="display: block; padding: 0 10px">                                return (imagetypes() & IMG_GIF) != 0;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        case 'image/webp':
+                               return (imagetypes() & IMG_WEBP) != 0; // phpcs:ignore PHPCompatibility.Constants.NewConstants.img_webpFound
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">        } else {
</span><span class="cx" style="display: block; padding: 0 10px">                switch( $mime_type ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3349,6 +3351,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                return function_exists('imagecreatefrompng');
</span><span class="cx" style="display: block; padding: 0 10px">                        case 'image/gif':
</span><span class="cx" style="display: block; padding: 0 10px">                                return function_exists('imagecreatefromgif');
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        case 'image/webp':
+                               return function_exists('imagecreatefromwebp');
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px">        return false;
</span></span></pre></div>
<a id="trunksrcwpincludesformattingphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/formatting.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/formatting.php      2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-includes/formatting.php        2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3318,7 +3318,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $matches    = array();
</span><span class="cx" style="display: block; padding: 0 10px">        $ext        = preg_match( '/\.([^.]+)$/', $img, $matches ) ? strtolower( $matches[1] ) : false;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // Don't convert smilies that aren't images - they're probably emoji.
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! in_array( $ext, $image_exts, true ) ) {
</span></span></pre></div>
<a id="trunksrcwpincludesfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/functions.php       2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-includes/functions.php 2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2886,6 +2886,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                        'image/gif'  => 'gif',
</span><span class="cx" style="display: block; padding: 0 10px">                                        'image/bmp'  => 'bmp',
</span><span class="cx" style="display: block; padding: 0 10px">                                        'image/tiff' => 'tif',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                        'image/webp' => 'webp',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 )
</span><span class="cx" style="display: block; padding: 0 10px">                        );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3063,6 +3064,35 @@
</span><span class="cx" style="display: block; padding: 0 10px">                } else {
</span><span class="cx" style="display: block; padding: 0 10px">                        $mime = false;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+               if ( false !== $mime ) {
+                       return $mime;
+               }
+
+               $handle = fopen( $file, 'rb' );
+               if ( false === $handle ) {
+                       return false;
+               }
+
+               $magic = fread( $handle, 12 );
+               if ( false === $magic ) {
+                       return false;
+               }
+
+               // Add WebP fallback detection when image library doesn't support WebP.
+               // Note: detection values come from LibWebP, see
+               // https://github.com/webmproject/libwebp/blob/master/imageio/image_dec.c#L30
+               $magic = bin2hex( $magic );
+               if (
+                       // RIFF.
+                       ( 0 === strpos( $magic, '52494646' ) ) &&
+                       // WEBP.
+                       ( 16 === strpos( $magic, '57454250' ) )
+               ) {
+                       $mime = 'image/webp';
+               }
+
+               fclose( $handle );
</ins><span class="cx" style="display: block; padding: 0 10px">         } catch ( Exception $e ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $mime = false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3101,6 +3131,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'png'                          => 'image/png',
</span><span class="cx" style="display: block; padding: 0 10px">                        'bmp'                          => 'image/bmp',
</span><span class="cx" style="display: block; padding: 0 10px">                        'tiff|tif'                     => 'image/tiff',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        'webp'                         => 'image/webp',
</ins><span class="cx" style="display: block; padding: 0 10px">                         'ico'                          => 'image/x-icon',
</span><span class="cx" style="display: block; padding: 0 10px">                        'heic'                         => 'image/heic',
</span><span class="cx" style="display: block; padding: 0 10px">                        // Video formats.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3222,7 +3253,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        return apply_filters(
</span><span class="cx" style="display: block; padding: 0 10px">                'ext2type',
</span><span class="cx" style="display: block; padding: 0 10px">                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'image'       => array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'tif', 'tiff', 'ico', 'heic' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'image'       => array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'tif', 'tiff', 'ico', 'heic', 'webp' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'audio'       => array( 'aac', 'ac3', 'aif', 'aiff', 'flac', 'm3a', 'm4a', 'm4b', 'mka', 'mp1', 'mp2', 'mp3', 'ogg', 'oga', 'ram', 'wav', 'wma' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'video'       => array( '3g2', '3gp', '3gpp', 'asf', 'avi', 'divx', 'dv', 'flv', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'mpv', 'ogm', 'ogv', 'qt', 'rm', 'vob', 'wmv' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'document'    => array( 'doc', 'docx', 'docm', 'dotm', 'odt', 'pages', 'pdf', 'xps', 'oxps', 'rtf', 'wp', 'wpd', 'psd', 'xcf' ),
</span></span></pre></div>
<a id="trunksrcwpincludesmediaphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/media.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/media.php   2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-includes/media.php     2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -4980,6 +4980,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * Allows PHP's getimagesize() to be debuggable when necessary.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 5.7.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 5.8.0 Added support for WebP images.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @param string $filename   The file path.
</span><span class="cx" style="display: block; padding: 0 10px">  * @param array  $image_info Optional. Extended image information (passed by reference).
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -4994,9 +4995,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                defined( 'WP_DEBUG' ) && WP_DEBUG
</span><span class="cx" style="display: block; padding: 0 10px">        ) {
</span><span class="cx" style="display: block; padding: 0 10px">                if ( 2 === func_num_args() ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        return getimagesize( $filename, $image_info );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 return _wp_get_image_size( $filename, $image_info );
</ins><span class="cx" style="display: block; padding: 0 10px">                 } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        return getimagesize( $filename );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 return _wp_get_image_size( $filename );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -5011,9 +5012,133 @@
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        if ( 2 === func_num_args() ) {
</span><span class="cx" style="display: block; padding: 0 10px">                // phpcs:ignore WordPress.PHP.NoSilencedErrors
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return @getimagesize( $filename, $image_info );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         return @_wp_get_image_size( $filename, $image_info );
</ins><span class="cx" style="display: block; padding: 0 10px">         } else {
</span><span class="cx" style="display: block; padding: 0 10px">                // phpcs:ignore WordPress.PHP.NoSilencedErrors
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return @getimagesize( $filename );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         return @_wp_get_image_size( $filename );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+/**
+ * Extracts meta information about a webp file: width, height and type.
+ *
+ * @since 5.8.0
+ *
+ * @param [type] $filename Path to a WebP file.
+ * @return array $webp_info {
+ *     An array of WebP image information.
+ *
+ *     @type array $size {
+ *         @type int  $width  Image width.
+ *         @type int  $height Image height.
+ *         @type bool $type   The WebP type: one of 'lossy', 'lossless' or 'animated-alpha'.
+ *     }
+ */
+function wp_get_webp_info( $filename ) {
+       $width  = false;
+       $height = false;
+       $type   = false;
+       if ( ! 'image/webp' === wp_get_image_mime( $filename ) ) {
+               return compact( 'width', 'height', 'type' );
+       }
+       try {
+               $handle = fopen( $filename, 'rb' );
+               if ( $handle ) {
+                       $magic = fread( $handle, 40 );
+                       fclose( $handle );
+
+                       // Make sure we got enough bytes.
+                       if ( strlen( $magic ) < 40 ) {
+                               return compact( 'width', 'height', 'type' );
+                       }
+
+                       // The headers are a little different for each of the three formats.
+                       // Header values based on WebP docs, see https://developers.google.com/speed/webp/docs/riff_container.
+                       switch ( substr( $magic, 12, 4 ) ) {
+                               // Lossy WebP.
+                               case 'VP8 ':
+                                       $parts  = unpack( 'v2', substr( $magic, 26, 4 ) );
+                                       $width  = (int) ( $parts[1] & 0x3FFF );
+                                       $height = (int) ( $parts[2] & 0x3FFF );
+                                       $type   = 'lossy';
+                                       break;
+                               // Lossless WebP.
+                               case 'VP8L':
+                                       $parts  = unpack( 'C4', substr( $magic, 21, 4 ) );
+                                       $width  = (int) ( $parts[1] | ( ( $parts[2] & 0x3F ) << 8 ) ) + 1;
+                                       $height = (int) ( ( ( $parts[2] & 0xC0 ) >> 6 ) | ( $parts[3] << 2 ) | ( ( $parts[4] & 0x03 ) << 10 ) ) + 1;
+                                       $type   = 'lossless';
+                                       break;
+                               // Animated/alpha WebP.
+                               case 'VP8X':
+                                       // Pad 24-bit int.
+                                       $width = unpack( 'V', substr( $magic, 24, 3 ) . "\x00" );
+                                       $width = (int) ( $width[1] & 0xFFFFFF ) + 1;
+                                       // Pad 24-bit int.
+                                       $height = unpack( 'V', substr( $magic, 27, 3 ) . "\x00" );
+                                       $height = (int) ( $height[1] & 0xFFFFFF ) + 1;
+                                       $type   = 'animated-alpha';
+                                       break;
+                       }
+               }
+       } catch ( Exception $e ) {
+       }
+       return compact( 'width', 'height', 'type' );
+}
+
+/**
+ * Determines if a passed image is a lossy WebP image.
+ *
+ * @since 5.8.0
+ *
+ * @param string $filename The file path.
+ * @return bool Whether the file is a lossy WebP file.
+ */
+function _wp_webp_is_lossy( $filename ) {
+       $webp_info = wp_get_webp_info( $filename );
+       $type      = $webp_info['type'];
+       return $type && 'lossy' === $type;
+}
+
+/**
+ * Gets the image size, with support for WebP images.
+ *
+ * @since 5.8.0
+ * @access private
+ *
+ * @param string $filename  The file path.
+ * @param array  $imageinfo Extended image information, passed by reference.
+ * @return array|false Array of image information or false on failure.
+ */
+function _wp_get_image_size( $filename, &$imageinfo = array() ) {
+       // Try getimagesize() first.
+       $info = getimagesize( $filename, $imageinfo );
+       if ( false !== $info ) {
+               return $info;
+       }
+       // For PHP versions that don't support WebP images, extract the image
+       // size info from the file headers.
+       if ( 'image/webp' === wp_get_image_mime( $filename ) ) {
+               $webp_info = wp_get_webp_info( $filename );
+               $width     = $webp_info['width'];
+               $height    = $webp_info['height'];
+
+                       // Mimic the native return format.
+               if ( $width && $height ) {
+                       return array(
+                               $width,
+                               $height,
+                               IMAGETYPE_WEBP, // phpcs:ignore PHPCompatibility.Constants.NewConstants.imagetype_webpFound
+                               sprintf(
+                                       'width="%d" height="%d"',
+                                       $width,
+                                       $height
+                               ),
+                               'mime' => 'image/webp',
+                       );
+               }
+       }
+
+       // The image could not be parsed.
+       return false;
+}
</ins></span></pre></div>
<a id="trunksrcwpincludespostphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/post.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/post.php    2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-includes/post.php      2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -6539,7 +6539,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        switch ( $type ) {
</span><span class="cx" style="display: block; padding: 0 10px">                case 'image':
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp' );
</ins><span class="cx" style="display: block; padding: 0 10px">                         return in_array( $ext, $image_exts, true );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                case 'audio':
</span></span></pre></div>
<a id="trunksrcwpincludesrestapiendpointsclasswprestattachmentscontrollerphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php 2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php   2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -438,7 +438,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $supported_types = array( 'image/jpeg', 'image/png', 'image/gif' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $supported_types = array( 'image/jpeg', 'image/png', 'image/gif', 'image/webp' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 $mime_type       = get_post_mime_type( $attachment_id );
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ! in_array( $mime_type, $supported_types, true ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        return new WP_Error(
</span></span></pre></div>
<a id="trunktestsphpunitdataimagestestimagewebp"></a>
<div class="binary"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: trunk/tests/phpunit/data/images/test-image.webp</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx" style="display: block; padding: 0 10px">Index: trunk/tests/phpunit/data/images/test-image.webp
</span><span class="cx" style="display: block; padding: 0 10px">===================================================================
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">--- trunk/tests/phpunit/data/images/test-image.webp      2021-05-04 13:46:06 UTC (rev 50809)
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+++ trunk/tests/phpunit/data/images/test-image.webp       2021-05-04 14:43:36 UTC (rev 50810)
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: trunk/tests/phpunit/data/images/test-image.webp
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span><a id="svnmimetype"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:mime-type</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+application/octet-stream
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="trunktestsphpunitdataimageswebpanimatedwebp"></a>
<div class="binary"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: trunk/tests/phpunit/data/images/webp-animated.webp</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx" style="display: block; padding: 0 10px">Index: trunk/tests/phpunit/data/images/webp-animated.webp
</span><span class="cx" style="display: block; padding: 0 10px">===================================================================
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">--- trunk/tests/phpunit/data/images/webp-animated.webp   2021-05-04 13:46:06 UTC (rev 50809)
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+++ trunk/tests/phpunit/data/images/webp-animated.webp    2021-05-04 14:43:36 UTC (rev 50810)
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: trunk/tests/phpunit/data/images/webp-animated.webp
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span><a id="svnmimetype"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:mime-type</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+application/octet-stream
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="trunktestsphpunitdataimageswebplosslesswebp"></a>
<div class="binary"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: trunk/tests/phpunit/data/images/webp-lossless.webp</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx" style="display: block; padding: 0 10px">Index: trunk/tests/phpunit/data/images/webp-lossless.webp
</span><span class="cx" style="display: block; padding: 0 10px">===================================================================
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">--- trunk/tests/phpunit/data/images/webp-lossless.webp   2021-05-04 13:46:06 UTC (rev 50809)
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+++ trunk/tests/phpunit/data/images/webp-lossless.webp    2021-05-04 14:43:36 UTC (rev 50810)
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: trunk/tests/phpunit/data/images/webp-lossless.webp
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span><a id="svnmimetype"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:mime-type</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+application/octet-stream
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="trunktestsphpunitdataimageswebplossywebp"></a>
<div class="binary"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: trunk/tests/phpunit/data/images/webp-lossy.webp</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx" style="display: block; padding: 0 10px">Index: trunk/tests/phpunit/data/images/webp-lossy.webp
</span><span class="cx" style="display: block; padding: 0 10px">===================================================================
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">--- trunk/tests/phpunit/data/images/webp-lossy.webp      2021-05-04 13:46:06 UTC (rev 50809)
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+++ trunk/tests/phpunit/data/images/webp-lossy.webp       2021-05-04 14:43:36 UTC (rev 50810)
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: trunk/tests/phpunit/data/images/webp-lossy.webp
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span><a id="svnmimetype"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:mime-type</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+application/octet-stream
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="trunktestsphpunitdataimageswebptransparentwebp"></a>
<div class="binary"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: trunk/tests/phpunit/data/images/webp-transparent.webp</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx" style="display: block; padding: 0 10px">Index: trunk/tests/phpunit/data/images/webp-transparent.webp
</span><span class="cx" style="display: block; padding: 0 10px">===================================================================
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">--- trunk/tests/phpunit/data/images/webp-transparent.webp        2021-05-04 13:46:06 UTC (rev 50809)
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+++ trunk/tests/phpunit/data/images/webp-transparent.webp 2021-05-04 14:43:36 UTC (rev 50810)
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: trunk/tests/phpunit/data/images/webp-transparent.webp
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span><a id="svnmimetype"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:mime-type</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+application/octet-stream
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="trunktestsphpunittestsfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/functions.php   2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/tests/phpunit/tests/functions.php     2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1226,6 +1226,29 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * @ticket 35725
+        * @dataProvider data_wp_getimagesize
+        */
+       public function test_wp_getimagesize( $file, $expected ) {
+               if ( ! is_callable( 'exif_imagetype' ) && ! function_exists( 'getimagesize' ) ) {
+                       $this->markTestSkipped( 'The exif PHP extension is not loaded.' );
+               }
+
+               $result = wp_getimagesize( $file );
+
+               // The getimagesize() function varies in its response, so
+               // let's restrict comparison to expected keys only.
+               if ( is_array( $expected ) ) {
+                       foreach ( $expected as $k => $v ) {
+                               $this->assertEquals( true, isset( $result[ $k ] ) );
+                               $this->assertEquals( $expected[ $k ], $result[ $k ] );
+                       }
+               } else {
+                       $this->assertEquals( $expected, $result );
+               }
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * @ticket 39550
</span><span class="cx" style="display: block; padding: 0 10px">         * @dataProvider _wp_check_filetype_and_ext_data
</span><span class="cx" style="display: block; padding: 0 10px">         * @requires extension fileinfo
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1313,6 +1336,26 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                DIR_TESTDATA . '/images/test-image-mime-jpg.png',
</span><span class="cx" style="display: block; padding: 0 10px">                                'image/jpeg',
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        // Animated WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-animated.webp',
+                               'image/webp',
+                       ),
+                       // Lossless WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-lossless.webp',
+                               'image/webp',
+                       ),
+                       // Lossy WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-lossy.webp',
+                               'image/webp',
+                       ),
+                       // Transparent WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-transparent.webp',
+                               'image/webp',
+                       ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         // Not an image.
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                DIR_TESTDATA . '/uploads/dashicons.woff',
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1323,6 +1366,109 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $data;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Data profider for test_wp_getimagesize();
+        */
+       public function data_wp_getimagesize() {
+               $data = array(
+                       // Standard JPEG.
+                       array(
+                               DIR_TESTDATA . '/images/test-image.jpg',
+                               array(
+                                       50,
+                                       50,
+                                       IMAGETYPE_JPEG,
+                                       'width="50" height="50"',
+                                       'mime' => 'image/jpeg',
+                               ),
+                       ),
+                       // Standard GIF.
+                       array(
+                               DIR_TESTDATA . '/images/test-image.gif',
+                               array(
+                                       50,
+                                       50,
+                                       IMAGETYPE_GIF,
+                                       'width="50" height="50"',
+                                       'mime' => 'image/gif',
+                               ),
+                       ),
+                       // Standard PNG.
+                       array(
+                               DIR_TESTDATA . '/images/test-image.png',
+                               array(
+                                       50,
+                                       50,
+                                       IMAGETYPE_PNG,
+                                       'width="50" height="50"',
+                                       'mime' => 'image/png',
+                               ),
+                       ),
+                       // Image with wrong extension.
+                       array(
+                               DIR_TESTDATA . '/images/test-image-mime-jpg.png',
+                               array(
+                                       50,
+                                       50,
+                                       IMAGETYPE_JPEG,
+                                       'width="50" height="50"',
+                                       'mime' => 'image/jpeg',
+                               ),
+                       ),
+                       // Animated WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-animated.webp',
+                               array(
+                                       100,
+                                       100,
+                                       IMAGETYPE_WEBP,
+                                       'width="100" height="100"',
+                                       'mime' => 'image/webp',
+                               ),
+                       ),
+                       // Lossless WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-lossless.webp',
+                               array(
+                                       1200,
+                                       675,
+                                       IMAGETYPE_WEBP,
+                                       'width="1200" height="675"',
+                                       'mime' => 'image/webp',
+                               ),
+                       ),
+                       // Lossy WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-lossy.webp',
+                               array(
+                                       1200,
+                                       675,
+                                       IMAGETYPE_WEBP,
+                                       'width="1200" height="675"',
+                                       'mime' => 'image/webp',
+                               ),
+                       ),
+                       // Transparent WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-transparent.webp',
+                               array(
+                                       1200,
+                                       675,
+                                       IMAGETYPE_WEBP,
+                                       'width="1200" height="675"',
+                                       'mime' => 'image/webp',
+                               ),
+                       ),
+                       // Not an image.
+                       array(
+                               DIR_TESTDATA . '/uploads/dashicons.woff',
+                               false,
+                       ),
+               );
+
+               return $data;
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         public function _wp_check_filetype_and_ext_data() {
</span><span class="cx" style="display: block; padding: 0 10px">                $data = array(
</span><span class="cx" style="display: block; padding: 0 10px">                        // Standard image.
</span></span></pre></div>
<a id="trunktestsphpunittestsimageeditorphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/image/editor.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/image/editor.php        2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/tests/phpunit/tests/image/editor.php  2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -195,4 +195,84 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( '100x50', $editor->get_suffix() );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * Test wp_get_webp_info.
+        *
+        * @ticket 35725
+        * @dataProvider _test_wp_get_webp_info
+        *
+        */
+       public function test_wp_get_webp_info( $file, $expected ) {
+               $editor = wp_get_image_editor( $file );
+               if ( is_wp_error( $editor ) || ! $editor->supports_mime_type( 'image/webp' ) ) {
+                       $this->markTestSkipped( sprintf( 'Skipping test: no WebP support in the editor engine %s on this system.', $this->editor_engine ) );
+               } else {
+                       $file_data = wp_get_webp_info( $file );
+                       $this->assertSame( $file_data, $expected );
+               }
+       }
+
+       /**
+        * Data provider for test_wp_get_webp_info();
+        */
+       public function _test_wp_get_webp_info() {
+               return array(
+                       // Standard JPEG.
+                       array(
+                               DIR_TESTDATA . '/images/test-image.jpg',
+                               array(
+                                       'width'  => false,
+                                       'height' => false,
+                                       'type'   => false,
+                               ),
+                       ),
+                       // Standard GIF.
+                       array(
+                               DIR_TESTDATA . '/images/test-image.gif',
+                               array(
+                                       'width'  => false,
+                                       'height' => false,
+                                       'type'   => false,
+                               ),
+                       ),
+                       // Animated WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-animated.webp',
+                               array(
+                                       'width'  => 100,
+                                       'height' => 100,
+                                       'type'   => 'animated-alpha',
+                               ),
+                       ),
+                       // Lossless WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-lossless.webp',
+                               array(
+                                       'width'  => 1200,
+                                       'height' => 675,
+                                       'type'   => 'lossless',
+                               ),
+                       ),
+                       // Lossy WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-lossy.webp',
+                               array(
+                                       'width'  => 1200,
+                                       'height' => 675,
+                                       'type'   => 'lossy',
+                               ),
+                       ),
+                       // Transparent WebP.
+                       array(
+                               DIR_TESTDATA . '/images/webp-transparent.webp',
+                               array(
+                                       'width'  => 1200,
+                                       'height' => 675,
+                                       'type'   => 'animated-alpha',
+                               ),
+                       ),
+               );
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="trunktestsphpunittestsimagefunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/image/functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/image/functions.php     2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/tests/phpunit/tests/image/functions.php       2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -59,6 +59,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'test-image.psd',
</span><span class="cx" style="display: block; padding: 0 10px">                        'test-image-zip.tiff',
</span><span class="cx" style="display: block; padding: 0 10px">                        'test-image.jpg',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        'webp-animated.webp',
+                       'webp-lossless.webp',
+                       'webp-lossy.webp',
+                       'webp-transparent.webp',
</ins><span class="cx" style="display: block; padding: 0 10px">                 );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // IMAGETYPE_ICO is only defined in PHP 5.3+.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -92,6 +96,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'test-image.jpg',
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                // Add WebP images if the image editor supports them.
+               $file   = DIR_TESTDATA . '/images/test-image.webp';
+               $editor = wp_get_image_editor( $file );
+               if ( ( ! is_wp_error( $editor ) ) && $editor->supports_mime_type( 'image/webp' ) ) {
+                       $files = array_merge(
+                               $files,
+                               array(
+                                       'webp-animated.webp',
+                                       'webp-lossless.webp',
+                                       'webp-lossy.webp',
+                                       'webp-transparent.webp',
+                               )
+                       );
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 // IMAGETYPE_ICO is only defined in PHP 5.3+.
</span><span class="cx" style="display: block; padding: 0 10px">                if ( defined( 'IMAGETYPE_ICO' ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $files[] = 'test-image.ico';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -174,6 +193,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'image/png',
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                // Include WebP in tests when platform supports it.
+               if ( function_exists( 'imagewebp' ) ) {
+                       array_push( $mime_types, 'image/webp' );
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 // Test each image editor engine.
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $classes as $class ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $img    = new $class( DIR_TESTDATA . '/images/canola.jpg' );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -270,7 +294,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'jpe'  => 'image/jpeg',
</span><span class="cx" style="display: block; padding: 0 10px">                        'gif'  => 'image/gif',
</span><span class="cx" style="display: block; padding: 0 10px">                        'png'  => 'image/png',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'unk'  => 'image/jpeg', // Default, unknown.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'webp' => 'image/webp',
+                       'unk'  => 'image/jpeg',   // Default, unknown.
</ins><span class="cx" style="display: block; padding: 0 10px">                 );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Test each image editor engine.
</span></span></pre></div>
<a id="trunktestsphpunittestsimageresizephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/image/resize.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/image/resize.php        2021-05-04 13:46:06 UTC (rev 50809)
+++ trunk/tests/phpunit/tests/image/resize.php  2021-05-04 14:43:36 UTC (rev 50810)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -64,6 +64,24 @@
</span><span class="cx" style="display: block; padding: 0 10px">                unlink( $image );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        function test_resize_webp() {
+               $file   = DIR_TESTDATA . '/images/test-image.webp';
+               $editor = wp_get_image_editor( $file );
+
+               // Check if the editor supports the webp mime type.
+               if ( is_wp_error( $editor ) || ! $editor->supports_mime_type( 'image/webp' ) ) {
+                       $this->markTestSkipped( sprintf( 'Skipping test: no WebP support in the editor engine %s on this system.', $this->editor_engine ) );
+               } else {
+                       $image = $this->resize_helper( $file, 25, 25 );
+                       $this->assertSame( 'test-image-25x25.webp', wp_basename( $image ) );
+                       list($w, $h, $type) = wp_getimagesize( $image );
+                       $this->assertSame( 25, $w );
+                       $this->assertSame( 25, $h );
+                       $this->assertSame( IMAGETYPE_WEBP, $type );
+                       unlink( $image );
+               }
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         function test_resize_larger() {
</span><span class="cx" style="display: block; padding: 0 10px">                // image_resize() should refuse to make an image larger.
</span><span class="cx" style="display: block; padding: 0 10px">                $image = $this->resize_helper( DIR_TESTDATA . '/images/test-image.jpg', 100, 100 );
</span></span></pre>
</div>
</div>

</body>
</html>