Make WordPress Core

Ticket #39875: 39875.4.patch

File 39875.4.patch, 5.2 KB (added by joemcgill, 7 years ago)
  • src/wp-admin/includes/image.php

    diff --git src/wp-admin/includes/image.php src/wp-admin/includes/image.php
    index 4ae53b9c3a9..40cab01940c 100644
    function wp_generate_attachment_metadata( $attachment_id, $file ) { 
    251251                        $editor = wp_get_image_editor( $file );
    252252
    253253                        if ( ! is_wp_error( $editor ) ) { // No support for this type of file
    254                                 $uploaded = $editor->save( $file, 'image/jpeg' );
     254                                /*
     255                                 * PDFs may have the same file filename as JPEGs.
     256                                 * Ensure the PDF preview image does not overwrite any JPEG images that already exist.
     257                                 */
     258                                $dirname = dirname( $file ) . '/';
     259                                $ext = '.' . pathinfo( $file, PATHINFO_EXTENSION );
     260                                $preview_file = $dirname . wp_unique_filename( $dirname, wp_basename( $file, $ext ) . '-pdf.jpg' );
     261
     262                                $uploaded = $editor->save( $preview_file, 'image/jpeg' );
    255263                                unset( $editor );
    256264
    257265                                // Resize based on the full size image, rather than the source.
  • tests/phpunit/tests/image/functions.php

    diff --git tests/phpunit/tests/image/functions.php tests/phpunit/tests/image/functions.php
    index f17cbb923f6..b64d43b8ac2 100644
    class Tests_Image_Functions extends WP_UnitTestCase { 
    1818                require_once( ABSPATH . WPINC . '/class-wp-image-editor-imagick.php' );
    1919
    2020                include_once( DIR_TESTDATA . '/../includes/mock-image-editor.php' );
     21
     22                // Ensure no legacy / failed tests detritus.
     23                $folder = '/tmp/wordpress-gsoc-flyer*.{jpg,pdf}';
     24
     25                foreach ( glob( $folder, GLOB_BRACE ) as $file ) {
     26                        unlink( $file );
     27                }
    2128        }
    2229
    2330        /**
    class Tests_Image_Functions extends WP_UnitTestCase { 
    373380                $expected = array(
    374381                        'sizes' => array(
    375382                                'thumbnail' => array(
    376                                         'file'      => "wordpress-gsoc-flyer-116x150.jpg",
     383                                        'file'      => "wordpress-gsoc-flyer-pdf-116x150.jpg",
    377384                                        'width'     => 116,
    378385                                        'height'    => 150,
    379386                                        'mime-type' => "image/jpeg",
    380387                                ),
    381388                                'medium'    => array(
    382                                         'file'      => "wordpress-gsoc-flyer-232x300.jpg",
     389                                        'file'      => "wordpress-gsoc-flyer-pdf-232x300.jpg",
    383390                                        'width'     => 232,
    384391                                        'height'    => 300,
    385392                                        'mime-type' => "image/jpeg",
    386393                                ),
    387394                                'large'     => array(
    388                                         'file'      => "wordpress-gsoc-flyer-791x1024.jpg",
     395                                        'file'      => "wordpress-gsoc-flyer-pdf-791x1024.jpg",
    389396                                        'width'     => 791,
    390397                                        'height'    => 1024,
    391398                                        'mime-type' => "image/jpeg",
    392399                                ),
    393400                                'full'      => array(
    394                                         'file'      => "wordpress-gsoc-flyer.jpg",
     401                                        'file'      => "wordpress-gsoc-flyer-pdf.jpg",
    395402                                        'width'     => 1088,
    396403                                        'height'    => 1408,
    397404                                        'mime-type' => "image/jpeg",
    class Tests_Image_Functions extends WP_UnitTestCase { 
    403410                $this->assertSame( $expected, $metadata );
    404411
    405412                unlink( $test_file );
     413                foreach ( $metadata['sizes'] as $size ) {
     414                        unlink ( '/tmp/' . $size['file'] );
     415                }
    406416        }
    407417
    408418        /**
    class Tests_Image_Functions extends WP_UnitTestCase { 
    427437                add_filter( 'fallback_intermediate_image_sizes', array( $this, 'filter_fallback_intermediate_image_sizes' ), 10, 2 );
    428438
    429439                $expected = array(
    430                         'file'      => 'wordpress-gsoc-flyer-77x100.jpg',
     440                        'file'      => 'wordpress-gsoc-flyer-pdf-77x100.jpg',
    431441                        'width'     => 77,
    432442                        'height'    => 100,
    433443                        'mime-type' => 'image/jpeg',
    class Tests_Image_Functions extends WP_UnitTestCase { 
    441451                remove_filter( 'fallback_intermediate_image_sizes', array( $this, 'filter_fallback_intermediate_image_sizes' ), 10 );
    442452
    443453                unlink( $test_file );
     454                foreach ( $metadata['sizes'] as $size ) {
     455                        unlink ( '/tmp/' . $size['file'] );
     456                }
    444457        }
    445458
    446459        function filter_fallback_intermediate_image_sizes( $fallback_sizes, $metadata ) {
    class Tests_Image_Functions extends WP_UnitTestCase { 
    449462
    450463                return $fallback_sizes;
    451464        }
     465
     466        /**
     467         * Test PDF preview doesn't overwrite existing JPEG.
     468         * @ticket 39875
     469         */
     470        public function test_pdf_preview_doesnt_overwrite_existing_jpeg() {
     471                // Dummy JPEGs.
     472                $jpg1_path = '/tmp/test.jpg'; // Straight.
     473                file_put_contents( $jpg1_path, 'asdf' );
     474                $jpg2_path = '/tmp/test-pdf.jpg'; // With PDF marker.
     475                file_put_contents( $jpg2_path, 'fdsa' );
     476
     477                // PDF with same name as JPEG.
     478                $pdf_path = '/tmp/test.pdf';
     479                copy( DIR_TESTDATA . '/images/wordpress-gsoc-flyer.pdf', $pdf_path );
     480
     481                $attachment_id = $this->factory->attachment->create_object( $pdf_path, 0, array(
     482                        'post_mime_type' => 'application/pdf',
     483                ) );
     484
     485                $metadata = wp_generate_attachment_metadata( $attachment_id, $pdf_path );
     486                $preview_path = '/tmp/' . $metadata['sizes']['full']['file'];
     487
     488                // PDF preview didn't overwrite PDF.
     489                $this->assertNotEquals( $pdf_path, $preview_path );
     490                // PDF preview didn't overwrite JPG with same name.
     491                $this->assertNotEquals( $jpg1_path, $preview_path );
     492                $this->assertSame( 'asdf', file_get_contents( $jpg1_path ) );
     493                // PDF preview didn't overwrite PDF preview with same name.
     494                $this->assertNotEquals( $jpg2_path, $preview_path );
     495                $this->assertSame( 'fdsa', file_get_contents( $jpg2_path ) );
     496
     497                // Cleanup.
     498                unlink( $jpg1_path );
     499                unlink( $jpg2_path );
     500                unlink( $pdf_path );
     501                foreach ( $metadata['sizes'] as $size ) {
     502                        unlink( '/tmp/' . $size['file'] );
     503                }
     504        }
    452505}