use Wikimedia\WrappedStringList;
/**
- * This class should be covered by a general architecture document which does
- * not exist as of January 2011. This is one of the Core classes and should
- * be read at least once by any new developers.
+ * This is one of the Core classes and should
+ * be read at least once by any new developers. Also documented at
+ * https://www.mediawiki.org/wiki/Manual:Architectural_modules/OutputPage
*
* This class is used to prepare the final rendering. A skin is then
* applied to the output parameters (links, javascript, html, categories ...).
* @param string|null $unused Previously used to change the cache-busting query parameter
*/
public function addScriptFile( $file, $unused = null ) {
- if ( substr( $file, 0, 1 ) !== '/' && !preg_match( '#^[a-z]*://#i', $file ) ) {
- // This is not an absolute path, protocol-relative url, or full scheme url,
- // presumed to be an old call intended to include a file from /w/skins/common,
- // which doesn't exist anymore as of MediaWiki 1.24 per T71277. Ignore.
- wfDeprecated( __METHOD__, '1.24' );
- return;
- }
$this->addScript( Html::linkedScript( $file, $this->getCSPNonce() ) );
}
* @return string The doctype, opening "<html>", and head element.
*/
public function headElement( Skin $sk, $includeStyle = true ) {
+ $config = $this->getConfig();
$userdir = $this->getLanguage()->getDir();
$sitedir = MediaWikiServices::getInstance()->getContentLanguage()->getDir();
$this->setHTMLTitle( $this->msg( 'pagetitle', $this->getPageTitle() )->inContentLanguage() );
}
- if ( !Html::isXmlMimeType( $this->getConfig()->get( 'MimeType' ) ) ) {
+ if ( !Html::isXmlMimeType( $config->get( 'MimeType' ) ) ) {
// Add <meta charset="UTF-8">
// This should be before <title> since it defines the charset used by
// text including the text inside <title>.
$pieces = array_merge( $pieces, array_values( $this->getHeadLinksArray() ) );
$pieces = array_merge( $pieces, array_values( $this->mHeadItems ) );
+ // This library is intended to run on older browsers that MediaWiki no longer
+ // supports as Grade A. For these Grade C browsers, we provide an experience
+ // using only HTML and CSS. Where standards-compliant browsers are able to style
+ // unknown HTML elements without issue, old IE ignores these styles.
+ // The html5shiv library fixes that.
// Use an IE conditional comment to serve the script only to old IE
+ $shivUrl = $config->get( 'ResourceBasePath' ) . '/resources/lib/html5shiv/html5shiv.js';
$pieces[] = '<!--[if lt IE 9]>' .
- ResourceLoaderClientHtml::makeLoad(
- new ResourceLoaderContext(
- $this->getResourceLoader(),
- new FauxRequest( [] )
- ),
- [ 'html5shiv' ],
- ResourceLoaderModule::TYPE_SCRIPTS,
- [ 'raw' => '1', 'sync' => '1' ],
- $this->getCSPNonce()
- ) .
+ Html::linkedScript( $shivUrl, $this->getCSPNonce() ) .
'<![endif]-->';
$pieces[] = Html::closeElement( 'head' );
*/
protected function buildExemptModules() {
$chunks = [];
- // Things that go after the ResourceLoaderDynamicStyles marker
- $append = [];
- // We want site, private and user styles to override dynamically added styles from
- // general modules, but we want dynamically added styles to override statically added
- // style modules. So the order has to be:
- // - page style modules (formatted by ResourceLoaderClientHtml::getHeadHtml())
- // - dynamically loaded styles (added by mw.loader before ResourceLoaderDynamicStyles)
- // - ResourceLoaderDynamicStyles marker
- // - site/private/user styles
+ // Requirements:
+ // - Within modules provided by the software (core, skin, extensions),
+ // styles from skin stylesheets should be overridden by styles
+ // from modules dynamically loaded with JavaScript.
+ // - Styles from site-specific, private, and user modules should override
+ // both of the above.
+ //
+ // The effective order for stylesheets must thus be:
+ // 1. Page style modules, formatted server-side by ResourceLoaderClientHtml.
+ // 2. Dynamically-loaded styles, inserted client-side by mw.loader.
+ // 3. Styles that are site-specific, private or from the user, formatted
+ // server-side by this function.
+ //
+ // The 'ResourceLoaderDynamicStyles' marker helps JavaScript know where
+ // point #2 is.
// Add legacy styles added through addStyle()/addInlineStyle() here
$chunks[] = implode( '', $this->buildCssLinksArray() ) . $this->mInlineStyles;
- $chunks[] = Html::element(
- 'meta',
- [ 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' ]
- );
-
+ // Things that go after the ResourceLoaderDynamicStyles marker
+ $append = [];
$separateReq = [ 'site.styles', 'user.styles' ];
foreach ( $this->rlExemptStyleModules as $group => $moduleNames ) {
- // Combinable modules
- $chunks[] = $this->makeResourceLoaderLink(
- array_diff( $moduleNames, $separateReq ),
- ResourceLoaderModule::TYPE_STYLES
- );
-
- foreach ( array_intersect( $moduleNames, $separateReq ) as $name ) {
- // These require their own dedicated request in order to support "@import"
- // syntax, which is incompatible with concatenation. (T147667, T37562)
- $chunks[] = $this->makeResourceLoaderLink( $name,
+ if ( $moduleNames ) {
+ $append[] = $this->makeResourceLoaderLink(
+ array_diff( $moduleNames, $separateReq ),
ResourceLoaderModule::TYPE_STYLES
);
+
+ foreach ( array_intersect( $moduleNames, $separateReq ) as $name ) {
+ // These require their own dedicated request in order to support "@import"
+ // syntax, which is incompatible with concatenation. (T147667, T37562)
+ $append[] = $this->makeResourceLoaderLink( $name,
+ ResourceLoaderModule::TYPE_STYLES
+ );
+ }
}
}
+ if ( $append ) {
+ $chunks[] = Html::element(
+ 'meta',
+ [ 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' ]
+ );
+ $chunks = array_merge( $chunks, $append );
+ }
- return self::combineWrappedStrings( array_merge( $chunks, $append ) );
+ return self::combineWrappedStrings( $chunks );
}
/**
if ( is_array( $spec ) ) {
$args = $spec;
$name = array_shift( $args );
- if ( isset( $args['options'] ) ) {
- unset( $args['options'] );
- wfDeprecated(
- 'Adding "options" to ' . __METHOD__ . ' is no longer supported',
- '1.20'
- );
- }
} else {
$args = [];
$name = $spec;
return $this->mEnableTOC;
}
- /**
- * Enables/disables section edit links, doesn't override __NOEDITSECTION__
- * @param bool $flag
- * @since 1.23
- * @deprecated since 1.31, use $poOptions to addParserOutput() instead.
- */
- public function enableSectionEditLinks( $flag = true ) {
- wfDeprecated( __METHOD__, '1.31' );
- }
-
/**
* Helper function to setup the PHP implementation of OOUI to use in this request.
*
$this->addModuleStyles( [
'oojs-ui-core.styles',
'oojs-ui.styles.indicators',
- 'oojs-ui.styles.textures',
'mediawiki.widgets.styles',
'oojs-ui-core.icons',
] );