wiki.techinc.nl/includes/content/CssContentHandler.php
Brian Wolff bec8dada48 Clarify generate-html and make ParserOutput behave as expected
Previously:
* It was unclear that generate-html is an optional optimization
* Most of MediaWiki core was doing $parserOutput->setText('') if
html wasn't generated. However this is wrong and will cause
$parserOutput->hasText() to return true and also potentially cause
cache pollution if a content handler both does that and supports
parser cache (Like MassMessage; see T299896)
* The default value of mText in the constructor was '', and most
of the time MW used that default. This doesn't seem right. If
setText() is never called, the ParserOutput should not be considered
to have text
* It was impossible to set mText to null, as $parserOutput->setText(null)
was a no-op. Docs implied you were supposed to do this, so it was very
confusing.

This patch clarifies docs, changes the default value for ParserOutput::$mText
from '' to null, and makes $parserOutput->setText(null) do what you
expect it to. The last two are arguably breaking changes, although
the previous behaviours were unexpected, mostly undocumented and
based on a code search do not appear to be relied on.

It seems like the main reason this only broke MassMessage is most
content handlers either don't support generateHtml, or they don't
support parser cache.

Bug: T306591
Change-Id: I49cdf21411c6b02ac9a221a13393bebe17c7871e
Depends-On: I68ad491735b2df13951399312a4f9c37b63a08fa
2022-05-03 11:23:08 +02:00

143 lines
3.9 KiB
PHP

<?php
/**
* Content handler for CSS pages.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
* @ingroup Content
*/
use MediaWiki\Content\Renderer\ContentParseParams;
use MediaWiki\Content\Transform\PreSaveTransformParams;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use Wikimedia\Minify\CSSMin;
/**
* Content handler for CSS pages.
*
* @since 1.21
* @ingroup Content
*/
class CssContentHandler extends CodeContentHandler {
/**
* @param string $modelId
*/
public function __construct( $modelId = CONTENT_MODEL_CSS ) {
parent::__construct( $modelId, [ CONTENT_FORMAT_CSS ] );
}
protected function getContentClass() {
return CssContent::class;
}
public function supportsRedirects() {
return true;
}
/**
* Create a redirect that is also valid CSS
*
* @param Title $destination
* @param string $text ignored
* @return CssContent
*/
public function makeRedirectContent( Title $destination, $text = '' ) {
// The parameters are passed as a string so the / is not url-encoded by wfArrayToCgi
$url = $destination->getFullURL( 'action=raw&ctype=text/css', false, PROTO_RELATIVE );
$class = $this->getContentClass();
return new $class( '/* #REDIRECT */@import ' . CSSMin::buildUrlValue( $url ) . ';' );
}
public function preSaveTransform(
Content $content,
PreSaveTransformParams $pstParams
): Content {
$shouldCallDeprecatedMethod = $this->shouldCallDeprecatedContentTransformMethod(
$content,
$pstParams
);
if ( $shouldCallDeprecatedMethod ) {
return $this->callDeprecatedContentPST(
$content,
$pstParams
);
}
'@phan-var CssContent $content';
// @todo Make pre-save transformation optional for script pages (T34858)
$services = MediaWikiServices::getInstance();
if ( !$services->getUserOptionsLookup()->getBoolOption( $pstParams->getUser(), 'pst-cssjs' ) ) {
// Allow bot users to disable the pre-save transform for CSS/JS (T236828).
$popts = clone $pstParams->getParserOptions();
$popts->setPreSaveTransform( false );
}
$text = $content->getText();
$pst = $services->getParser()->preSaveTransform(
$text,
$pstParams->getPage(),
$pstParams->getUser(),
$pstParams->getParserOptions()
);
$class = $this->getContentClass();
return new $class( $pst );
}
/**
* @inheritDoc
*/
protected function fillParserOutput(
Content $content,
ContentParseParams $cpoParams,
ParserOutput &$output
) {
$textModelsToParse = MediaWikiServices::getInstance()->getMainConfig()
->get( MainConfigNames::TextModelsToParse );
'@phan-var CssContent $content';
if ( in_array( $content->getModel(), $textModelsToParse ) ) {
// parse just to get links etc into the database, HTML is replaced below.
$output = MediaWikiServices::getInstance()->getParser()
->parse(
$content->getText(),
$cpoParams->getPage(),
$cpoParams->getParserOptions(),
true,
true,
$cpoParams->getRevId()
);
}
if ( $cpoParams->getGenerateHtml() ) {
// Return CSS wrapped in a <pre> tag.
$html = Html::element(
'pre',
[ 'class' => 'mw-code mw-css', 'dir' => 'ltr' ],
"\n" . $content->getText() . "\n"
) . "\n";
} else {
$html = null;
}
$output->clearWrapperDivClass();
$output->setText( $html );
}
}