and -> && in r77366
[lhc/web/wiklou.git] / includes / Article.php
index 8ecc52b..7a99bef 100644 (file)
@@ -321,9 +321,13 @@ class Article {
         * @return mixed string on success, false on failure
         */
        public function getUndoText( Revision $undo, Revision $undoafter = null ) {
+               $currentRev = Revision::newFromTitle( $this->mTitle );
+               if ( !$currentRev ) {
+                       return false; // no page
+               }
                $undo_text = $undo->getText();
                $undoafter_text = $undoafter->getText();
-               $cur_text = $this->getContent();
+               $cur_text = $currentRev->getText();
 
                if ( $cur_text == $undo_text ) {
                        # No use doing a merge if it's just a straight revert.
@@ -849,7 +853,7 @@ class Article {
                                $wgOut->setETag( $parserCache->getETag( $this, $parserOptions ) );
                        }
 
-                       # Is is client cached?
+                       # Is it client cached?
                        if ( $wgOut->checkLastModified( $this->getTouched() ) ) {
                                wfDebug( __METHOD__ . ": done 304\n" );
                                wfProfileOut( __METHOD__ );
@@ -962,13 +966,11 @@ class Article {
                                                if ( $oldid === $this->getLatest() && $this->useParserCache( false ) ) {
                                                        $this->mParserOutput = $parserCache->get( $this, $parserOptions );
                                                        if ( $this->mParserOutput ) {
-                                                               wfDebug( __METHOD__ . ": showing parser cache for current rev permalink\n" );
+                                                               wfDebug( __METHOD__ . ": showing parser cache for current rev permalink\n" );                                                           
                                                                $wgOut->addParserOutput( $this->mParserOutput );
                                                                $wgOut->setRevisionId( $this->mLatest );
-                                                               $this->showViewFooter();
-                                                               $this->viewUpdates();
-                                                               wfProfileOut( __METHOD__ );
-                                                               return;
+                                                               $outputDone = true;
+                                                               break;                                                          
                                                        }
                                                }
                                        }
@@ -982,15 +984,18 @@ class Article {
                                                wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
                                                $this->showCssOrJsPage();
                                                $outputDone = true;
-                                       } else if ( $rt = Title::newFromRedirectArray( $text ) ) {
-                                               wfDebug( __METHOD__ . ": showing redirect=no page\n" );
-                                               # Viewing a redirect page (e.g. with parameter redirect=no)
-                                               # Don't append the subtitle if this was an old revision
-                                               $wgOut->addHTML( $this->viewRedirect( $rt, !$wasRedirected && $this->isCurrent() ) );
-                                               # Parse just to get categories, displaytitle, etc.
-                                               $this->mParserOutput = $wgParser->parse( $text, $this->mTitle, $parserOptions );
-                                               $wgOut->addParserOutputNoText( $this->mParserOutput );
-                                               $outputDone = true;
+                                       } else {
+                                               $rt = Title::newFromRedirectArray( $text );
+                                               if ( $rt ) {
+                                                       wfDebug( __METHOD__ . ": showing redirect=no page\n" );
+                                                       # Viewing a redirect page (e.g. with parameter redirect=no)
+                                                       # Don't append the subtitle if this was an old revision
+                                                       $wgOut->addHTML( $this->viewRedirect( $rt, !$wasRedirected && $this->isCurrent() ) );
+                                                       # Parse just to get categories, displaytitle, etc.
+                                                       $this->mParserOutput = $wgParser->parse( $text, $this->mTitle, $parserOptions );
+                                                       $wgOut->addParserOutputNoText( $this->mParserOutput );
+                                                       $outputDone = true;
+                                               }
                                        }
                                        break;
                                case 4:
@@ -999,13 +1004,10 @@ class Article {
 
                                        $this->checkTouched();
                                        $key = $parserCache->getKey( $this, $parserOptions );
-                                       $poolCounter = PoolCounter::factory( 'Article::view', $key );
-                                       $dirtyCallback = $useParserCache ? array( $this, 'tryDirtyCache' ) : false;
-                                       $status = $poolCounter->executeProtected( array( $this, 'doViewParse' ), $dirtyCallback );
-
-                                       if ( !$status->isOK() ) {
+                                       $poolArticleView = new PoolWorkArticleView( $this, $key, $useParserCache, $parserOptions );
+                                       
+                                       if ( !$poolArticleView->execute() ) {
                                                # Connection or timeout error
-                                               $this->showPoolError( $status );
                                                wfProfileOut( __METHOD__ );
                                                return;
                                        } else {
@@ -1309,7 +1311,7 @@ class Article {
                }
 
                $sk = $wgUser->getSkin();
-               $token = $wgUser->editToken();
+               $token = $wgUser->editToken( $rcid );
 
                $wgOut->addHTML(
                        "<div class='patrollink'>" .
@@ -1471,7 +1473,6 @@ class Article {
                global $wgOut;
 
                $oldid = $this->getOldID();
-               $useParserCache = $this->useParserCache( $oldid );
                $parserOptions = $this->getParserOptions();
 
                # Render printable version, use printable version cache
@@ -1484,6 +1485,8 @@ class Article {
                
                $useParserCache = $this->useParserCache( $oldid );
                $this->outputWikiText( $this->getContent(), $useParserCache, $parserOptions );
+               
+               return true;
        }
 
        /**
@@ -1523,23 +1526,6 @@ class Article {
                }
        }
 
-       /**
-        * Show an error page for an error from the pool counter.
-        * @param $status Status
-        */
-       public function showPoolError( $status ) {
-               global $wgOut;
-
-               $wgOut->clearHTML(); // for release() errors
-               $wgOut->enableClientCache( false );
-               $wgOut->setRobotPolicy( 'noindex,nofollow' );
-               $wgOut->addWikiText(
-                       '<div class="errorbox">' .
-                       $status->getWikiText( false, 'view-pool-error' ) .
-                       '</div>'
-               );
-       }
-
        /**
         * View redirect
         *
@@ -1585,8 +1571,9 @@ class Article {
                }
 
                $imageUrl = $wgStylePath . '/common/images/redirect' . $imageDir . '.png';              
-               return Html::element( 'img', array( 'src' => $imageUrl, 'alt' => '#REDIRECT' ) ) .
-                       '<span class="redirectText">' . $link . '</span>';
+               return '<div class="redirectMsg">' .
+                       Html::element( 'img', array( 'src' => $imageUrl, 'alt' => '#REDIRECT' ) ) .
+                       '<span class="redirectText">' . $link . '</span></div>';
        }
 
        /**
@@ -1606,7 +1593,7 @@ class Article {
                }
 
                $tbtext = "";
-               while ( $o = $dbr->fetchObject( $tbs ) ) {
+               foreach ( $tbs as $o ) {
                        $rmvtxt = "";
 
                        if ( $wgUser->isAllowed( 'trackback' ) ) {
@@ -1772,7 +1759,7 @@ class Article {
        /**
         * Update the page record to point to a newly saved revision.
         *
-        * @param $dbw Database object
+        * @param $dbw DatabaseBase: object
         * @param $revision Revision: For ID number, and text used to set
                            length and redirect status fields
         * @param $lastRevision Integer: if given, will not overwrite the page field
@@ -2141,8 +2128,6 @@ class Article {
                                $userAbort = ignore_user_abort( true );
                        }
 
-                       $revisionId = 0;
-
                        $changed = ( strcmp( $text, $oldtext ) != 0 );
 
                        if ( $changed ) {
@@ -2364,7 +2349,7 @@ class Article {
                # If we haven't been given an rc_id value, we can't do anything
                $rcid = (int) $wgRequest->getVal( 'rcid' );
 
-               if ( !$wgUser->matchEditToken( $wgRequest->getVal( 'token' ) ) ) {
+               if ( !$wgUser->matchEditToken( $wgRequest->getVal( 'token' ), $rcid ) ) {
                        $wgOut->showErrorPage( 'sessionfailure-title', 'sessionfailure' );
                        return;
                }
@@ -2623,7 +2608,7 @@ class Article {
                                $protect_description = '';
                                foreach ( $limit as $action => $restrictions ) {
                                        if ( !isset( $expiry[$action] ) )
-                                               $expiry[$action] = 'infinite';
+                                               $expiry[$action] = Block::infinity();
 
                                        $encodedExpiry[$action] = Block::encodeExpiry( $expiry[$action], $dbw );
                                        if ( $restrictions != '' ) {
@@ -3008,7 +2993,7 @@ class Article {
 
                $authors = array( $row->rev_user_text );
 
-               while ( $row = $db->fetchObject( $res ) ) {
+               foreach ( $res as $row ) {
                        $authors[] = $row->rev_user_text;
                }
 
@@ -3099,7 +3084,7 @@ class Article {
                        </tr>" .
                        Xml::closeElement( 'table' ) .
                        Xml::closeElement( 'fieldset' ) .
-                       Xml::hidden( 'wpEditToken', $wgUser->editToken() ) .
+                       Html::hidden( 'wpEditToken', $wgUser->editToken() ) .
                        Xml::closeElement( 'form' );
 
                        if ( $wgUser->isAllowed( 'editinterface' ) ) {
@@ -3127,7 +3112,7 @@ class Article {
        public function doDelete( $reason, $suppress = false ) {
                global $wgOut, $wgUser;
 
-               $id = $this->mTitle->getArticleID( GAID_FOR_UPDATE );
+               $id = $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
 
                $error = '';
                if ( wfRunHooks( 'ArticleDelete', array( &$this, &$wgUser, &$reason, &$error ) ) ) {
@@ -3186,9 +3171,8 @@ class Article {
                wfDebug( __METHOD__ . "\n" );
 
                $dbw = wfGetDB( DB_MASTER );
-               $ns = $this->mTitle->getNamespace();
                $t = $this->mTitle->getDBkey();
-               $id = $id ? $id : $this->mTitle->getArticleID( GAID_FOR_UPDATE );
+               $id = $id ? $id : $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
 
                if ( $t === '' || $id == 0 ) {
                        return false;
@@ -3626,12 +3610,12 @@ class Article {
         * Every 100th edit, prune the recent changes table.
         *
         * @private
-        * @param $text New text of the article
-        * @param $summary Edit summary
-        * @param $minoredit Minor edit
+        * @param $text String: New text of the article
+        * @param $summary String: Edit summary
+        * @param $minoredit Boolean: Minor edit
         * @param $timestamp_of_pagechange Timestamp associated with the page change
-        * @param $newid rev_id value of the new revision
-        * @param $changed Whether or not the content actually changed
+        * @param $newid Integer: rev_id value of the new revision
+        * @param $changed Boolean: Whether or not the content actually changed
         */
        public function editUpdates( $text, $summary, $minoredit, $timestamp_of_pagechange, $newid, $changed = true ) {
                global $wgDeferredUpdateList, $wgMessageCache, $wgUser, $wgEnableParserCache;
@@ -4472,7 +4456,6 @@ class Article {
         *
         * @param $parserOutput mixed ParserOptions object, or boolean false
         **/
-
        protected function doCascadeProtectionUpdates( $parserOutput ) {
                if ( !$this->isCurrent() || wfReadOnly() || !$this->mTitle->areRestrictionsCascading() ) {
                        return;
@@ -4510,7 +4493,6 @@ class Article {
                }
 
                # Get the diff
-               # Note that we simulate array_diff_key in PHP <5.0.x
                $templates_diff = array_diff_key( $poTemplates, $tlTemplates );
 
                if ( count( $templates_diff ) > 0 ) {
@@ -4635,3 +4617,52 @@ class Article {
        }
 
 }
+
+class PoolWorkArticleView extends PoolCounterWork {
+       private $mArticle;
+       
+       function __construct( $article, $key, $useParserCache, $parserOptions ) {
+               parent::__construct( 'ArticleView', $key );
+               $this->mArticle = $article;
+               $this->cacheable = $useParserCache;
+               $this->parserOptions = $parserOptions;
+       }
+       
+       function doWork() {
+               return $this->mArticle->doViewParse();
+       }
+       
+       function getCachedWork() {
+               global $wgOut;
+               
+               $parserCache = ParserCache::singleton();
+               $this->mArticle->mParserOutput = $parserCache->get( $this->mArticle, $this->parserOptions );
+
+               if ( $this->mArticle->mParserOutput !== false ) {
+                       wfDebug( __METHOD__ . ": showing contents parsed by someone else\n" );
+                       $wgOut->addParserOutput( $this->mArticle->mParserOutput );
+                       # Ensure that UI elements requiring revision ID have
+                       # the correct version information.
+                       $wgOut->setRevisionId( $this->mArticle->getLatest() );
+                       return true;
+               }
+               return false;
+       }
+       
+       function fallback() {
+               return $this->mArticle->tryDirtyCache();
+       }
+       
+       function error( $status ) {
+               global $wgOut;
+
+               $wgOut->clearHTML(); // for release() errors
+               $wgOut->enableClientCache( false );
+               $wgOut->setRobotPolicy( 'noindex,nofollow' );
+               
+               $errortext = $status->getWikiText( false, 'view-pool-error' );
+               $wgOut->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
+               
+               return false;
+       }
+}