From 3a4bfb597e850eca5e07e1a22ddcca8ba8810594 Mon Sep 17 00:00:00 2001 From: Brian Wolff Date: Tue, 10 Jun 2014 21:15:53 -0300 Subject: [PATCH] Fix misnamed SVGHandler::canAnimateThumb() Caused the animation warning to not be present on image description pages Also add unit tests. Since I'm adding an animated svg file for this unit test, also add a metadata extraction test for animated svgs, since we're missing one. Change-Id: Id03e1a0e1c151d3c575a695a42c54b709187d10a follow-up: 876128f8c9f0ce6a8424336f --- includes/media/SVG.php | 2 +- tests/phpunit/data/media/Bishzilla_blink.gif | Bin 0 -> 39057 bytes tests/phpunit/data/media/README | 9 +++ .../data/media/Soccer_ball_animated.svg | 55 ++++++++++++++++++ .../includes/filerepo/files/FileTest.php | 34 +++++++++++ .../includes/media/MediaWikiMediaTestCase.php | 10 +++- .../media/SVGMetadataExtractorTest.php | 11 ++++ 7 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 tests/phpunit/data/media/Bishzilla_blink.gif create mode 100644 tests/phpunit/data/media/Soccer_ball_animated.svg create mode 100644 tests/phpunit/includes/filerepo/files/FileTest.php diff --git a/includes/media/SVG.php b/includes/media/SVG.php index 5a1074138a..e28b38fab8 100644 --- a/includes/media/SVG.php +++ b/includes/media/SVG.php @@ -116,7 +116,7 @@ class SvgHandler extends ImageHandler { /** * We do not support making animated svg thumbnails */ - function canAnimateThumb( $file ) { + function canAnimateThumbnail( $file ) { return false; } diff --git a/tests/phpunit/data/media/Bishzilla_blink.gif b/tests/phpunit/data/media/Bishzilla_blink.gif new file mode 100644 index 0000000000000000000000000000000000000000..13e5536249bdb201cb2278178ba0a7100af11510 GIT binary patch literal 39057 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 Y71%!&*gqB6KNZ+N71;j|E3k9_2R~|P)Bpeg literal 0 HcmV?d00001 diff --git a/tests/phpunit/data/media/README b/tests/phpunit/data/media/README index 57879f8644..ca132a441d 100644 --- a/tests/phpunit/data/media/README +++ b/tests/phpunit/data/media/README @@ -46,3 +46,12 @@ https://commons.wikimedia.org/wiki/File:Speech_bubbles.svg CC BY-SA 3.0 Jarry1250 +Soccer_ball_animated.svg +https://commons.wikimedia.org/wiki/File:Soccer_ball_animated.svg +GFDL 1.2 or later, CC-BY-SA 3.0 unported, CC-BY-SA 2.5 generic, CC-BY-SA 2.0 generic, or CC-BY-SA 1.0 generic +Pumbaa80 + +Bishzilla_blink.gif +https://commons.wikimedia.org/wiki/File:Bishzilla_blink.gif +Public domain +Bishonen diff --git a/tests/phpunit/data/media/Soccer_ball_animated.svg b/tests/phpunit/data/media/Soccer_ball_animated.svg new file mode 100644 index 0000000000..6bd82fc44c --- /dev/null +++ b/tests/phpunit/data/media/Soccer_ball_animated.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/phpunit/includes/filerepo/files/FileTest.php b/tests/phpunit/includes/filerepo/files/FileTest.php new file mode 100644 index 0000000000..36b95ea016 --- /dev/null +++ b/tests/phpunit/includes/filerepo/files/FileTest.php @@ -0,0 +1,34 @@ +setMWGlobals( 'wgMaxAnimatedGifArea', 9000 ); + parent::setUp(); + } + + /** + * @param $filename String + * @param $expected boolean + * @dataProvider providerCanAnimate + */ + function testCanAnimateThumbIfAppropriate( $filename, $expected ) { + $file = $this->dataFile( $filename ); + $this->assertEquals( $file->canAnimateThumbIfAppropriate(), $expected ); + } + + function providerCanAnimate() { + return array( + array( 'nonanimated.gif', true ), + array( 'jpeg-comment-utf.jpg', true ), + array( 'test.tiff', true ), + array( 'Animated_PNG_example_bouncing_beach_ball.png', false ), + array( 'greyscale-png.png', true ), + array( 'Toll_Texas_1.svg', true ), + array( 'LoremIpsum.djvu', true ), + array( '80x60-2layers.xcf', true ), + array( 'Soccer_ball_animated.svg', false ), + array( 'Bishzilla_blink.gif', false ), + array( 'animated.gif', true ), + ); + } +} diff --git a/tests/phpunit/includes/media/MediaWikiMediaTestCase.php b/tests/phpunit/includes/media/MediaWikiMediaTestCase.php index ebfcba9ec5..96347d9400 100644 --- a/tests/phpunit/includes/media/MediaWikiMediaTestCase.php +++ b/tests/phpunit/includes/media/MediaWikiMediaTestCase.php @@ -63,10 +63,16 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase { * * File must be in the path returned by getFilePath() * @param $name String File name - * @param $type String MIME type + * @param $type String MIME type [optional] * @return UnregisteredLocalFile */ - protected function dataFile( $name, $type ) { + protected function dataFile( $name, $type = null ) { + if ( !$type ) { + // Autodetect by file extension for the lazy. + $magic = MimeMagic::singleton(); + $parts = explode( $name, '.' ); + $type = $magic->guessTypesForExtension( $parts[count( $parts ) - 1] ); + } return new UnregisteredLocalFile( false, $this->repo, "mwstore://localtesting/data/$name", $type ); } diff --git a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php b/tests/phpunit/includes/media/SVGMetadataExtractorTest.php index fa63fa64f2..f06bd6f072 100644 --- a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php +++ b/tests/phpunit/includes/media/SVGMetadataExtractorTest.php @@ -116,6 +116,17 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase { ), ) ), + array( + "$base/Soccer_ball_animated.svg", + array( + 'width' => 150, + 'height' => 150, + 'originalWidth' => '150', + 'originalHeight' => '150', + 'animated' => true, + 'translations' => array() + ), + ), ); } -- 2.20.1