Merge "Remove unused $wgDebugDBTransactions"
[lhc/web/wiklou.git] / includes / actions / HistoryAction.php
index 9efe953..dbc1ac0 100644 (file)
@@ -23,10 +23,6 @@ class HistoryAction extends FormlessAction {
                return 'history';
        }
 
-       public function getRestriction() {
-               return null;
-       }
-
        public function requiresWrite() {
                return false;
        }
@@ -73,7 +69,6 @@ class HistoryAction extends FormlessAction {
 
        /**
         * Print the history page for an article.
-        * @return nothing
         */
        function onView() {
                global $wgScript, $wgUseFileCache, $wgSquidMaxage;
@@ -111,12 +106,13 @@ class HistoryAction extends FormlessAction {
                // Handle atom/RSS feeds.
                $feedType = $request->getVal( 'feed' );
                if ( $feedType ) {
+                       $this->feed( $feedType );
                        wfProfileOut( __METHOD__ );
-                       return $this->feed( $feedType );
+                       return;
                }
 
                // Fail nicely if article doesn't exist.
-               if ( !$this->getTitle()->exists() ) {
+               if ( !$this->page->exists() ) {
                        $out->addWikiMsg( 'nohistory' );
                        # show deletion/move log if there is an entry
                        LogEventsList::showLogExtract(
@@ -171,7 +167,7 @@ class HistoryAction extends FormlessAction {
                        '</fieldset></form>'
                );
 
-               wfRunHooks( 'PageHistoryBeforeList', array( &$this->article ) );
+               wfRunHooks( 'PageHistoryBeforeList', array( &$this->page ) );
 
                // Create and output the list.
                $pager = new HistoryPager( $this, $year, $month, $tagFilter, $conds );
@@ -210,7 +206,7 @@ class HistoryAction extends FormlessAction {
                        $offsets = array();
                }
 
-               $page_id = $this->getTitle()->getArticleID();
+               $page_id = $this->page->getId();
 
                return $dbr->select( 'revision',
                        Revision::selectFields(),
@@ -320,6 +316,10 @@ class HistoryPager extends ReverseChronologicalPager {
        public $lastRow = false, $counter, $historyPage, $buttons, $conds;
        protected $oldIdChecked;
        protected $preventClickjacking = false;
+       /**
+        * @var array
+        */
+       protected $parentLens;
 
        function __construct( $historyPage, $year = '', $month = '', $tagFilter = '', $conds = array() ) {
                parent::__construct( $historyPage->getContext() );
@@ -347,7 +347,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        'tables'  => array( 'revision', 'user' ),
                        'fields'  => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
                        'conds'   => array_merge(
-                               array( 'rev_page' => $this->getTitle()->getArticleID() ),
+                               array( 'rev_page' => $this->getWikiPage()->getId() ),
                                $this->conds ),
                        'options' => array( 'USE INDEX' => array( 'revision' => 'page_timestamp' ) ),
                        'join_conds' => array(
@@ -385,22 +385,50 @@ class HistoryPager extends ReverseChronologicalPager {
        }
 
        function doBatchLookups() {
-               # No results? Nothing to batch
-               if ( !$this->mResult->numRows() ) {
-                       return;
-               }
-
                # Do a link batch query
                $this->mResult->seek( 0 );
                $batch = new LinkBatch();
+               $revIds = array();
                foreach ( $this->mResult as $row ) {
-                       $batch->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) );
-                       $batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) );
+                       if( $row->rev_parent_id ) {
+                               $revIds[] = $row->rev_parent_id;
+                       }
+                       if( !is_null( $row->user_name ) ) {
+                               $batch->add( NS_USER, $row->user_name );
+                               $batch->add( NS_USER_TALK, $row->user_name );
+                       } else { # for anons or usernames of imported revisions
+                               $batch->add( NS_USER, $row->rev_user_text );
+                               $batch->add( NS_USER_TALK, $row->rev_user_text );
+                       }
                }
+               $this->parentLens = $this->getParentLengths( $revIds );
                $batch->execute();
                $this->mResult->seek( 0 );
        }
 
+       /**
+        * Do a batched query to get the parent revision lengths
+        * @param $revIds array
+        * @return array
+        * @TODO: stolen from Contributions, refactor
+        */
+       private function getParentLengths( array $revIds ) {
+               $revLens = array();
+               if ( !$revIds ) {
+                       return $revLens; // empty
+               }
+               wfProfileIn( __METHOD__ );
+               $res = $this->mDb->select( 'revision',
+                       array( 'rev_id', 'rev_len' ),
+                       array( 'rev_id' => $revIds ),
+                       __METHOD__ );
+               foreach ( $res as $row ) {
+                       $revLens[$row->rev_id] = $row->rev_len;
+               }
+               wfProfileOut( __METHOD__ );
+               return $revLens;
+       }
+
        /**
         * Creates begin of history list with a submit button
         *
@@ -418,20 +446,20 @@ class HistoryPager extends ReverseChronologicalPager {
                $s .= Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) . "\n";
                $s .= Html::hidden( 'action', 'historysubmit' ) . "\n";
 
-               $s .= '<div>' . $this->submitButton( $this->msg( 'compareselectedversions' )->text(),
-                       array( 'class' => 'historysubmit' ) ) . "\n";
-
+               // Button container stored in $this->buttons for re-use in getEndBody()
                $this->buttons = '<div>';
                $this->buttons .= $this->submitButton( $this->msg( 'compareselectedversions' )->text(),
-                       array( 'class' => 'historysubmit' )
+                       array( 'class' => 'historysubmit mw-history-compareselectedversions-button' )
                                + Linker::tooltipAndAccesskeyAttribs( 'compareselectedversions' )
                ) . "\n";
 
                if ( $this->getUser()->isAllowed( 'deleterevision' ) ) {
-                       $s .= $this->getRevisionButton( 'revisiondelete', 'showhideselectedversions' );
+                       $this->buttons .= $this->getRevisionButton( 'revisiondelete', 'showhideselectedversions' );
                }
                $this->buttons .= '</div>';
-               $s .= '</div><ul id="pagehistory">' . "\n";
+
+               $s .= $this->buttons;
+               $s .= '<ul id="pagehistory">' . "\n";
                return $s;
        }
 
@@ -443,11 +471,10 @@ class HistoryPager extends ReverseChronologicalPager {
                                'type' => 'submit',
                                'name' => $name,
                                'value' => '1',
-                               'class' => "mw-history-$name-button",
+                               'class' => "historysubmit mw-history-$name-button",
                        ),
                        $this->msg( $msg )->text()
                ) . "\n";
-               $this->buttons .= $element;
                return $element;
        }
 
@@ -528,7 +555,7 @@ class HistoryPager extends ReverseChronologicalPager {
                $histLinks = Html::rawElement(
                                'span',
                                array( 'class' => 'mw-history-histlinks' ),
-                               '(' . $curlink . $this->historyPage->message['pipe-separator'] . $lastlink . ') '
+                               $this->msg( 'parentheses' )->rawParams( $curlink . $this->historyPage->message['pipe-separator'] . $lastlink )->escaped()
                );
                $s = $histLinks . $diffButtons;
 
@@ -565,7 +592,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        $s .= " $del ";
                }
 
-               $lang = $this->getLang();
+               $lang = $this->getLanguage();
                $dirmark = $lang->getDirMark();
 
                $s .= " $link";
@@ -578,13 +605,13 @@ class HistoryPager extends ReverseChronologicalPager {
                        $s .= ' ' . ChangesList::flag( 'minor' );
                }
 
-               if ( $prevRev
-                       && !$prevRev->isDeleted( Revision::DELETED_TEXT )
-                       && !$rev->isDeleted( Revision::DELETED_TEXT ) )
-               {
-                       $sDiff = ChangesList::showCharacterDifference( $prevRev->getSize(), $rev->getSize() );
-                       $s .= ' . . ' . $sDiff . ' . . ';
-               }
+               # Size is always public data
+               $prevSize = isset( $this->parentLens[$row->rev_parent_id] )
+                       ? $this->parentLens[$row->rev_parent_id]
+                       : 0;
+               $sDiff = ChangesList::showCharacterDifference( $prevSize, $rev->getSize() );
+               $fSize = Linker::formatRevisionSize($rev->getSize());
+               $s .= " . . $fSize $sDiff . . ";
 
                $s .= Linker::revComment( $rev, false, true );
 
@@ -626,7 +653,7 @@ class HistoryPager extends ReverseChronologicalPager {
                }
 
                if ( $tools ) {
-                       $s .= ' (' . $lang->pipeList( $tools ) . ')';
+                       $s .= ' '. $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
                }
 
                # Tags
@@ -651,7 +678,7 @@ class HistoryPager extends ReverseChronologicalPager {
         * @return String
         */
        function revLink( $rev ) {
-               $date = $this->getLang()->userTimeAndDate( $rev->getTimestamp(), $this->getUser() );
+               $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $this->getUser() );
                $date = htmlspecialchars( $date );
                if ( $rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
                        $link = Linker::linkKnown(
@@ -686,7 +713,7 @@ class HistoryPager extends ReverseChronologicalPager {
                                $cur,
                                array(),
                                array(
-                                       'diff' => $this->getTitle()->getLatestRevID(),
+                                       'diff' => $this->getWikiPage()->getLatest(),
                                        'oldid' => $rev->getId()
                                )
                        );
@@ -792,6 +819,7 @@ class HistoryPager extends ReverseChronologicalPager {
 
        /**
         * Get the "prevent clickjacking" flag
+        * @return bool
         */
        function getPreventClickjacking() {
                return $this->preventClickjacking;