*
* @param $name string the image name to check
* @param $contextTitle Title|bool the page on which the image occurs, if known
+ * @param $blacklist string wikitext of a file blacklist
* @return bool
*/
-function wfIsBadImage( $name, $contextTitle = false ) {
- static $badImages = null;
+function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
+ static $badImageCache = null; // based on bad_image_list msg
wfProfileIn( __METHOD__ );
# Handle redirects
wfProfileOut( __METHOD__ );
return $bad;
}
-
- if( $badImages === null ) {
+
+ $cacheable = ( $blacklist === null );
+ if( $cacheable && $badImageCache !== null ) {
+ $badImages = $badImageCache;
+ } else { // cache miss
+ if ( $blacklist === null ) {
+ $blacklist = wfMsgForContentNoTrans( 'bad_image_list' ); // site list
+ }
# Build the list now
$badImages = array();
- $lines = explode( "\n", wfMsgForContentNoTrans( 'bad_image_list' ) );
+ $lines = explode( "\n", $blacklist );
foreach( $lines as $line ) {
# List items only
if ( substr( $line, 0, 1 ) !== '*' ) {
$badImages[$imageDBkey] = $exceptions;
}
}
+ if ( $cacheable ) {
+ $badImageCache = $badImages;
+ }
}
$contextKey = $contextTitle ? $contextTitle->getPrefixedDBkey() : false;
);
}
+ /**
+ * @dataProvider provideWfIsBadImageList
+ */
+ function testWfIsBadImage( $name, $title, $blacklist, $expected, $desc ) {
+ $this->assertEquals( $expected, wfIsBadImage( $name, $title, $blacklist ), $desc );
+ }
+
+ function provideWfIsBadImageList() {
+ $blacklist = '* [[File:Bad.jpg]] except [[Nasty page]]';
+ return array(
+ array( 'Bad.jpg', false, $blacklist, true,
+ 'Called on a bad image' ),
+ array( 'Bad.jpg', Title::makeTitle( NS_MAIN, 'A page' ), $blacklist, true,
+ 'Called on a bad image' ),
+ array( 'NotBad.jpg', false, $blacklist, false,
+ 'Called on a non-bad image' ),
+ array( 'Bad.jpg', Title::makeTitle( NS_MAIN, 'Nasty page' ), $blacklist, false,
+ 'Called on a bad image but is on a whitelisted page' ),
+ array( 'File:Bad.jpg', false, $blacklist, false,
+ 'Called on a bad image with File:' ),
+ );
+ }
/* TODO: many more! */
}