From a398c0c933750dad6f32adbdbcabae73b5baeb2a Mon Sep 17 00:00:00 2001 From: Mark Holmquist Date: Thu, 5 Mar 2015 12:52:11 -0600 Subject: [PATCH] Add framework for file warnings See I674bf7f6c1b21ffc9870aa84382479af5f966561 for an example in the PdfHandler extension. Bug: T89765 Change-Id: I3c4b7af7284b5e16e458dd72de789e74db489895 --- includes/media/ImageHandler.php | 4 +- includes/media/MediaHandler.php | 24 ++++++- includes/page/ImagePage.php | 16 +++++ resources/Resources.php | 9 +++ .../src/mediawiki/mediawiki.filewarning.js | 68 +++++++++++++++++++ .../src/mediawiki/mediawiki.filewarning.less | 29 ++++++++ 6 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 resources/src/mediawiki/mediawiki.filewarning.js create mode 100644 resources/src/mediawiki/mediawiki.filewarning.less diff --git a/includes/media/ImageHandler.php b/includes/media/ImageHandler.php index 787f21e443..968e424311 100644 --- a/includes/media/ImageHandler.php +++ b/includes/media/ImageHandler.php @@ -245,11 +245,11 @@ abstract class ImageHandler extends MediaHandler { if ( $pages === false || $pages <= 1 ) { $msg = wfMessage( 'file-info-size' )->numParams( $file->getWidth(), $file->getHeight() )->params( $size, - $file->getMimeType() )->parse(); + '' . $file->getMimeType() . '' )->parse(); } else { $msg = wfMessage( 'file-info-size-pages' )->numParams( $file->getWidth(), $file->getHeight() )->params( $size, - $file->getMimeType() )->numParams( $pages )->parse(); + '' . $file->getMimeType() . '' )->numParams( $pages )->parse(); } return $msg; diff --git a/includes/media/MediaHandler.php b/includes/media/MediaHandler.php index 0103946d67..33aed34f4f 100644 --- a/includes/media/MediaHandler.php +++ b/includes/media/MediaHandler.php @@ -639,7 +639,7 @@ abstract class MediaHandler { */ static function getGeneralLongDesc( $file ) { return wfMessage( 'file-info' )->sizeParams( $file->getSize() ) - ->params( $file->getMimeType() )->parse(); + ->params( '' . $file->getMimeType() . '' )->parse(); } /** @@ -861,4 +861,26 @@ abstract class MediaHandler { public function sanitizeParamsForBucketing( $params ) { return $params; } + + /** + * Gets configuration for the file warning message. Return value of + * the following structure: + * array( + * 'module' => 'example.filewarning.messages', // Required, module with messages loaded for the client + * 'messages' => array( // Required, array of names of messages + * 'main' => 'example-filewarning-main', // Required, main warning message + * 'header' => 'example-filewarning-header', // Optional, header for warning dialog + * 'footer' => 'example-filewarning-footer', // Optional, footer for warning dialog + * 'info' => 'example-filewarning-info', // Optional, text for more-information link (see below) + * ), + * 'link' => 'http://example.com', // Optional, link for more information + * ) + * + * Returns null if no warning is necessary. + * @param File $file + * @return array|null + */ + public function getWarningConfig( $file ) { + return null; + } } diff --git a/includes/page/ImagePage.php b/includes/page/ImagePage.php index 504fa74f3f..8f635cfa11 100644 --- a/includes/page/ImagePage.php +++ b/includes/page/ImagePage.php @@ -505,6 +505,22 @@ class ImagePage extends Article { $longDesc = $this->getContext()->msg( 'parentheses', $this->displayImg->getLongDesc() )->text(); + $handler = $this->displayImg->getHandler(); + + // If this is a filetype with potential issues, warn the user. + if ( $handler ) { + $warningConfig = $handler->getWarningConfig( $this->displayImg ); + + if ( $warningConfig !== null ) { + // The warning will be displayed via CSS and JavaScript. + // We just need to tell the client side what message to use. + $output = $this->getContext()->getOutput(); + $output->addJsConfigVars( 'wgFileWarning', $warningConfig ); + $output->addModules( $warningConfig['module'] ); + $output->addModules( 'mediawiki.filewarning' ); + } + } + $medialink = "[[Media:$filename|$linktext]]"; if ( !$this->displayImg->isSafeFile() ) { diff --git a/resources/Resources.php b/resources/Resources.php index a158af7adb..cabf0a0dbf 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -892,6 +892,15 @@ return array( 'feedback-useragent' ), ), + + 'mediawiki.filewarning' => array( + 'scripts' => 'resources/src/mediawiki/mediawiki.filewarning.js', + 'styles' => 'resources/src/mediawiki/mediawiki.filewarning.less', + 'dependencies' => array( + 'oojs-ui', + ), + ), + 'mediawiki.helplink' => array( 'styles' => array( 'resources/src/mediawiki/mediawiki.helplink.css', diff --git a/resources/src/mediawiki/mediawiki.filewarning.js b/resources/src/mediawiki/mediawiki.filewarning.js new file mode 100644 index 0000000000..882affe17f --- /dev/null +++ b/resources/src/mediawiki/mediawiki.filewarning.js @@ -0,0 +1,68 @@ +/*! + * mediawiki.filewarning + * + * @author Mark Holmquist, 2015 + * @since 1.25 + */ +/*global OO*/ +( function ( mw, $, oo ) { + var warningConfig = mw.config.get( 'wgFileWarning' ), + warningMessages = warningConfig.messages, + warningLink = warningConfig.link, + $origMimetype = $( '.fullMedia .fileInfo .mime-type' ), + $mimetype = $origMimetype.clone(), + $header = $( '

' ) + .addClass( 'mediawiki-filewarning-header empty' ), + $main = $( '

' ) + .addClass( 'mediawiki-filewarning-main empty' ), + $info = $( '' ) + .addClass( 'mediawiki-filewarning-info empty' ), + $footer = $( '

' ) + .addClass( 'mediawiki-filewarning-footer empty' ), + dialog = new oo.ui.PopupButtonWidget( { + classes: [ 'mediawiki-filewarning-anchor' ], + label: $mimetype, + flags: [ 'warning' ], + icon: 'alert', + framed: false, + popup: { + classes: [ 'mediawiki-filewarning' ], + padded: true, + width: 400, + $content: $header.add( $main ).add( $info ).add( $footer ) + } + } ); + + function loadMessage( $target, message ) { + if ( message ) { + $target.removeClass( 'empty' ) + .text( mw.message( message ).text() ); + } + } + + // The main message must be populated for the dialog to show. + if ( warningConfig && warningConfig.messages && warningConfig.messages.main ) { + $mimetype.addClass( 'has-warning' ); + + $origMimetype.replaceWith( dialog.$element ); + + if ( warningMessages ) { + loadMessage( $main, warningMessages.main ); + loadMessage( $header, warningMessages.header ); + loadMessage( $footer, warningMessages.footer ); + + if ( warningLink ) { + loadMessage( $info, warningMessages.info ); + $info.attr( 'href', warningLink ); + } + } + + // Make OOUI open the dialog, it won't appear until the user + // hovers over the warning. + dialog.getPopup().toggle( true ); + + // Override toggle handler because we don't need it for this popup + // object at all. Sort of nasty, but it gets the job done. + dialog.getPopup().toggle = $.noop; + } +}( mediaWiki, jQuery, OO ) ); diff --git a/resources/src/mediawiki/mediawiki.filewarning.less b/resources/src/mediawiki/mediawiki.filewarning.less new file mode 100644 index 0000000000..489ac42850 --- /dev/null +++ b/resources/src/mediawiki/mediawiki.filewarning.less @@ -0,0 +1,29 @@ +@import "mediawiki.ui/variables" + +.mediawiki-filewarning { + display: none; + + .mediawiki-filewarning-header { + padding: 0; + font-weight: 600; + } + + .mediawiki-filewarning-footer { + color: #888888; + } + + .empty { + display: none; + } + + .mediawiki-filewarning-anchor:hover & { + display: block; + } +} + +.mime-type { + &.has-warning { + font-weight: bold; + color: @colorMediumSevere; + } +} -- 2.20.1