And allow extensions to add their own media handlers.
I'm not too happy with the introduction of another global,
but didn't like the alternatives either:
* Add some hook to MockMediaHandlerFactory that would allow
extensions to add their own stuff in.
* Use another hook (like ParserTestTables or ParserTestGlobals)
and then override the service with a new instance - seemed
too hacky
The good thing about this is that it lets us kill off a class.
I'm other to other suggestions in case I missed something.
Bug: T169258
Depends-On: I5875621c58597426ad5242bf3d07714555c439b5
Change-Id: I1c2e903fb235395a8de8e0f7bf65ce07739d2930
'watchlistunwatchlinks' preference option is enabled). With JavaScript
enabled, these links toggle so the user can also re-watch pages that have
just been unwatched.
+* Added $wgParserTestMediaHandlers, where mock media handlers can be passed to
+ MediaHandlerFactory for parser tests.
=== Languages updated in 1.30 ===
*/
$wgMediaHandlers = [];
+/**
+ * Media handler overrides for parser tests (they don't need to generate actual
+ * thumbnails, so a mock will do)
+ */
+$wgParserTestMediaHandlers = [
+ 'image/jpeg' => 'MockBitmapHandler',
+ 'image/png' => 'MockBitmapHandler',
+ 'image/gif' => 'MockBitmapHandler',
+ 'image/tiff' => 'MockBitmapHandler',
+ 'image/webp' => 'MockBitmapHandler',
+ 'image/x-ms-bmp' => 'MockBitmapHandler',
+ 'image/x-bmp' => 'MockBitmapHandler',
+ 'image/x-xcf' => 'MockBitmapHandler',
+ 'image/svg+xml' => 'MockSvgHandler',
+ 'image/vnd.djvu' => 'MockDjVuHandler',
+];
+
/**
* Plugins for page content model handling.
* Each entry in the array maps a model id to a class name or callback
'MockImageHandler' => "$testDir/phpunit/mocks/media/MockImageHandler.php",
'MockSvgHandler' => "$testDir/phpunit/mocks/media/MockSvgHandler.php",
'MockDjVuHandler' => "$testDir/phpunit/mocks/media/MockDjVuHandler.php",
- 'MockOggHandler' => "$testDir/phpunit/mocks/media/MockOggHandler.php",
- 'MockMediaHandlerFactory' => "$testDir/phpunit/mocks/media/MockMediaHandlerFactory.php",
'MockChangesListFilter' => "$testDir/phpunit/mocks/MockChangesListFilter.php",
'MockChangesListFilterGroup' => "$testDir/phpunit/mocks/MockChangesListFilterGroup.php",
'MockWebRequest' => "$testDir/phpunit/mocks/MockWebRequest.php",
MediaWikiServices::getInstance()->disableService( 'MediaHandlerFactory' );
MediaWikiServices::getInstance()->redefineService(
'MediaHandlerFactory',
- function () {
- return new MockMediaHandlerFactory();
+ function ( MediaWikiServices $services ) {
+ $handlers = $services->getMainConfig()->get( 'ParserTestMediaHandlers' );
+ return new MediaHandlerFactory( $handlers );
}
);
$teardown[] = function () {
<?php
+use MediaWiki\MediaWikiServices;
+
/**
* @group GlobalFunctions
* @covers ::wfThumbIsStandard
* @dataProvider provideThumbParams
*/
public function testIsStandard( $message, $expected, $params ) {
- $this->setService( 'MediaHandlerFactory', new MockMediaHandlerFactory() );
+ $handlers = MediaWikiServices::getInstance()->getMainConfig()->get( 'ParserTestMediaHandlers' );
+ $this->setService( 'MediaHandlerFactory', new MediaHandlerFactory( $handlers ) );
$this->assertSame(
$expected,
- wfThumbIsStandard( new FakeDimensionFile( [ 2000, 1800 ] ), $params ),
+ wfThumbIsStandard( new FakeDimensionFile( [ 2000, 1800 ], 'image/jpeg' ), $params ),
$message
);
}
*/
class FakeDimensionFile extends File {
public $mustRender = false;
+ public $mime;
+ public $dimensions;
- public function __construct( $dimensions ) {
+ public function __construct( $dimensions, $mime = 'unknown/unknown' ) {
parent::__construct( Title::makeTitle( NS_FILE, 'Test' ),
new NullRepo( null ) );
$this->dimensions = $dimensions;
+ $this->mime = $mime;
}
public function getWidth( $page = 1 ) {
public function getPath() {
return '';
}
+
+ public function getMimeType() {
+ return $this->mime;
+ }
}
+++ /dev/null
-<?php
-/**
- * Media-handling base classes and generic functionality.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Media
- */
-
-/**
- * Replace all media handlers with a mock. We do not need to generate
- * actual thumbnails to do parser testing, we only care about receiving
- * a ThumbnailImage properly initialized.
- *
- * @since 1.28
- */
-class MockMediaHandlerFactory extends MediaHandlerFactory {
-
- private static $overrides = [
- 'image/svg+xml' => MockSvgHandler::class,
- 'image/vnd.djvu' => MockDjVuHandler::class,
- 'application/ogg' => MockOggHandler::class,
- ];
-
- public function __construct() {
- // override parent
- }
-
- protected function getHandlerClass( $type ) {
- if ( isset( self::$overrides[$type] ) ) {
- return self::$overrides[$type];
- }
-
- return MockBitmapHandler::class;
- }
-
-}
+++ /dev/null
-<?php
-/**
- * Fake handler for Ogg videos.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Media
- */
-
-class MockOggHandler extends OggHandlerTMH {
- function doTransform( $file, $dstPath, $dstUrl, $params, $flags = 0 ) {
- # Important or height handling is wrong.
- if ( !$this->normaliseParams( $file, $params ) ) {
- return new TransformParameterError( $params );
- }
-
- $srcWidth = $file->getWidth();
- $srcHeight = $file->getHeight();
-
- // Audio should not be transformed by size, give it a default width and height
- if ( $this->isAudio( $file ) ) {
- $srcWidth = 220;
- $srcHeight = 23;
- }
-
- $params['width'] = isset( $params['width'] ) ? $params['width'] : $srcWidth;
-
- // if height overtakes width use height as max:
- $targetWidth = $params['width'];
- $targetHeight = $srcWidth == 0 ? $srcHeight : round( $params['width'] * $srcHeight / $srcWidth );
- if ( isset( $params['height'] ) && $targetHeight > $params['height'] ) {
- $targetHeight = $params['height'];
- $targetWidth = round( $params['height'] * $srcWidth / $srcHeight );
- }
- $options = [
- 'file' => $file,
- 'length' => $this->getLength( $file ),
- 'offset' => $this->getOffset( $file ),
- 'width' => $targetWidth,
- 'height' => $targetHeight,
- 'isVideo' => !$this->isAudio( $file ),
- 'thumbtime' => isset(
- $params['thumbtime']
- ) ? $params['thumbtime'] : intval( $file->getLength() / 2 ),
- 'start' => isset( $params['start'] ) ? $params['start'] : false,
- 'end' => isset( $params['end'] ) ? $params['end'] : false,
- 'fillwindow' => isset( $params['fillwindow'] ) ? $params['fillwindow'] : false,
- 'disablecontrols' => isset( $params['disablecontrols'] ) ? $params['disablecontrols'] : false
- ];
-
- // No thumbs for audio
- if ( !$options['isVideo'] ) {
- return new TimedMediaTransformOutput( $options );
- }
-
- // Setup pointer to thumb arguments
- $options[ 'thumbUrl' ] = $dstUrl;
- $options[ 'dstPath' ] = $dstPath;
- $options[ 'path' ] = $dstPath;
-
- return new TimedMediaTransformOutput( $options );
- }
-
- function getLength( $file ) {
- if ( $this->isAudio( $file ) ) {
- return 0.99875;
- }
- return 4.3666666666667;
- }
-
- function getBitRate( $file ) {
- if ( $this->isAudio( $file ) ) {
- return 41107;
- }
- return 590013;
- }
-
- function getWebType( $file ) {
- if ( $this->isAudio( $file ) ) {
- return "audio/ogg; codecs=\"vorbis\"";
- }
- return "video/ogg; codecs=\"theora\"";
- }
-
- function getFramerate( $file ) {
- if ( $this->isAudio( $file ) ) {
- return 0;
- }
- return 30;
- }
-}