X-Git-Url: https://git.cyclocoop.org/%27.WWW_URL.%27admin/?a=blobdiff_plain;f=includes%2FOutputPage.php;h=acf2d2553256aa87f94a975ed16587156bc20b3a;hb=e1724b7a10be582ea6d53e94fa2a6e8339d0df9f;hp=b2ca53aa185ca47d8a8f107a7bcca103d27d5754;hpb=4f8378775b3145339d03977468cf6be74afae05d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/OutputPage.php b/includes/OutputPage.php index b2ca53aa18..acf2d25532 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -44,13 +44,13 @@ use Wikimedia\WrappedStringList; * @todo document */ class OutputPage extends ContextSource { - /** @var array Should be private. Used with addMeta() which adds "" */ + /** @var string[][] Should be private. Used with addMeta() which adds "" */ protected $mMetatags = []; /** @var array */ protected $mLinktags = []; - /** @var bool */ + /** @var string|bool */ protected $mCanonicalUrl = false; /** @@ -332,7 +332,7 @@ class OutputPage extends ContextSource { * a OutputPage tied to that context. * @param IContextSource $context */ - function __construct( IContextSource $context ) { + public function __construct( IContextSource $context ) { $this->setContext( $context ); } @@ -385,8 +385,8 @@ class OutputPage extends ContextSource { * @param string $name Name of the meta tag * @param string $val Value of the meta tag */ - function addMeta( $name, $val ) { - array_push( $this->mMetatags, [ $name, $val ] ); + public function addMeta( $name, $val ) { + $this->mMetatags[] = [ $name, $val ]; } /** @@ -406,8 +406,8 @@ class OutputPage extends ContextSource { * * @param array $linkarr Associative array of attributes. */ - function addLink( array $linkarr ) { - array_push( $this->mLinktags, $linkarr ); + public function addLink( array $linkarr ) { + $this->mLinktags[] = $linkarr; } /** @@ -425,7 +425,7 @@ class OutputPage extends ContextSource { * in preference to addLink(), to avoid duplicate link tags. * @param string $url */ - function setCanonicalUrl( $url ) { + public function setCanonicalUrl( $url ) { $this->mCanonicalUrl = $url; } @@ -447,7 +447,7 @@ class OutputPage extends ContextSource { * * @param string $script Raw HTML */ - function addScript( $script ) { + public function addScript( $script ) { $this->mScripts .= $script; } @@ -621,7 +621,7 @@ class OutputPage extends ContextSource { * * @return array */ - function getHeadItemsArray() { + public function getHeadItemsArray() { return $this->mHeadItems; } @@ -995,6 +995,8 @@ class OutputPage extends ContextSource { * @param Title $t */ public function setTitle( Title $t ) { + // @phan-suppress-next-next-line PhanUndeclaredMethod + // @fixme Not all implementations of IContextSource have this method! $this->getContext()->setTitle( $t ); } @@ -1596,6 +1598,7 @@ class OutputPage extends ContextSource { * @param ParserOptions|null $options Either the ParserOption to use or null to only get the * current ParserOption object. This parameter is deprecated since 1.31. * @return ParserOptions + * @suppress PhanUndeclaredProperty For isBogus */ public function parserOptions( $options = null ) { if ( $options !== null ) { @@ -1820,14 +1823,10 @@ class OutputPage extends ContextSource { * @param string $text Wikitext * @param Title $title * @param bool $linestart Is this the start of a line? - * @param bool $tidy Whether to use tidy. - * Setting this to false (or omitting it) is deprecated - * since 1.32; all wikitext should be tidied. * @param bool $interface Whether it is an interface message * (for example disables conversion) * @param string $wrapperClass if not empty, wraps the output in * a `
` - * @private */ private function addWikiTextTitleInternal( $text, Title $title, $linestart, $interface, $wrapperClass = null @@ -1956,7 +1955,7 @@ class OutputPage extends ContextSource { * @param ParserOutput $parserOutput * @param array $poOptions Options to ParserOutput::getText() */ - function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) { + public function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) { $this->addParserOutputMetadata( $parserOutput ); $this->addParserOutputText( $parserOutput, $poOptions ); } @@ -2148,7 +2147,7 @@ class OutputPage extends ContextSource { } /** - * Get TTL in [$minTTL,$maxTTL] in pass it to lowerCdnMaxage() + * Get TTL in [$minTTL,$maxTTL] and pass it to lowerCdnMaxage() * * This sets and returns $minTTL if $mtime is false or null. Otherwise, * the TTL is higher the older the $mtime timestamp is. Essentially, the @@ -2164,10 +2163,10 @@ class OutputPage extends ContextSource { $maxTTL = $maxTTL ?: $this->getConfig()->get( 'CdnMaxAge' ); if ( $mtime === null || $mtime === false ) { - return $minTTL; // entity does not exist + return; // entity does not exist } - $age = MWTimestamp::time() - wfTimestamp( TS_UNIX, $mtime ); + $age = MWTimestamp::time() - (int)wfTimestamp( TS_UNIX, $mtime ); $adaptiveTTL = max( 0.9 * $age, $minTTL ); $adaptiveTTL = min( $adaptiveTTL, $maxTTL ); @@ -2190,7 +2189,7 @@ class OutputPage extends ContextSource { * * @return array */ - function getCacheVaryCookies() { + public function getCacheVaryCookies() { if ( self::$cacheVaryCookies === null ) { $config = $this->getConfig(); self::$cacheVaryCookies = array_values( array_unique( array_merge( @@ -2211,7 +2210,7 @@ class OutputPage extends ContextSource { * * @return bool */ - function haveCacheVaryCookies() { + public function haveCacheVaryCookies() { $request = $this->getRequest(); foreach ( $this->getCacheVaryCookies() as $cookieName ) { if ( $request->getCookie( $cookieName, '', '' ) !== '' ) { @@ -2271,7 +2270,7 @@ class OutputPage extends ContextSource { /** * Return a Link: header. Based on the values of $mLinkHeader. * - * @return string + * @return string|false */ public function getLinkHeader() { if ( !$this->mLinkHeader ) { @@ -2416,32 +2415,16 @@ class OutputPage extends ContextSource { $this->mCdnMaxage != 0 && !$this->haveCacheVaryCookies() ) { - if ( $config->get( 'UseESI' ) ) { - wfDeprecated( '$wgUseESI = true', '1.33' ); - # We'll purge the proxy cache explicitly, but require end user agents - # to revalidate against the proxy on each visit. - # Surrogate-Control controls our CDN, Cache-Control downstream caches - wfDebug( __METHOD__ . - ": proxy caching with ESI; {$this->mLastModified} **", 'private' ); - # start with a shorter timeout for initial testing - # header( 'Surrogate-Control: max-age=2678400+2678400, content="ESI/1.0"'); - $response->header( - "Surrogate-Control: max-age={$config->get( 'CdnMaxAge' )}" . - "+{$this->mCdnMaxage}, content=\"ESI/1.0\"" - ); - $response->header( 'Cache-Control: s-maxage=0, must-revalidate, max-age=0' ); - } else { - # We'll purge the proxy cache for anons explicitly, but require end user agents - # to revalidate against the proxy on each visit. - # IMPORTANT! The CDN needs to replace the Cache-Control header with - # Cache-Control: s-maxage=0, must-revalidate, max-age=0 - wfDebug( __METHOD__ . - ": local proxy caching; {$this->mLastModified} **", 'private' ); - # start with a shorter timeout for initial testing - # header( "Cache-Control: s-maxage=2678400, must-revalidate, max-age=0" ); - $response->header( "Cache-Control: " . - "s-maxage={$this->mCdnMaxage}, must-revalidate, max-age=0" ); - } + # We'll purge the proxy cache for anons explicitly, but require end user agents + # to revalidate against the proxy on each visit. + # IMPORTANT! The CDN needs to replace the Cache-Control header with + # Cache-Control: s-maxage=0, must-revalidate, max-age=0 + wfDebug( __METHOD__ . + ": local proxy caching; {$this->mLastModified} **", 'private' ); + # start with a shorter timeout for initial testing + # header( "Cache-Control: s-maxage=2678400, must-revalidate, max-age=0" ); + $response->header( "Cache-Control: " . + "s-maxage={$this->mCdnMaxage}, must-revalidate, max-age=0" ); } else { # We do want clients to cache if they can, but they *must* check for updates # on revisiting the page. @@ -2619,7 +2602,7 @@ class OutputPage extends ContextSource { * and optionally an custom HTML title (content of the "" tag). * * @param string|Message $pageTitle Will be passed directly to setPageTitle() - * @param string|Message $htmlTitle Will be passed directly to setHTMLTitle(); + * @param string|Message|false $htmlTitle Will be passed directly to setHTMLTitle(); * optional, if not passed the "<title>" attribute will be * based on $pageTitle */ @@ -2840,7 +2823,7 @@ class OutputPage extends ContextSource { /** * Add a "return to" link pointing to a specified title * - * @param Title $title Title to link + * @param LinkTarget $title Title to link * @param array $query Query string parameters * @param string|null $text Text of the link (input is not escaped) * @param array $options Options array to pass to Linker @@ -3027,10 +3010,11 @@ class OutputPage extends ContextSource { $sitedir = MediaWikiServices::getInstance()->getContentLanguage()->getDir(); $pieces = []; - $pieces[] = Html::htmlHeader( Sanitizer::mergeAttributes( + $htmlAttribs = Sanitizer::mergeAttributes( $this->getRlClient()->getDocumentAttributes(), $sk->getHtmlElementAttributes() - ) ); + ); + $pieces[] = Html::htmlHeader( $htmlAttribs ); $pieces[] = Html::openElement( 'head' ); if ( $this->getHTMLTitle() == '' ) { @@ -3050,7 +3034,7 @@ class OutputPage extends ContextSource { } $pieces[] = Html::element( 'title', null, $this->getHTMLTitle() ); - $pieces[] = $this->getRlClient()->getHeadHtml(); + $pieces[] = $this->getRlClient()->getHeadHtml( $htmlAttribs['class'] ?? null ); $pieces[] = $this->buildExemptModules(); $pieces = array_merge( $pieces, array_values( $this->getHeadLinksArray() ) ); $pieces = array_merge( $pieces, array_values( $this->mHeadItems ) ); @@ -3299,7 +3283,7 @@ class OutputPage extends ContextSource { $vars['wgUserId'] = $user->getId(); $vars['wgUserEditCount'] = $user->getEditCount(); $userReg = $user->getRegistration(); - $vars['wgUserRegistration'] = $userReg ? wfTimestamp( TS_UNIX, $userReg ) * 1000 : null; + $vars['wgUserRegistration'] = $userReg ? (int)wfTimestamp( TS_UNIX, $userReg ) * 1000 : null; // Get the revision ID of the oldest new message on the user's talk // page. This can be used for constructing new message alerts on // the client side. @@ -3311,12 +3295,10 @@ class OutputPage extends ContextSource { $vars['wgUserVariant'] = $contLang->getPreferredVariant(); } // Same test as SkinTemplate - $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user ) - && ( $title->exists() || $title->quickUserCan( 'create', $user ) ); + $vars['wgIsProbablyEditable'] = $this->userCanEditOrCreate( $user, $title ); - $vars['wgRelevantPageIsProbablyEditable'] = $relevantTitle - && $relevantTitle->quickUserCan( 'edit', $user ) - && ( $relevantTitle->exists() || $relevantTitle->quickUserCan( 'create', $user ) ); + $vars['wgRelevantPageIsProbablyEditable'] = $relevantTitle && + $this->userCanEditOrCreate( $user, $relevantTitle ); foreach ( $title->getRestrictionTypes() as $type ) { // Following keys are set in $vars: @@ -3383,6 +3365,21 @@ class OutputPage extends ContextSource { return true; } + /** + * @param User $user + * @param LinkTarget $title + * @return bool + */ + private function userCanEditOrCreate( + User $user, + LinkTarget $title + ) { + $pm = MediaWikiServices::getInstance()->getPermissionManager(); + return $pm->quickUserCan( 'edit', $user, $title ) + && ( $this->getTitle()->exists() || + $pm->quickUserCan( 'create', $user, $title ) ); + } + /** * @return array Array in format "link name or number => 'link html'". */ @@ -3447,11 +3444,7 @@ class OutputPage extends ContextSource { # Universal edit button if ( $config->get( 'UniversalEditButton' ) && $this->isArticleRelated() ) { - $user = $this->getUser(); - if ( $this->getTitle()->quickUserCan( 'edit', $user ) - && ( $this->getTitle()->exists() || - $this->getTitle()->quickUserCan( 'create', $user ) ) - ) { + if ( $this->userCanEditOrCreate( $this->getUser(), $this->getTitle() ) ) { // Original UniversalEditButton $msg = $this->msg( 'edit' )->text(); $tags['universal-edit-button'] = Html::element( 'link', [