From 39ac4fa5a4b1cb63ae50b4009cd80b41201c445b Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Wed, 4 Feb 2015 13:01:52 -0800 Subject: [PATCH] Move wfThumbIsStandard() to GlobalFunctions and add tests Change-Id: Ife9c011a476a4022cd72d433497944cbd7258e67 --- includes/GlobalFunctions.php | 61 +++++++++++++ .../GlobalFunctions/wfThumbIsStandardTest.php | 87 +++++++++++++++++++ thumb.php | 60 ------------- 3 files changed, 148 insertions(+), 60 deletions(-) create mode 100644 tests/phpunit/includes/GlobalFunctions/wfThumbIsStandardTest.php diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 2025e170e9..04958644d6 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -4198,3 +4198,64 @@ function wfIsConfiguredProxy( $ip ) { wfDeprecated( __METHOD__, '1.24' ); return IP::isConfiguredProxy( $ip ); } + +/** + * Returns true if these thumbnail parameters match one that MediaWiki + * requests from file description pages and/or parser output. + * + * $params is considered non-standard if they involve a non-standard + * width or any non-default parameters aside from width and page number. + * The number of possible files with standard parameters is far less than + * that of all combinations; rate-limiting for them can thus be more generious. + * + * @param File $file + * @param array $params + * @return bool + * @since 1.24 Moved from thumb.php to GlobalFunctions in 1.25 + */ +function wfThumbIsStandard( File $file, array $params ) { + global $wgThumbLimits, $wgImageLimits; + + $handler = $file->getHandler(); + if ( !$handler || !isset( $params['width'] ) ) { + return false; + } + + $basicParams = array(); + if ( isset( $params['page'] ) ) { + $basicParams['page'] = $params['page']; + } + + // Check if the width matches one of $wgThumbLimits + if ( in_array( $params['width'], $wgThumbLimits ) ) { + $normalParams = $basicParams + array( 'width' => $params['width'] ); + // Append any default values to the map (e.g. "lossy", "lossless", ...) + $handler->normaliseParams( $file, $normalParams ); + } else { + // If not, then check if the width matchs one of $wgImageLimits + $match = false; + foreach ( $wgImageLimits as $pair ) { + $normalParams = $basicParams + array( 'width' => $pair[0], 'height' => $pair[1] ); + // Decide whether the thumbnail should be scaled on width or height. + // Also append any default values to the map (e.g. "lossy", "lossless", ...) + $handler->normaliseParams( $file, $normalParams ); + // Check if this standard thumbnail size maps to the given width + if ( $normalParams['width'] == $params['width'] ) { + $match = true; + break; + } + } + if ( !$match ) { + return false; // not standard for description pages + } + } + + // Check that the given values for non-page, non-width, params are just defaults + foreach ( $params as $key => $value ) { + if ( !isset( $normalParams[$key] ) || $normalParams[$key] != $value ) { + return false; + } + } + + return true; +} diff --git a/tests/phpunit/includes/GlobalFunctions/wfThumbIsStandardTest.php b/tests/phpunit/includes/GlobalFunctions/wfThumbIsStandardTest.php new file mode 100644 index 0000000000..dc1dea1b57 --- /dev/null +++ b/tests/phpunit/includes/GlobalFunctions/wfThumbIsStandardTest.php @@ -0,0 +1,87 @@ +setMwGlobals( array( + 'wgThumbLimits' => array( + 100, + 400 + ), + 'wgImageLimits' => array( + array( 300, 225 ), + array( 800, 600 ), + ), + 'wgMediaHandlers' => array( + 'unknown/unknown' => 'MockBitmapHandler', + ), + ) ); + } + + public static function provideThumbParams() { + return array( + // Thumb limits + array( + 'Standard thumb width', + true, + array( 'width' => 100 ), + ), + array( + 'Standard thumb width', + true, + array( 'width' => 400 ), + ), + array( + 'Non-standard thumb width', + false, + array( 'width' => 300 ), + ), + // Image limits + // Note: Image limits are measured as pairs. Individual values + // may be non-standard based on the aspect ratio. + array( + 'Standard image width/height pair', + true, + array( 'width' => 250, 'height' => 225 ), + ), + array( + 'Standard image width/height pair', + true, + array( 'width' => 667, 'height' => 600 ), + ), + array( + 'Standard image width where image does not fit aspect ratio', + false, + array( 'width' => 300 ), + ), + array( + 'Implicit width from image width/height pair aspect ratio fit', + true, + // 2000x1800 fit inside 300x225 makes w=250 + array( 'width' => 250 ), + ), + array( + 'Height-only is always non-standard', + false, + array( 'height' => 225 ), + ), + ); + } + + /** + * @dataProvider provideThumbParams + */ + public function testIsStandard( $message, $expected, $params ) { + $this->assertSame( + $expected, + wfThumbIsStandard( new FakeDimensionFile( array( 2000, 1800 ) ), $params ), + $message + ); + } +} diff --git a/thumb.php b/thumb.php index 7352dc4c5b..5ab181dc0a 100644 --- a/thumb.php +++ b/thumb.php @@ -424,66 +424,6 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath return array( $thumb, $errorHtml ); } -/** - * Returns true if this thumbnail is one that MediaWiki generates - * links to on file description pages and possibly parser output. - * - * $params is considered non-standard if they involve a non-standard - * width or any non-default parameters aside from width and page number. - * The number of possible files with standard parameters is far less than - * that of all combinations; rate-limiting for them can thus be more generious. - * - * @param File $file - * @param array $params - * @return bool - */ -function wfThumbIsStandard( File $file, array $params ) { - global $wgThumbLimits, $wgImageLimits; - - $handler = $file->getHandler(); - if ( !$handler || !isset( $params['width'] ) ) { - return false; - } - - $basicParams = array(); - if ( isset( $params['page'] ) ) { - $basicParams['page'] = $params['page']; - } - - // Check if the width matches one of $wgThumbLimits - if ( in_array( $params['width'], $wgThumbLimits ) ) { - $normalParams = $basicParams + array( 'width' => $params['width'] ); - // Append any default values to the map (e.g. "lossy", "lossless", ...) - $handler->normaliseParams( $file, $normalParams ); - } else { - // If not, then check if the width matchs one of $wgImageLimits - $match = false; - foreach ( $wgImageLimits as $pair ) { - $normalParams = $basicParams + array( 'width' => $pair[0], 'height' => $pair[1] ); - // Decide whether the thumbnail should be scaled on width or height. - // Also append any default values to the map (e.g. "lossy", "lossless", ...) - $handler->normaliseParams( $file, $normalParams ); - // Check if this standard thumbnail size maps to the given width - if ( $normalParams['width'] == $params['width'] ) { - $match = true; - break; - } - } - if ( !$match ) { - return false; // not standard for description pages - } - } - - // Check that the given values for non-page, non-width, params are just defaults - foreach ( $params as $key => $value ) { - if ( !isset( $normalParams[$key] ) || $normalParams[$key] != $value ) { - return false; - } - } - - return true; -} - /** * Convert pathinfo type parameter, into normal request parameters * -- 2.20.1