From 115fe784b549bdf5e8053d025d07106d8475d2d3 Mon Sep 17 00:00:00 2001 From: jdlrobson Date: Thu, 27 Jul 2017 16:29:21 -0700 Subject: [PATCH] Allow blacklisting certain namespaces in Special:ShortPages This new config variable ($wgShortPagesNamespaceBlacklist) allows wikis to specify namespaces which should be excluded from Special:ShortPages. This will be used by Commons, for which NS_FILE is a content namespace (accessible via Special:Random and Special:Nearby) but is not useful to list on Special:ShortPages. If the blacklist cancels out all namespace in wgContentNamespaces then all namespaces will show up on the page. Bug: T170687 Change-Id: I10b4849a5d7f3f8af75ccc6cfba230d03725c898 --- includes/DefaultSettings.php | 7 +++ includes/specials/SpecialShortpages.php | 4 +- .../specials/SpecialShortpagesTest.php | 43 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/phpunit/includes/specials/SpecialShortpagesTest.php diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 74d5fa4471..9fb29fd79e 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -4091,6 +4091,13 @@ $wgTrackingCategories = []; */ $wgContentNamespaces = [ NS_MAIN ]; +/** + * Optional array of namespaces which should be blacklisted from Special:ShortPages + * Only pages inside $wgContentNamespaces but not $wgShortPagesNamespaceBlacklist will + * be shown on that page. + */ +$wgShortPagesNamespaceBlacklist = []; + /** * Array of namespaces, in addition to the talk namespaces, where signatures * (~~~~) are likely to be used. This determines whether to display the diff --git a/includes/specials/SpecialShortpages.php b/includes/specials/SpecialShortpages.php index f980e7112c..e9c15e7bed 100644 --- a/includes/specials/SpecialShortpages.php +++ b/includes/specials/SpecialShortpages.php @@ -41,9 +41,11 @@ class ShortPagesPage extends QueryPage { } public function getQueryInfo() { + $config = $this->getConfig(); + $blacklist = $config->get( 'ShortPagesNamespaceBlacklist' ); $tables = [ 'page' ]; $conds = [ - 'page_namespace' => MWNamespace::getContentNamespaces(), + 'page_namespace' => array_diff( MWNamespace::getContentNamespaces(), $blacklist ), 'page_is_redirect' => 0 ]; $joinConds = []; diff --git a/tests/phpunit/includes/specials/SpecialShortpagesTest.php b/tests/phpunit/includes/specials/SpecialShortpagesTest.php new file mode 100644 index 0000000000..14c692a9d5 --- /dev/null +++ b/tests/phpunit/includes/specials/SpecialShortpagesTest.php @@ -0,0 +1,43 @@ +setMwGlobals( [ + 'wgShortPagesNamespaceBlacklist' => $blacklistNS, + 'wgContentNamespaces' => $contentNS + ] ); + $this->setTemporaryHook( 'ShortPagesQuery', function() { + // empty hook handler + } ); + + $page = new ShortPagesPage(); + $queryInfo = $page->getQueryInfo(); + + $this->assertArrayHasKey( 'conds', $queryInfo ); + $this->assertArrayHasKey( 'page_namespace', $queryInfo[ 'conds' ] ); + $this->assertEquals( $expectedNS, $queryInfo[ 'conds' ][ 'page_namespace' ] ); + } + + public function provideGetQueryInfoRespectsContentNs() { + return [ + [ [ NS_MAIN, NS_FILE ], [], [ NS_MAIN, NS_FILE ] ], + [ [ NS_MAIN, NS_TALK ], [ NS_FILE ], [ NS_MAIN, NS_TALK ] ], + [ [ NS_MAIN, NS_FILE ], [ NS_FILE ], [ NS_MAIN ] ], + // NS_MAIN namespace is always forced + [ [], [ NS_FILE ], [ NS_MAIN ] ] + ]; + } + +} -- 2.20.1