Merge "Use stashed ParserOutput during saving."
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 26 Nov 2018 22:53:34 +0000 (22:53 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 26 Nov 2018 22:53:34 +0000 (22:53 +0000)
1  2 
includes/Storage/DerivedPageDataUpdater.php

@@@ -351,9 -351,13 +351,9 @@@ class DerivedPageDataUpdater implement
                        throw new InvalidArgumentException( '$parentId should match the parent of $revision' );
                }
  
 -              if ( $revision
 -                      && $user
 -                      && $revision->getUser( RevisionRecord::RAW )->getName() !== $user->getName()
 -              ) {
 -                      throw new InvalidArgumentException( '$user should match the author of $revision' );
 -              }
 -
 +              // NOTE: For null revisions, $user may be different from $this->revision->getUser
 +              // and also from $revision->getUser.
 +              // But $user should always match $this->user.
                if ( $user && $this->user && $user->getName() !== $this->user->getName() ) {
                        return false;
                }
                        return false;
                }
  
 -              if ( $revision && !$user ) {
 -                      $user = $revision->getUser( RevisionRecord::RAW );
 -              }
 -
                if ( $this->pageState
                        && $revision
                        && $revision->getParentId() !== null
                        return false;
                }
  
 -              if ( $this->revision
 -                      && $user
 -                      && $this->revision->getUser( RevisionRecord::RAW )
 -                      && $this->revision->getUser( RevisionRecord::RAW )->getName() !== $user->getName()
 -              ) {
 -                      return false;
 -              }
 -
 -              if ( $revision
 -                      && $this->user
 -                      && $this->revision->getUser( RevisionRecord::RAW )
 -                      && $revision->getUser( RevisionRecord::RAW )->getName() !== $this->user->getName()
 -              ) {
 -                      return false;
 -              }
 -
                // NOTE: this check is the primary reason for having the $this->slotsUpdate field!
                if ( $this->slotsUpdate
                        && $slotsUpdate
                        $stashedEdit = ApiStashEdit::checkCache( $title, $mainContent, $legacyUser );
                }
  
-               if ( $stashedEdit ) {
-                       /** @var ParserOutput $output */
-                       $output = $stashedEdit->output;
-                       // TODO: this should happen when stashing the ParserOutput, not now!
-                       $output->setCacheTime( $stashedEdit->timestamp );
-                       // TODO: MCR: allow output for all slots to be stashed.
-                       $this->canonicalParserOutput = $output;
-               }
                $userPopts = ParserOptions::newFromUserAndLang( $user, $this->contLang );
                Hooks::run( 'ArticlePrepareTextForEdit', [ $wikiPage, $userPopts ] );
  
                } else {
                        $this->parentRevision = $parentRevision;
                }
+               $renderHints = [ 'use-master' => $this->useMaster(), 'audience' => RevisionRecord::RAW ];
+               if ( $stashedEdit ) {
+                       /** @var ParserOutput $output */
+                       $output = $stashedEdit->output;
+                       // TODO: this should happen when stashing the ParserOutput, not now!
+                       $output->setCacheTime( $stashedEdit->timestamp );
+                       $renderHints['known-revision-output'] = $output;
+               }
+               // NOTE: we want a canonical rendering, so don't pass $this->user or ParserOptions
+               // NOTE: the revision is either new or current, so we can bypass audience checks.
+               $this->renderedRevision = $this->revisionRenderer->getRenderedRevision(
+                       $this->revision,
+                       null,
+                       null,
+                       $renderHints
+               );
        }
  
        /**
         * @return RenderedRevision
         */
        public function getRenderedRevision() {
-               if ( !$this->renderedRevision ) {
-                       $this->assertPrepared( __METHOD__ );
-                       // NOTE: we want a canonical rendering, so don't pass $this->user or ParserOptions
-                       // NOTE: the revision is either new or current, so we can bypass audience checks.
-                       $this->renderedRevision = $this->revisionRenderer->getRenderedRevision(
-                               $this->revision,
-                               null,
-                               null,
-                               [ 'use-master' => $this->useMaster(), 'audience' => RevisionRecord::RAW ]
-                       );
-               }
+               $this->assertPrepared( __METHOD__ );
  
                return $this->renderedRevision;
        }
                // Prune any output that depends on the revision ID.
                if ( $this->renderedRevision ) {
                        $this->renderedRevision->updateRevision( $revision );
+               } else {
+                       // NOTE: we want a canonical rendering, so don't pass $this->user or ParserOptions
+                       // NOTE: the revision is either new or current, so we can bypass audience checks.
+                       $this->renderedRevision = $this->revisionRenderer->getRenderedRevision(
+                               $this->revision,
+                               null,
+                               null,
+                               [ 'use-master' => $this->useMaster(), 'audience' => RevisionRecord::RAW ]
+                       );
+                       // XXX: Since we presumably are dealing with the current revision,
+                       // we could try to get the ParserOutput from the parser cache.
                }
  
                // TODO: optionally get ParserOutput from the ParserCache here.