Make WordPress Core

Changeset 55859

Timestamp:
05/25/2023 03:15:45 PM (14 months ago)
Author:
antpb
Message:

Media: Prevent scaling up of images in the Image Editor.

Previously, when scaling an image larger than the source size in the image edit states the image would silently fail the scaling action. This patch provides an error when someone attempts to scale an image larger than the source size while also disabling the button to initiate the action.

Props brookedot, joedolson, markoheijnen, mikeschroder, desrosj, Mista-Flo, costdev.
Fixes #26381.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/js/_enqueues/lib/image-edit.js

    r55843 r55859  
    227227    scaleChanged : function( postid, x, el ) {
    228228        var w = $('#imgedit-scale-width-' + postid), h = $('#imgedit-scale-height-' + postid),
    229         warn = $('#imgedit-scale-warn-' + postid), w1 = '', h1 = '';
     229        warn = $('#imgedit-scale-warn-' + postid), w1 = '', h1 = '',
     230        scaleBtn = $('#imgedit-scale-button');
    230231
    231232        if ( false === this.validateNumeric( el ) ) {
     
    243244        if ( ( h1 && h1 > this.hold.oh ) || ( w1 && w1 > this.hold.ow ) ) {
    244245            warn.css('visibility', 'visible');
     246
    245247        } else {
    246248            warn.css('visibility', 'hidden');
     249
    247250        }
    248251    },
  • trunk/src/wp-admin/css/media.css

    r55091 r55859  
    11551155
    11561156span.imgedit-scale-warn {
    1157     color: #d63638;
    1158     font-size: 20px;
     1157    display: flex;
     1158    align-items: center;
     1159    margin: 4px;
     1160    gap: 4px;
     1161    color: #b32d2e;
    11591162    font-style: normal;
    11601163    visibility: hidden;
  • trunk/src/wp-admin/includes/image-edit.php

    r55276 r55859  
    144144            ?>
    145145        </label>
    146         <input type="text" id="imgedit-scale-width-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1, this)" value="<?php echo isset( $meta['width'] ) ? $meta['width'] : 0; ?>" />
     146        <input type=", this)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1, this)" value="<?php echo isset( $meta['width'] ) ? $meta['width'] : 0; ?>" />
    147147        <span class="imgedit-separator" aria-hidden="true">&times;</span>
    148148        <label for="imgedit-scale-height-<?php echo $post_id; ?>" class="screen-reader-text">
     
    152152            ?>
    153153        </label>
    154         <input type="text" id="imgedit-scale-height-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" value="<?php echo isset( $meta['height'] ) ? $meta['height'] : 0; ?>" />
    155         <span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php echo $post_id; ?>">!</span>
     154        <input type="number" aria-describedby="imgedit-scale-warn-<?php echo $post_id; ?>" min="1" max="<?php echo isset( $meta['height'] ) ? $meta['height'] : ''; ?>" step="1" id="imgedit-scale-height-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" onchange="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" value="<?php echo isset( $meta['height'] ) ? $meta['height'] : 0; ?>" />
    156155        <div class="imgedit-scale-button-wrapper"><input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php echo "$post_id, '$nonce'"; ?>, 'scale')" class="button button-primary" value="<?php esc_attr_e( 'Scale' ); ?>" /></div>
    157156        </div>
     157
     158
    158159        </fieldset>
    159160
     
    894895    $scale   = ! empty( $_REQUEST['do'] ) && 'scale' === $_REQUEST['do'];
    895896
    896     if ( $scale && $fwidth > 0 && $fheight > 0 ) {
     897    if ( $scale ) {
    897898        $size = $img->get_size();
    898899        $sX   = $size['width'];
    899900        $sY   = $size['height'];
    900901
    901         // Check if it has roughly the same w / h ratio.
    902         $diff = round( $sX / $sY, 2 ) - round( $fwidth / $fheight, 2 );
    903         if ( -0.1 < $diff && $diff < 0.1 ) {
    904             // Scale the full size image.
    905             if ( $img->resize( $fwidth, $fheight ) ) {
    906                 $scaled = true;
    907             }
    908         }
    909 
    910         if ( ! $scaled ) {
    911             $return->error = esc_js( __( 'Error while saving the scaled image. Please reload the page and try again.' ) );
     902        if ( $sX < $fwidth || $sY < $fheight ) {
     903            $return->error = esc_js( __( 'Images cannot be scaled to a size larger than the original.' ) );
    912904            return $return;
     905
     906
     907
     908
     909
     910
     911
     912
     913
     914
     915
     916
     917
     918
     919
     920
    913921        }
    914922    } elseif ( ! empty( $_REQUEST['history'] ) ) {
  • trunk/tests/phpunit/tests/ajax/wpAjaxImageEditor.php

    r54722 r55859  
    6363
    6464    /**
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
    6592     * @ticket 32171
    6693     * @requires function imagejpeg
Note: See TracChangeset for help on using the changeset viewer.