RCFilters: Export config vars in the RL modules where possible
authorRoan Kattouw <roan.kattouw@gmail.com>
Sat, 9 Feb 2019 22:59:10 +0000 (14:59 -0800)
committerTimo Tijhof <krinklemail@gmail.com>
Sun, 10 Feb 2019 03:36:16 +0000 (03:36 +0000)
Right now there are only a few settings that don't depend on the request
context, but we can at least export those. The tag data in
particular can get pretty big.

Downgrade the type hint for ChangeTags::tagDescription() and
tagLongDescriptionMessage() from IContextSource to MessageLocalizer, so
we can pass a ResourceLoaderContext to these functions. (Since
IContextSource extends MessageLocalizer, this won't break any callers.)

truncateTagDescription() can't be downgraded to MessageLocalizer because
it needs a Language object, so hack up a fake RequestContext when
calling it. It would be nice if this weren't necessary; perhaps we can
move getLanguage() from IContextSource up into MessageLocalizer?

Bug: T201574
Change-Id: I9b66e35de826a07aa9551ba285e64e4852293229

includes/changetags/ChangeTags.php
includes/specialpage/ChangesListSpecialPage.php
includes/specials/SpecialWatchlist.php
resources/Resources.php
resources/src/mediawiki.rcfilters/Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js

index a1cf468..6ebe800 100644 (file)
@@ -141,11 +141,11 @@ class ChangeTags {
         * we consider the tag hidden, and return false.
         *
         * @param string $tag
-        * @param IContextSource $context
+        * @param MessageLocalizer $context
         * @return string|bool Tag description or false if tag is to be hidden.
         * @since 1.25 Returns false if tag is to be hidden.
         */
-       public static function tagDescription( $tag, IContextSource $context ) {
+       public static function tagDescription( $tag, MessageLocalizer $context ) {
                $msg = $context->msg( "tag-$tag" );
                if ( !$msg->exists() ) {
                        // No such message, so return the HTML-escaped tag name.
@@ -168,11 +168,11 @@ class ChangeTags {
         * for the long description.
         *
         * @param string $tag
-        * @param IContextSource $context
+        * @param MessageLocalizer $context
         * @return Message|bool Message object of the tag long description or false if
         *  there is no description.
         */
-       public static function tagLongDescriptionMessage( $tag, IContextSource $context ) {
+       public static function tagLongDescriptionMessage( $tag, MessageLocalizer $context ) {
                $msg = $context->msg( "tag-$tag-description" );
                if ( !$msg->exists() ) {
                        return false;
@@ -196,6 +196,8 @@ class ChangeTags {
         * @return string Truncated long tag description.
         */
        public static function truncateTagDescription( $tag, $length, IContextSource $context ) {
+               // FIXME: Make this accept MessageLocalizer and Language instead of IContextSource
+
                $originalDesc = self::tagLongDescriptionMessage( $tag, $context );
                // If there is no tag description, return empty string
                if ( !$originalDesc ) {
index 4201f80..4e23777 100644 (file)
@@ -792,10 +792,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        $out->addJsConfigVars( 'wgStructuredChangeFiltersMessages', $messages );
                        $out->addJsConfigVars( 'wgStructuredChangeFiltersCollapsedState', $collapsed );
 
-                       $out->addJsConfigVars(
-                               'wgRCFiltersChangeTags',
-                               $this->getChangeTagList()
-                       );
                        $out->addJsConfigVars(
                                'StructuredChangeFiltersDisplayConfig',
                                [
@@ -823,26 +819,35 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                'wgStructuredChangeFiltersCollapsedPreferenceName',
                                static::$collapsedPreferenceName
                        );
-
-                       $out->addJsConfigVars(
-                               'StructuredChangeFiltersLiveUpdatePollingRate',
-                               $this->getConfig()->get( 'StructuredChangeFiltersLiveUpdatePollingRate' )
-                       );
                } else {
                        $out->addBodyClasses( 'mw-rcfilters-disabled' );
                }
        }
 
+       /**
+        * Get config vars to export with the mediawiki.rcfilters.filters.ui module.
+        *
+        * @param ResourceLoaderContext $context
+        * @return array
+        */
+       public static function getRcFiltersConfigVars( ResourceLoaderContext $context ) {
+               return [
+                       'RCFiltersChangeTags' => self::getChangeTagList( $context ),
+                       'StructuredChangeFiltersEditWatchlistUrl' =>
+                               SpecialPage::getTitleFor( 'EditWatchlist' )->getLocalURL()
+               ];
+       }
+
        /**
         * Fetch the change tags list for the front end
         *
+        * @param ResourceLoaderContext $context
         * @return array Tag data
         */
-       protected function getChangeTagList() {
+       protected static function getChangeTagList( ResourceLoaderContext $context ) {
                $cache = ObjectCache::getMainWANInstance();
-               $context = $this->getContext();
                return $cache->getWithSetCallback(
-                       $cache->makeKey( 'changeslistspecialpage-changetags', $context->getLanguage()->getCode() ),
+                       $cache->makeKey( 'changeslistspecialpage-changetags', $context->getLanguage() ),
                        $cache::TTL_MINUTE * 10,
                        function () use ( $context ) {
                                $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
@@ -858,6 +863,10 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                */
                                $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags );
 
+                               // HACK work around ChangeTags::truncateTagDescription() requiring a RequestContext
+                               $fakeContext = new RequestContext;
+                               $fakeContext->setLanguage( Language::factory( $context->getLanguage() ) );
+
                                // Build the list and data
                                $result = [];
                                foreach ( $tagHitCounts as $tagName => $hits ) {
@@ -873,7 +882,9 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                        ),
                                                        'description' =>
                                                                ChangeTags::truncateTagDescription(
-                                                                       $tagName, self::TAG_DESC_CHARACTER_LIMIT, $context
+                                                                       $tagName,
+                                                                       self::TAG_DESC_CHARACTER_LIMIT,
+                                                                       $fakeContext
                                                                ),
                                                        'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ),
                                                        'hits' => $hits,
index 0fc6e13..971aa43 100644 (file)
@@ -102,11 +102,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                if ( $this->isStructuredFilterUiEnabled() ) {
                        $output->addModuleStyles( [ 'mediawiki.rcfilters.highlightCircles.seenunseen.styles' ] );
-
-                       $output->addJsConfigVars(
-                               'wgStructuredChangeFiltersEditWatchlistUrl',
-                               SpecialPage::getTitleFor( 'EditWatchlist' )->getLocalURL()
-                       );
                }
        }
 
index f774993..d62f3e3 100644 (file)
@@ -1813,6 +1813,7 @@ return [
                        'dm/ItemModel.js',
                        'dm/SavedQueriesModel.js',
                        'dm/SavedQueryItemModel.js',
+                       'config.json' => [ 'config' => [ 'StructuredChangeFiltersLiveUpdatePollingRate' ] ],
                ],
                'dependencies' => [
                        'mediawiki.String',
@@ -1866,6 +1867,7 @@ return [
                        'ui/RclTargetPageWidget.js',
                        'ui/RclToOrFromWidget.js',
                        'ui/WatchlistTopSectionWidget.js',
+                       'config.json' => [ 'callback' => 'ChangesListSpecialPage::getRcFiltersConfigVars' ],
                ],
                'styles' => [
                        'styles/mw.rcfilters.mixins.less',
index 30d4a90..56a95eb 100644 (file)
@@ -33,6 +33,8 @@
                this.collapsedPreferenceName = config.collapsedPreferenceName;
                this.normalizeTarget = !!config.normalizeTarget;
 
+               this.pollingRate = require( './config.json' ).StructuredChangeFiltersLiveUpdatePollingRate;
+
                this.requestCounter = {};
                this.baseFilterState = {};
                this.uriProcessor = null;
                this.initialized = true;
                this.switchView( 'default' );
 
-               this.pollingRate = mw.config.get( 'StructuredChangeFiltersLiveUpdatePollingRate' );
                if ( this.pollingRate ) {
                        this._scheduleLiveUpdate();
                }
index 4e0d3da..a69dc55 100644 (file)
                        mw.config.get( 'wgStructuredChangeFilters' ),
                        // All namespaces without Media namespace
                        getNamespaces( [ 'Media' ] ),
-                       mw.config.get( 'wgRCFiltersChangeTags' ),
+                       require( './config.json' ).RCFiltersChangeTags,
                        conditionalViews
                );
 
index 2674cc2..cb297f6 100644 (file)
@@ -90,7 +90,7 @@
                                this.numChangesAndDateWidget.$element
                        );
 
-               if ( mw.config.get( 'StructuredChangeFiltersLiveUpdatePollingRate' ) ) {
+               if ( this.controller.pollingRate ) {
                        $bottom.prepend( this.liveUpdateButton.$element );
                }
 
index a1c9776..16c0533 100644 (file)
@@ -30,7 +30,7 @@
                editWatchlistButton = new OO.ui.ButtonWidget( {
                        label: mw.msg( 'rcfilters-watchlist-edit-watchlist-button' ),
                        icon: 'edit',
-                       href: mw.config.get( 'wgStructuredChangeFiltersEditWatchlistUrl' )
+                       href: require( '../config.json' ).StructuredChangeFiltersEditWatchlistUrl
                } );
                markSeenButton = new MarkSeenButtonWidget( controller, changesListModel );