Merge "FauxRequest: don’t override getValues()"
[lhc/web/wiklou.git] / includes / api / ApiQueryQueryPage.php
index a828e11..12e908f 100644 (file)
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Special\SpecialPageFactory;
+
 /**
  * Query module to get the results of a QueryPage-based special page
  *
  * @ingroup API
  */
 class ApiQueryQueryPage extends ApiQueryGeneratorBase {
-       private $qpMap;
+
+       /**
+        * @var string[] list of special page names
+        */
+       private $queryPages;
+
+       /**
+        * @var SpecialPageFactory
+        */
+       private $specialPageFactory;
 
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'qp' );
-               // Build mapping from special page names to QueryPage classes
-               $uselessQueryPages = $this->getConfig()->get( 'APIUselessQueryPages' );
-               $this->qpMap = [];
-               foreach ( QueryPage::getPages() as $page ) {
-                       if ( !in_array( $page[1], $uselessQueryPages ) ) {
-                               $this->qpMap[$page[1]] = $page[0];
-                       }
-               }
+               $this->queryPages = array_values( array_diff(
+                       array_column( QueryPage::getPages(), 1 ), // [ class, name ]
+                       $this->getConfig()->get( 'APIUselessQueryPages' )
+               ) );
+               $this->specialPageFactory = MediaWikiServices::getInstance()->getSpecialPageFactory();
        }
 
        public function execute() {
@@ -49,14 +58,34 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param ApiPageSet $resultPageSet
+        * @param string $name
+        * @return QueryPage
+        */
+       private function getSpecialPage( $name ) : QueryPage {
+               $qp = $this->specialPageFactory->getPage( $name );
+               if ( !$qp ) {
+                       self::dieDebug(
+                               __METHOD__,
+                               'SpecialPageFactory failed to create special page ' . $name
+                       );
+               }
+               if ( !( $qp instanceof QueryPage ) ) {
+                       self::dieDebug(
+                               __METHOD__,
+                               'Special page ' . $name . ' is not a QueryPage'
+                       );
+               }
+               return $qp;
+       }
+
+       /**
+        * @param ApiPageSet|null $resultPageSet
         */
        public function run( $resultPageSet = null ) {
                $params = $this->extractRequestParams();
                $result = $this->getResult();
 
-               /** @var QueryPage $qp */
-               $qp = new $this->qpMap[$params['page']]();
+               $qp = $this->getSpecialPage( $params['page'] );
                if ( !$qp->userCanExecute( $this->getUser() ) ) {
                        $this->dieWithError( 'apierror-specialpage-cantexecute' );
                }
@@ -93,9 +122,12 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
 
                        $title = Title::makeTitle( $row->namespace, $row->title );
                        if ( is_null( $resultPageSet ) ) {
-                               $data = [ 'value' => $row->value ];
-                               if ( $qp->usesTimestamps() ) {
-                                       $data['timestamp'] = wfTimestamp( TS_ISO_8601, $row->value );
+                               $data = [];
+                               if ( isset( $row->value ) ) {
+                                       $data['value'] = $row->value;
+                                       if ( $qp->usesTimestamps() ) {
+                                               $data['timestamp'] = wfTimestamp( TS_ISO_8601, $row->value );
+                                       }
                                }
                                self::addTitleInfo( $data, $title );
 
@@ -125,8 +157,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
        }
 
        public function getCacheMode( $params ) {
-               /** @var QueryPage $qp */
-               $qp = new $this->qpMap[$params['page']]();
+               $qp = $this->getSpecialPage( $params['page'] );
                if ( $qp->getRestriction() != '' ) {
                        return 'private';
                }
@@ -137,7 +168,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
        public function getAllowedParams() {
                return [
                        'page' => [
-                               ApiBase::PARAM_TYPE => array_keys( $this->qpMap ),
+                               ApiBase::PARAM_TYPE => $this->queryPages,
                                ApiBase::PARAM_REQUIRED => true
                        ],
                        'offset' => [