There has long been a hack for previewing edits to user JS/CSS, where OutputPage would pass an 'excludepage' parameter to ResourceLoaderUserModule to tell it not to load one particular page and would instead embed that page statically. That's nice, but there are other places where we could use the same thing. This patch generalizes it: * DerivativeResourceLoaderContext may now contain a callback for mapping titles to replacement Content objects. * ResourceLoaderWikiModule::getContent() uses the overrides, and requests embedding when they're used. All subclasses in Gerrit should pick it up automatically. * OutputPage gains methods for callers to add to the override mapping, which it passes on to RL. It loses a bunch of the special casing it had for the 'user' and 'user.styles' modules. * EditPage sets the overrides on OutputPage when doing the preview, as does ApiParse for prop=headhtml. TemplateSandbox does too in I83fa0856. * OutputPage::userCanPreview() gets less specific to editing user CSS and JS, since RL now handles the embedding based on the actual modules' dependencies and EditPage only requests it on preview. ApiParse also gets a new hook to support TemplateSandbox's API integration (used in I83fa0856). Bug: T112474 Change-Id: Ib9d2ce42931c1de8372e231314a1f672d7e2ac0e
87 lines
2.4 KiB
PHP
87 lines
2.4 KiB
PHP
<?php
|
|
/**
|
|
* 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
|
|
* @author Trevor Parscal
|
|
* @author Roan Kattouw
|
|
*/
|
|
|
|
/**
|
|
* Module for user customizations styles
|
|
*/
|
|
class ResourceLoaderUserStylesModule extends ResourceLoaderWikiModule {
|
|
|
|
protected $origin = self::ORIGIN_USER_INDIVIDUAL;
|
|
protected $targets = [ 'desktop', 'mobile' ];
|
|
|
|
/**
|
|
* @param ResourceLoaderContext $context
|
|
* @return array List of pages
|
|
*/
|
|
protected function getPages( ResourceLoaderContext $context ) {
|
|
$config = $this->getConfig();
|
|
$user = $context->getUserObj();
|
|
if ( $user->isAnon() ) {
|
|
return [];
|
|
}
|
|
|
|
// Use localised/normalised variant to ensure $excludepage matches
|
|
$userPage = $user->getUserPage()->getPrefixedDBkey();
|
|
$pages = [];
|
|
|
|
if ( $config->get( 'AllowUserCss' ) ) {
|
|
$pages["$userPage/common.css"] = [ 'type' => 'style' ];
|
|
$pages["$userPage/" . $context->getSkin() . '.css'] = [ 'type' => 'style' ];
|
|
}
|
|
|
|
// User group pages are maintained site-wide and enabled with site JS/CSS.
|
|
if ( $config->get( 'UseSiteCss' ) ) {
|
|
foreach ( $user->getEffectiveGroups() as $group ) {
|
|
if ( $group == '*' ) {
|
|
continue;
|
|
}
|
|
$pages["MediaWiki:Group-$group.css"] = [ 'type' => 'style' ];
|
|
}
|
|
}
|
|
|
|
// This is obsolete since 1.32 (T112474). It was formerly used by
|
|
// OutputPage to implement previewing of user CSS and JS.
|
|
// @todo: Remove it once we're sure nothing else is using the parameter
|
|
$excludepage = $context->getRequest()->getVal( 'excludepage' );
|
|
if ( isset( $pages[$excludepage] ) ) {
|
|
unset( $pages[$excludepage] );
|
|
}
|
|
|
|
return $pages;
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getType() {
|
|
return self::LOAD_STYLES;
|
|
}
|
|
|
|
/**
|
|
* Get group name
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getGroup() {
|
|
return 'user';
|
|
}
|
|
}
|