OutputPage: Don't get a ParserOptions for $wgUser before the end of Setup.php
authorBrad Jorsch <bjorsch@wikimedia.org>
Wed, 3 Feb 2016 20:18:52 +0000 (15:18 -0500)
committerBrad Jorsch <bjorsch@wikimedia.org>
Mon, 8 Feb 2016 18:17:37 +0000 (13:17 -0500)
Until Setup.php completes, we can't access the "current" user and
trying to do so logs a warning. So don't try.

Bug: T124367
Change-Id: I1acc82760c368a24448f3c90e268b24414e43a30

includes/OutputPage.php

index 3adef5b..317c126 100644 (file)
@@ -1573,11 +1573,42 @@ class OutputPage extends ContextSource {
         * @return ParserOptions
         */
        public function parserOptions( $options = null ) {
+               if ( $options !== null && !empty( $options->isBogus ) ) {
+                       // Someone is trying to set a bogus pre-$wgUser PO. Check if it has
+                       // been changed somehow, and keep it if so.
+                       $anonPO = ParserOptions::newFromAnon();
+                       $anonPO->setEditSection( false );
+                       if ( !$options->matches( $anonPO ) ) {
+                               wfLogWarning( __METHOD__ . ': Setting a changed bogus ParserOptions: ' . wfGetAllCallers( 5 ) );
+                               $options->isBogus = false;
+                       }
+               }
+
                if ( !$this->mParserOptions ) {
+                       if ( !$this->getContext()->getUser()->isSafeToLoad() ) {
+                               // $wgUser isn't unstubbable yet, so don't try to get a
+                               // ParserOptions for it. And don't cache this ParserOptions
+                               // either.
+                               $po = ParserOptions::newFromAnon();
+                               $po->setEditSection( false );
+                               $po->isBogus = true;
+                               if ( $options !== null ) {
+                                       $this->mParserOptions = empty( $options->isBogus ) ? $options : null;
+                               }
+                               return $po;
+                       }
+
                        $this->mParserOptions = ParserOptions::newFromContext( $this->getContext() );
                        $this->mParserOptions->setEditSection( false );
                }
-               return wfSetVar( $this->mParserOptions, $options );
+
+               if ( $options !== null && !empty( $options->isBogus ) ) {
+                       // They're trying to restore the bogus pre-$wgUser PO. Do the right
+                       // thing.
+                       return wfSetVar( $this->mParserOptions, null, true );
+               } else {
+                       return wfSetVar( $this->mParserOptions, $options );
+               }
        }
 
        /**