Make WordPress Core


Ignore:
Timestamp:
10/07/2022 07:15:59 PM (4 years ago)
Author:
adamsilverstein
Message:

Media: ensure the wp_editor_set_quality filter consistently passes the correct output mime type.

Ensure that the mime type passed to the wp_editor_set_quality filter is correct when the output format is altered with the image_editor_output_format filter and the image is saved multiple times, for example when generating sub sizes. Previously, the original image mime type was passed instead of the output type after the initial save.

Props flixos90, peterwilsoncc.
Fixes #56442.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/media.php

    r54402 r54417  
    36223622                remove_filter( 'wp_omit_loading_attr_threshold', '__return_null', 100 );
    36233623        }
     3624
     3625        /**
     3626         * Test that generated files with the `image_editor_output_format` applied use the correct
     3627         * quality level based on their mime type.
     3628         *
     3629         * @ticket 56442
     3630         */
     3631        public function test_quality_with_image_conversion_file_sizes() {
     3632                add_filter( 'image_editor_output_format', array( $this, 'image_editor_output_jpeg' ) );
     3633                $temp_dir = get_temp_dir();
     3634                $file     = $temp_dir . '/33772.jpg';
     3635                copy( DIR_TESTDATA . '/images/33772.jpg', $file );
     3636
     3637                // Set JPEG output quality very low and WebP quality very high, this should force all generated WebP images to
     3638                // be larger than the the matching generated JPEGs.
     3639                add_filter( 'wp_editor_set_quality', array( $this, 'image_editor_change_quality_low_jpeg' ), 10, 2 );
     3640
     3641                $editor = wp_get_image_editor( $file );
     3642
     3643                // Verify that the selected editor supports WebP output.
     3644                if ( ! $editor->supports_mime_type( 'image/webp' ) ) {
     3645                        $this->markTestSkipped( 'WebP is not supported by the selected image editor.' );
     3646                }
     3647
     3648                $attachment_id = self::factory()->attachment->create_object(
     3649                        array(
     3650                                'post_mime_type' => 'image/jpeg',
     3651                                'file'           => $file,
     3652                        )
     3653                );
     3654
     3655                add_filter( 'big_image_size_threshold', array( $this, 'add_big_image_size_threshold' ) );
     3656
     3657                // Generate all sizes as JPEGs.
     3658                $jpeg_sizes = wp_generate_attachment_metadata( $attachment_id, $file );
     3659                remove_filter( 'image_editor_output_format', array( $this, 'image_editor_output_jpeg' ) );
     3660
     3661                // Generate all sizes as WebP.
     3662                add_filter( 'image_editor_output_format', array( $this, 'image_editor_output_webp' ) );
     3663                $webp_sizes = wp_generate_attachment_metadata( $attachment_id, $file );
     3664                remove_filter( 'image_editor_output_format', array( $this, 'image_editor_output_webp' ) );
     3665
     3666                // The main (scaled) image: the JPEG should be smaller than the WebP.
     3667                $this->assertLessThan( $webp_sizes['filesize'], $jpeg_sizes['filesize'], 'The JPEG should be smaller than the WebP.' );
     3668
     3669                // Sub-sizes: for each size, the JPEGs should be smaller than the WebP.
     3670                $sizes_to_compare = array_intersect_key( $jpeg_sizes['sizes'], $webp_sizes['sizes'] );
     3671                foreach ( $sizes_to_compare as $size => $size_data ) {
     3672                        $this->assertLessThan( $webp_sizes['sizes'][ $size ]['filesize'], $jpeg_sizes['sizes'][ $size ]['filesize'] );
     3673                }
     3674        }
     3675
     3676        /**
     3677         * Add threshold to create a `-scaled` output image for testing.
     3678         */
     3679        public function add_big_image_size_threshold() {
     3680                return 1000;
     3681        }
     3682
     3683        /**
     3684         * Output JPEG files.
     3685         */
     3686        public function image_editor_output_jpeg() {
     3687                return array( 'image/jpeg' => 'image/jpeg' );
     3688        }
     3689
     3690        /**
     3691         * Output WebP files.
     3692         */
     3693        public function image_editor_output_webp() {
     3694                return array( 'image/jpeg' => 'image/webp' );
     3695        }
     3696
     3697        /**
     3698         * Changes the quality using very low quality for JPEGs and very high quality
     3699         * for WebPs, used to verify the filter is applying correctly.
     3700         *
     3701         * @param int    $quality   Default quality.
     3702         * @param string $mime_type Image mime-type.
     3703         * @return int The changed quality.
     3704         */
     3705        public function image_editor_change_quality_low_jpeg( $quality, $mime_type ) {
     3706                if ( 'image/jpeg' === $mime_type ) {
     3707                        return 1;
     3708                } elseif ( 'image/webp' === $mime_type ) {
     3709                        return 100;
     3710                } else {
     3711                        return 30;
     3712                }
     3713        }
     3714
    36243715}
    36253716
Note: See TracChangeset for help on using the changeset viewer.