From bf4f9d0313495dd67a53b9925edf9a3cc6ef36fe Mon Sep 17 00:00:00 2001 From: Roan Kattouw Date: Sat, 9 Feb 2019 14:59:10 -0800 Subject: [PATCH] RCFilters: Export config vars in the RL modules where possible 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 | 10 +++-- .../specialpage/ChangesListSpecialPage.php | 37 ++++++++++++------- includes/specials/SpecialWatchlist.php | 5 --- resources/Resources.php | 2 + .../src/mediawiki.rcfilters/Controller.js | 3 +- .../mediawiki.rcfilters/mw.rcfilters.init.js | 2 +- .../ui/FilterWrapperWidget.js | 2 +- .../ui/WatchlistTopSectionWidget.js | 2 +- 8 files changed, 37 insertions(+), 26 deletions(-) diff --git a/includes/changetags/ChangeTags.php b/includes/changetags/ChangeTags.php index a1cf468e6b..6ebe8008d0 100644 --- a/includes/changetags/ChangeTags.php +++ b/includes/changetags/ChangeTags.php @@ -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 ) { diff --git a/includes/specialpage/ChangesListSpecialPage.php b/includes/specialpage/ChangesListSpecialPage.php index 4201f80f45..4e2377764f 100644 --- a/includes/specialpage/ChangesListSpecialPage.php +++ b/includes/specialpage/ChangesListSpecialPage.php @@ -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, diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php index 0fc6e13c41..971aa43c09 100644 --- a/includes/specials/SpecialWatchlist.php +++ b/includes/specials/SpecialWatchlist.php @@ -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() - ); } } diff --git a/resources/Resources.php b/resources/Resources.php index f7749932ad..d62f3e3c54 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -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', diff --git a/resources/src/mediawiki.rcfilters/Controller.js b/resources/src/mediawiki.rcfilters/Controller.js index 30d4a900d8..56a95ebf1b 100644 --- a/resources/src/mediawiki.rcfilters/Controller.js +++ b/resources/src/mediawiki.rcfilters/Controller.js @@ -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; @@ -278,7 +280,6 @@ this.initialized = true; this.switchView( 'default' ); - this.pollingRate = mw.config.get( 'StructuredChangeFiltersLiveUpdatePollingRate' ); if ( this.pollingRate ) { this._scheduleLiveUpdate(); } diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js index 4e0d3da3be..a69dc55051 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js @@ -123,7 +123,7 @@ mw.config.get( 'wgStructuredChangeFilters' ), // All namespaces without Media namespace getNamespaces( [ 'Media' ] ), - mw.config.get( 'wgRCFiltersChangeTags' ), + require( './config.json' ).RCFiltersChangeTags, conditionalViews ); diff --git a/resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js index 2674cc2efb..cb297f68ea 100644 --- a/resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js @@ -90,7 +90,7 @@ this.numChangesAndDateWidget.$element ); - if ( mw.config.get( 'StructuredChangeFiltersLiveUpdatePollingRate' ) ) { + if ( this.controller.pollingRate ) { $bottom.prepend( this.liveUpdateButton.$element ); } diff --git a/resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js b/resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js index a1c97768b4..16c0533d8b 100644 --- a/resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js @@ -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 ); -- 2.20.1