Merge "Implement OOUI display format for HTMLForm"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 24 May 2015 12:22:29 +0000 (12:22 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 24 May 2015 12:22:29 +0000 (12:22 +0000)
1  2 
autoload.php
includes/htmlform/HTMLForm.php
resources/Resources.php

diff --combined autoload.php
@@@ -8,7 -8,6 +8,7 @@@ $wgAutoloadLocalClasses = array
        'AbstractContent' => __DIR__ . '/includes/content/AbstractContent.php',
        'Action' => __DIR__ . '/includes/actions/Action.php',
        'ActiveUsersPager' => __DIR__ . '/includes/specials/SpecialActiveusers.php',
 +      'ActivityUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/ActivityUpdateJob.php',
        'AjaxDispatcher' => __DIR__ . '/includes/AjaxDispatcher.php',
        'AjaxResponse' => __DIR__ . '/includes/AjaxResponse.php',
        'AllMessagesTablePager' => __DIR__ . '/includes/specials/SpecialAllMessages.php',
@@@ -61,7 -60,6 +61,7 @@@
        'ApiModuleManager' => __DIR__ . '/includes/api/ApiModuleManager.php',
        'ApiMove' => __DIR__ . '/includes/api/ApiMove.php',
        'ApiOpenSearch' => __DIR__ . '/includes/api/ApiOpenSearch.php',
 +      'ApiOpenSearchFormatJson' => __DIR__ . '/includes/api/ApiOpenSearch.php',
        'ApiOptions' => __DIR__ . '/includes/api/ApiOptions.php',
        'ApiPageSet' => __DIR__ . '/includes/api/ApiPageSet.php',
        'ApiParamInfo' => __DIR__ . '/includes/api/ApiParamInfo.php',
        'DeleteDefaultMessages' => __DIR__ . '/maintenance/deleteDefaultMessages.php',
        'DeleteEqualMessages' => __DIR__ . '/maintenance/deleteEqualMessages.php',
        'DeleteFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
 -      'DeleteImageCache' => __DIR__ . '/maintenance/deleteImageMemcached.php',
        'DeleteLogFormatter' => __DIR__ . '/includes/logging/DeleteLogFormatter.php',
        'DeleteOldRevisions' => __DIR__ . '/maintenance/deleteOldRevisions.php',
        'DeleteOrphanedRevisions' => __DIR__ . '/maintenance/deleteOrphanedRevisions.php',
        'MWFunction' => __DIR__ . '/includes/utils/MWFunction.php',
        'MWHookException' => __DIR__ . '/includes/Hooks.php',
        'MWHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
 -      'MWLogger' => __DIR__ . '/includes/debug/logger/Shims.php',
 -      'MWLoggerFactory' => __DIR__ . '/includes/debug/logger/Shims.php',
 -      'MWLoggerLegacyLogger' => __DIR__ . '/includes/debug/logger/Shims.php',
 -      'MWLoggerLegacySpi' => __DIR__ . '/includes/debug/logger/Shims.php',
 -      'MWLoggerMonologHandler' => __DIR__ . '/includes/debug/logger/monolog/Shims.php',
 -      'MWLoggerMonologLegacyFormatter' => __DIR__ . '/includes/debug/logger/monolog/Shims.php',
 -      'MWLoggerMonologProcessor' => __DIR__ . '/includes/debug/logger/monolog/Shims.php',
 -      'MWLoggerMonologSpi' => __DIR__ . '/includes/debug/logger/monolog/Shims.php',
 -      'MWLoggerMonologSyslogHandler' => __DIR__ . '/includes/debug/logger/monolog/Shims.php',
 -      'MWLoggerNullSpi' => __DIR__ . '/includes/debug/logger/Shims.php',
 -      'MWLoggerSpi' => __DIR__ . '/includes/debug/logger/Shims.php',
        'MWMemcached' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
        'MWMessagePack' => __DIR__ . '/includes/libs/MWMessagePack.php',
        'MWNamespace' => __DIR__ . '/includes/MWNamespace.php',
        'ObjectFileCache' => __DIR__ . '/includes/cache/ObjectFileCache.php',
        'OldChangesList' => __DIR__ . '/includes/changes/OldChangesList.php',
        'OldLocalFile' => __DIR__ . '/includes/filerepo/file/OldLocalFile.php',
+       'OOUIHTMLForm' => __DIR__ . '/includes/htmlform/OOUIHTMLForm.php',
        'OracleInstaller' => __DIR__ . '/includes/installer/OracleInstaller.php',
        'OracleUpdater' => __DIR__ . '/includes/installer/OracleUpdater.php',
        'OrphanStats' => __DIR__ . '/maintenance/storage/orphanStats.php',
        'ResourceLoaderFilePath' => __DIR__ . '/includes/resourceloader/ResourceLoaderFilePath.php',
        'ResourceLoaderImage' => __DIR__ . '/includes/resourceloader/ResourceLoaderImage.php',
        'ResourceLoaderImageModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderImageModule.php',
 +      'ResourceLoaderJqueryMsgDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderJqueryMsgDataModule.php',
        'ResourceLoaderLanguageDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageDataModule.php',
        'ResourceLoaderLanguageNamesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageNamesModule.php',
        'ResourceLoaderModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderModule.php',
 +      'ResourceLoaderRawFileModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderRawFileModule.php',
        'ResourceLoaderSiteModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSiteModule.php',
        'ResourceLoaderSkinModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSkinModule.php',
        'ResourceLoaderSpecialCharacterDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php',
   *                             is "wp{$fieldname}".  If you want a different name
   *                             (eg one without the "wp" prefix), specify it here and
   *                             it will be used without modification.
 + *    'hide-if'             -- expression given as an array stating when the field
 + *                             should be hidden. The first array value has to be the
 + *                             expression's logic operator. Supported expressions:
 + *                               'NOT'
 + *                                 [ 'NOT', array $expression ]
 + *                                 To hide a field if a given expression is not true.
 + *                               '==='
 + *                                 [ '===', string $fieldName, string $value ]
 + *                                 To hide a field if another field identified by
 + *                                 $field has the value $value.
 + *                               '!=='
 + *                                 [ '!==', string $fieldName, string $value ]
 + *                                 Same as [ 'NOT', [ '===', $fieldName, $value ]
 + *                               'OR', 'AND', 'NOR', 'NAND'
 + *                                 [ 'XXX', array $expression1, ..., array $expressionN ]
 + *                                 To hide a field if one or more (OR), all (AND),
 + *                                 neither (NOR) or not all (NAND) given expressions
 + *                                 are evaluated as true.
 + *                             The expressions will be given to a JavaScript frontend
 + *                             module which will continually update the field's
 + *                             visibility.
   *
   * Since 1.20, you can chain mutators to ease the form generation:
   * @par Example:
@@@ -238,6 -217,7 +238,7 @@@ class HTMLForm extends ContextSource 
         */
        protected $availableSubclassDisplayFormats = array(
                'vform',
+               'ooui',
        );
  
        /**
                        case 'vform':
                                $reflector = new ReflectionClass( 'VFormHTMLForm' );
                                return $reflector->newInstanceArgs( $arguments );
+                       case 'ooui':
+                               $reflector = new ReflectionClass( 'OOUIHTMLForm' );
+                               return $reflector->newInstanceArgs( $arguments );
                        default:
                                $reflector = new ReflectionClass( 'HTMLForm' );
                                $form = $reflector->newInstanceArgs( $arguments );
                                                Html::rawElement( 'tbody', array(), "\n$html\n" ) ) . "\n";
                        } elseif ( $displayFormat === 'inline' ) {
                                $html = Html::rawElement( 'span', $attribs, "\n$html\n" );
+                       } elseif ( $displayFormat === 'ooui' ) {
+                               $config = array(
+                                       'classes' => $classes,
+                               );
+                               if ( $sectionName ) {
+                                       $config['id'] = Sanitizer::escapeId( $sectionName );
+                               }
+                               $fieldset = new OOUI\FieldsetLayout( $config );
+                               // Ewww. We should pass this as $config['items'], but there might be string snippets.
+                               $fieldset->group->appendContent( new OOUI\HtmlSnippet( $html ) );
+                               $html = $fieldset->toString();
                        } else {
                                $html = Html::rawElement( 'div', $attribs, "\n$html\n" );
                        }
diff --combined resources/Resources.php
@@@ -58,9 -58,6 +58,9 @@@ return array
        // Scripts for the dynamic language specific data, like grammar forms.
        'mediawiki.language.data' => array( 'class' => 'ResourceLoaderLanguageDataModule' ),
  
 +      // Dynamic data for mediawiki.jqueryMsg, such as allowed tags
 +      'mediawiki.jqueryMsg.data' => array( 'class' => 'ResourceLoaderJqueryMsgDataModule' ),
 +
        /* MediaWiki base skinning modules */
  
        /**
                'styles' => 'resources/src/jquery/jquery.confirmable.css',
                'dependencies' => 'mediawiki.jqueryMsg',
        ),
 -      // Use mediawiki.cookie in new code, rather than jquery.cookie.
        'jquery.cookie' => array(
                'scripts' => 'resources/lib/jquery/jquery.cookie.js',
                'targets' => array( 'desktop', 'mobile' ),
        /* MediaWiki */
  
        'mediawiki' => array(
 +              'class' => 'ResourceLoaderRawFileModule',
                // Keep maintenance/jsduck/eg-iframe.html in sync
                'scripts' => array(
 +                      'resources/lib/phpjs-sha1/sha1.js',
                        'resources/src/mediawiki/mediawiki.js',
                        'resources/src/mediawiki/mediawiki.errorLogger.js',
                        'resources/src/mediawiki/mediawiki.startUp.js',
                ),
                'debugScripts' => 'resources/src/mediawiki/mediawiki.log.js',
 -              'raw' => true,
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.apihelp' => array(
                        'colon-separator',
                ),
        ),
+       'mediawiki.htmlform.ooui' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.htmlform.ooui.js',
+               'dependencies' => 'oojs-ui',
+       ),
+       'mediawiki.htmlform.ooui.styles' => array(
+               'styles' => 'resources/src/mediawiki/mediawiki.htmlform.ooui.css',
+       ),
        'mediawiki.icon' => array(
                'styles' => 'resources/src/mediawiki/mediawiki.icon.less',
        ),
        ),
        'mediawiki.toc' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.toc.js',
 -              'dependencies' => 'jquery.cookie',
 +              'dependencies' => 'mediawiki.cookie',
                'messages' => array( 'showtoc', 'hidetoc' ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.user' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.user.js',
                'dependencies' => array(
 -                      'jquery.cookie',
 +                      'mediawiki.cookie',
                        'mediawiki.api',
                        'user.options',
                        'user.tokens',
        'mediawiki.jqueryMsg' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.jqueryMsg.js',
                'dependencies' => array(
 +                      'mediawiki.jqueryMsg.data',
                        'mediawiki.util',
                        'mediawiki.language',
                        'dom-level2-shim',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.indicators' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-alerts.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-content' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-content.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-editing-advanced' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-editing-advanced.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-editing-core' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-editing-core.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-editing-list' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-editing-list.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-editing-styling' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-editing-styling.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-interactions' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-interactions.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-layout' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-layout.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-location' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-location.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-media' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-media.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-moderation' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-moderation.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-movement' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-movement.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-user' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-user.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
        'oojs-ui.styles.icons-wikimedia' => array(
                'class' => 'ResourceLoaderImageModule',
                'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
                'data' => 'icons-wikimedia.json',
                'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
 -              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
 +              'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
        ),
  
  );