Merge "Parser: Make makeKnownLinkHolder() protected, and remove $query handling"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 26 May 2016 23:04:53 +0000 (23:04 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 26 May 2016 23:04:53 +0000 (23:04 +0000)
includes/Linker.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/linker/LinkRenderer.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.php

index c0d9358..71cb4e4 100644 (file)
@@ -138,22 +138,30 @@ class Linker {
         * Return the CSS colour of a known link
         *
         * @since 1.16.3
-        * @param Title $t
+        * @param LinkTarget $t
         * @param int $threshold User defined threshold
         * @return string CSS class
         */
-       public static function getLinkColour( $t, $threshold ) {
-               $colour = '';
-               if ( $t->isRedirect() ) {
+       public static function getLinkColour( LinkTarget $t, $threshold ) {
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+               // Make sure the target is in the cache
+               $id = $linkCache->addLinkObj( $t );
+               if ( $id == 0 ) {
+                       // Doesn't exist
+                       return '';
+               }
+
+               if ( $linkCache->getGoodLinkFieldObj( $t, 'redirect' ) ) {
                        # Page is a redirect
-                       $colour = 'mw-redirect';
-               } elseif ( $threshold > 0 && $t->isContentPage() &&
-                       $t->exists() && $t->getLength() < $threshold
+                       return 'mw-redirect';
+               } elseif ( $threshold > 0 && MWNamespace::isContent( $t->getNamespace() )
+                       && $linkCache->getGoodLinkFieldObj( $t, 'length' ) < $threshold
                ) {
                        # Page is a stub
-                       $colour = 'stub';
+                       return 'stub';
                }
-               return $colour;
+
+               return '';
        }
 
        /**
index a7dd570..04d2524 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Cache
  */
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class representing a list of titles
@@ -116,7 +117,7 @@ class LinkBatch {
         * @return array Mapping PDBK to ID
         */
        public function execute() {
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
 
                return $this->executeInto( $linkCache );
        }
@@ -151,23 +152,26 @@ class LinkBatch {
                        return [];
                }
 
+               $titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
                // For each returned entry, add it to the list of good links, and remove it from $remaining
 
                $ids = [];
                $remaining = $this->data;
                foreach ( $res as $row ) {
-                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                       $title = new TitleValue( (int)$row->page_namespace, $row->page_title );
                        $cache->addGoodLinkObjFromRow( $title, $row );
-                       $ids[$title->getPrefixedDBkey()] = $row->page_id;
+                       $pdbk = $titleFormatter->getPrefixedDBkey( $title );
+                       $ids[$pdbk] = $row->page_id;
                        unset( $remaining[$row->page_namespace][$row->page_title] );
                }
 
                // The remaining links in $data are bad links, register them as such
                foreach ( $remaining as $ns => $dbkeys ) {
                        foreach ( $dbkeys as $dbkey => $unused ) {
-                               $title = Title::makeTitle( $ns, $dbkey );
+                               $title = new TitleValue( (int)$ns, $dbkey );
                                $cache->addBadLinkObj( $title );
-                               $ids[$title->getPrefixedDBkey()] = 0;
+                               $pdbk = $titleFormatter->getPrefixedDBkey( $title );
+                               $ids[$pdbk] = 0;
                        }
                }
 
@@ -218,7 +222,7 @@ class LinkBatch {
                        return false;
                }
 
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $genderCache->doLinkBatch( $this->data, $this->caller );
 
                return true;
index de44f9b..3fd29f3 100644 (file)
@@ -230,7 +230,9 @@ class LinkCache {
         */
        public function addLinkObj( LinkTarget $nt ) {
                $key = $this->titleFormatter->getPrefixedDBkey( $nt );
-               if ( $this->isBadLink( $key ) || $nt->isExternal() ) {
+               if ( $this->isBadLink( $key ) || $nt->isExternal()
+                       || $nt->inNamespace( NS_SPECIAL )
+               ) {
                        return 0;
                }
                $id = $this->getGoodLinkID( $key );
index b938ff0..9948040 100644 (file)
@@ -21,6 +21,8 @@
  *
  * @file
  */
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 class ChangesList extends ContextSource {
        /**
@@ -39,6 +41,11 @@ class ChangesList extends ContextSource {
        /** @var BagOStuff */
        protected $watchMsgCache;
 
+       /**
+        * @var LinkRenderer
+        */
+       protected $linkRenderer;
+
        /**
         * Changeslist constructor
         *
@@ -54,6 +61,7 @@ class ChangesList extends ContextSource {
                }
                $this->preCacheMessages();
                $this->watchMsgCache = new HashBagOStuff( [ 'maxKeys' => 50 ] );
+               $this->linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
        }
 
        /**
@@ -337,8 +345,10 @@ class ChangesList extends ContextSource {
         */
        public function insertLog( &$s, $title, $logtype ) {
                $page = new LogPage( $logtype );
-               $logname = $page->getName()->setContext( $this->getContext() )->escaped();
-               $s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped();
+               $logname = $page->getName()->setContext( $this->getContext() )->text();
+               $s .= $this->msg( 'parentheses' )->rawParams(
+                       $this->linkRenderer->makeKnownLink( $title, $logname )
+               )->escaped();
        }
 
        /**
@@ -363,9 +373,9 @@ class ChangesList extends ContextSource {
                                'oldid' => $rc->mAttribs['rc_last_oldid']
                        ];
 
-                       $diffLink = Linker::linkKnown(
+                       $diffLink = $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
-                               $this->message['diff'],
+                               new HtmlArmor( $this->message['diff'] ),
                                [],
                                $query
                        );
@@ -375,9 +385,9 @@ class ChangesList extends ContextSource {
                } else {
                        $diffhist = $diffLink . $this->message['pipe-separator'];
                        # History link
-                       $diffhist .= Linker::linkKnown(
+                       $diffhist .= $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
-                               $this->message['hist'],
+                               new HtmlArmor( $this->message['hist'] ),
                                [],
                                [
                                        'curid' => $rc->mAttribs['rc_cur_id'],
@@ -415,7 +425,7 @@ class ChangesList extends ContextSource {
                        $params = [ 'redirect' => 'no' ];
                }
 
-               $articlelink = Linker::link(
+               $articlelink = $this->linkRenderer->makeLink(
                        $rc->getTitle(),
                        null,
                        [ 'class' => 'mw-changeslist-title' ],
index 1070877..099a295 100644 (file)
@@ -54,7 +54,8 @@ class EnhancedChangesList extends ChangesList {
                // message is set by the parent ChangesList class
                $this->cacheEntryFactory = new RCCacheEntryFactory(
                        $context,
-                       $this->message
+                       $this->message,
+                       $this->linkRenderer
                );
        }
 
@@ -390,9 +391,9 @@ class EnhancedChangesList extends ChangesList {
                } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
                        $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
                } else {
-                       $link = Linker::linkKnown(
+                       $link = $this->linkRenderer->makeKnownLink(
                                $rcObj->getTitle(),
-                               $rcObj->timestamp,
+                               new HtmlArmor( $rcObj->timestamp ),
                                [],
                                $params
                        );
@@ -524,26 +525,24 @@ class EnhancedChangesList extends ChangesList {
                        ) {
                                $links['total-changes'] = $nchanges[$n];
                        } else {
-                               $links['total-changes'] = Linker::link(
+                               $links['total-changes'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
-                                       $nchanges[$n],
+                                       new HtmlArmor( $nchanges[$n] ),
                                        [],
                                        $queryParams + [
                                                'diff' => $currentRevision,
                                                'oldid' => $last->mAttribs['rc_last_oldid'],
-                                       ],
-                                       [ 'known', 'noclasses' ]
+                                       ]
                                );
                                if ( $sinceLast > 0 && $sinceLast < $n ) {
-                                       $links['total-changes-since-last'] = Linker::link(
+                                       $links['total-changes-since-last'] = $this->linkRenderer->makeKnownLink(
                                                        $block0->getTitle(),
-                                                       $sinceLastVisitMsg[$sinceLast],
+                                                       new HtmlArmor( $sinceLastVisitMsg[$sinceLast] ),
                                                        [],
                                                        $queryParams + [
                                                                'diff' => $currentRevision,
                                                                'oldid' => $unvisitedOldid,
-                                                       ],
-                                                       [ 'known', 'noclasses' ]
+                                                       ]
                                                );
                                }
                        }
@@ -558,9 +557,9 @@ class EnhancedChangesList extends ChangesList {
                        $params = $queryParams;
                        $params['action'] = 'history';
 
-                       $links['history'] = Linker::linkKnown(
+                       $links['history'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
-                                       $this->message['enhancedrc-history'],
+                                       new HtmlArmor( $this->message['enhancedrc-history'] ),
                                        [],
                                        $params
                                );
@@ -618,9 +617,11 @@ class EnhancedChangesList extends ChangesList {
                if ( $logType ) {
                        $logPage = new LogPage( $logType );
                        $logTitle = SpecialPage::getTitleFor( 'Log', $logType );
-                       $logName = $logPage->getName()->escaped();
+                       $logName = $logPage->getName()->text();
                        $data['logLink'] = $this->msg( 'parentheses' )
-                               ->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped();
+                               ->rawParams(
+                                       $this->linkRenderer->makeKnownLink( $logTitle, $logName )
+                               )->escaped();
                } else {
                        $data['articleLink'] = $this->getArticleLink( $rcObj, $rcObj->unpatrolled, $rcObj->watched );
                }
@@ -710,9 +711,10 @@ class EnhancedChangesList extends ChangesList {
                }
 
                $retVal = ' ' . $this->msg( 'parentheses' )
-                               ->rawParams( $rc->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
+                               ->rawParams( $rc->difflink . $this->message['pipe-separator']
+                                       . $this->linkRenderer->makeKnownLink(
                                                $pageTitle,
-                                               $this->message['hist'],
+                                               new HtmlArmor( $this->message['hist'] ),
                                                [],
                                                $query
                                        ) )->escaped();
index 549bc37..2c5c8b1 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use MediaWiki\Linker\LinkRenderer;
 
 class RCCacheEntryFactory {
 
@@ -28,13 +29,22 @@ class RCCacheEntryFactory {
        /* @var string[] */
        private $messages;
 
+       /**
+        * @var LinkRenderer
+        */
+       private $linkRenderer;
+
        /**
         * @param IContextSource $context
         * @param string[] $messages
+        * @param LinkRenderer $linkRenderer
         */
-       public function __construct( IContextSource $context, $messages ) {
+       public function __construct(
+               IContextSource $context, $messages, LinkRenderer $linkRenderer
+       ) {
                $this->context = $context;
                $this->messages = $messages;
+               $this->linkRenderer = $linkRenderer;
        }
 
        /**
@@ -99,7 +109,7 @@ class RCCacheEntryFactory {
 
                // New unpatrolled pages
                if ( $cacheEntry->unpatrolled && $type == RC_NEW ) {
-                       $clink = Linker::linkKnown( $cacheEntry->getTitle() );
+                       $clink = $this->linkRenderer->makeKnownLink( $cacheEntry->getTitle() );
                // Log entries
                } elseif ( $type == RC_LOG ) {
                        $logType = $cacheEntry->mAttribs['rc_log_type'];
@@ -108,7 +118,7 @@ class RCCacheEntryFactory {
                                $clink = $this->getLogLink( $logType );
                        } else {
                                wfDebugLog( 'recentchanges', 'Unexpected log entry with no log type in recent changes' );
-                               $clink = Linker::link( $cacheEntry->getTitle() );
+                               $clink = $this->linkRenderer->makeLink( $cacheEntry->getTitle() );
                        }
                // Log entries (old format) and special pages
                } elseif ( $cacheEntry->mAttribs['rc_namespace'] == NS_SPECIAL ) {
@@ -116,7 +126,7 @@ class RCCacheEntryFactory {
                        $clink = '';
                // Edits
                } else {
-                       $clink = Linker::linkKnown( $cacheEntry->getTitle() );
+                       $clink = $this->linkRenderer->makeKnownLink( $cacheEntry->getTitle() );
                }
 
                return $clink;
@@ -125,10 +135,12 @@ class RCCacheEntryFactory {
        private function getLogLink( $logType ) {
                $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
                $logpage = new LogPage( $logType );
-               $logname = $logpage->getName()->escaped();
+               $logname = $logpage->getName()->text();
 
                $logLink = $this->context->msg( 'parentheses' )
-                       ->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
+                       ->rawParams(
+                               $this->linkRenderer->makeKnownLink( $logtitle, $logname )
+                       )->escaped();
 
                return $logLink;
        }
@@ -242,9 +254,9 @@ class RCCacheEntryFactory {
                if ( !$showDiffLinks || !$lastOldid || in_array( $type, $logTypes ) ) {
                        $lastLink = $lastMessage;
                } else {
-                       $lastLink = Linker::linkKnown(
+                       $lastLink = $this->linkRenderer->makeKnownLink(
                                $cacheEntry->getTitle(),
-                               $lastMessage,
+                               new HtmlArmor( $lastMessage ),
                                [],
                                $this->buildDiffQueryParams( $cacheEntry )
                        );
index 1237907..432dcb2 100644 (file)
@@ -276,8 +276,7 @@ class LinkRenderer {
                if ( $target->isExternal() ) {
                        $classes[] = 'extiw';
                }
-               $title = Title::newFromLinkTarget( $target );
-               $colour = Linker::getLinkColour( $title, $this->stubThreshold );
+               $colour = Linker::getLinkColour( $target, $this->stubThreshold );
                if ( $colour !== '' ) {
                        $classes[] = $colour;
                }
index 6215ba1..0dc12c7 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Database
  */
@@ -420,4 +422,53 @@ class LinkerTest extends MediaWikiLangTestCase {
                $out = Linker::link( $title );
                $this->assertEquals( $expected, $out );
        }
+
+       /**
+        * @covers Linker::getLinkColour
+        */
+       public function testGetLinkColour() {
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+               $foobarTitle = Title::makeTitle( NS_MAIN, 'FooBar' );
+               $redirectTitle = Title::makeTitle( NS_MAIN, 'Redirect' );
+               $userTitle = Title::makeTitle( NS_USER, 'Someuser' );
+               $linkCache->addGoodLinkObj(
+                       1, // id
+                       $foobarTitle,
+                       10, // len
+                       0 // redir
+               );
+               $linkCache->addGoodLinkObj(
+                       2, // id
+                       $redirectTitle,
+                       10, // len
+                       1 // redir
+               );
+
+               $linkCache->addGoodLinkObj(
+                       3, // id
+                       $userTitle,
+                       10, // len
+                       0 // redir
+               );
+
+               $this->assertEquals(
+                       '',
+                       Linker::getLinkColour( $foobarTitle, 0 )
+               );
+
+               $this->assertEquals(
+                       'stub',
+                       Linker::getLinkColour( $foobarTitle, 20 )
+               );
+
+               $this->assertEquals(
+                       'mw-redirect',
+                       Linker::getLinkColour( $redirectTitle, 0 )
+               );
+
+               $this->assertEquals(
+                       '',
+                       Linker::getLinkColour( $userTitle, 20 )
+               );
+       }
 }
index 9debc03..16f210b 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
+
 /**
  * @covers RCCacheEntryFactory
  *
@@ -14,6 +17,11 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
         */
        private $testRecentChangesHelper;
 
+       /**
+        * @var LinkRenderer;
+        */
+       private $linkRenderer;
+
        public function __construct( $name = null, array $data = [], $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
@@ -26,6 +34,10 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                $this->setMwGlobals( [
                        'wgArticlePath' => '/wiki/$1'
                ] );
+
+               $this->linkRenderer = new LinkRenderer(
+                       MediaWikiServices::getInstance()->getTitleFormatter()
+               );
        }
 
        public function testNewFromRecentChange() {
@@ -40,7 +52,11 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                        0, // counter
                        0 // number of watching users
                );
-               $cacheEntryFactory = new RCCacheEntryFactory( $this->getContext(), $this->getMessages() );
+               $cacheEntryFactory = new RCCacheEntryFactory(
+                       $this->getContext(),
+                       $this->getMessages(),
+                       $this->linkRenderer
+               );
                $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
                $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
@@ -78,7 +94,11 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                        0, // counter
                        0 // number of watching users
                );
-               $cacheEntryFactory = new RCCacheEntryFactory( $this->getContext(), $this->getMessages() );
+               $cacheEntryFactory = new RCCacheEntryFactory(
+                       $this->getContext(),
+                       $this->getMessages(),
+                       $this->linkRenderer
+               );
                $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
                $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
@@ -108,7 +128,11 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                        0, // counter
                        0 // number of watching users
                );
-               $cacheEntryFactory = new RCCacheEntryFactory( $this->getContext(), $this->getMessages() );
+               $cacheEntryFactory = new RCCacheEntryFactory(
+                       $this->getContext(),
+                       $this->getMessages(),
+                       $this->linkRenderer
+               );
                $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
                $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
index faa1dcc..cac3d43 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Helper for generating test recent changes entries.
@@ -100,7 +102,10 @@ class TestRecentChangesHelper {
        public function getCacheEntry( $recentChange ) {
                $rcCacheFactory = new RCCacheEntryFactory(
                        new RequestContext(),
-                       [ 'diff' => 'diff', 'cur' => 'cur', 'last' => 'last' ]
+                       [ 'diff' => 'diff', 'cur' => 'cur', 'last' => 'last' ],
+                       new LinkRenderer(
+                               MediaWikiServices::getInstance()->getTitleFormatter()
+                       )
                );
                return $rcCacheFactory->newFromRecentChange( $recentChange, false );
        }