From: Timo Tijhof Date: Tue, 26 Jul 2016 23:54:30 +0000 (+0100) Subject: resourceloader: Separate 'user.styles' module from 'user' X-Git-Tag: 1.31.0-rc.0~6188 X-Git-Url: https://git.cyclocoop.org/%28%28?a=commitdiff_plain;h=ae762b115757f0c92cf54dec98ff27ee9d905854;p=lhc%2Fweb%2Fwiklou.git resourceloader: Separate 'user.styles' module from 'user' Fixes addModuleStyles() violation from T92459 (a464d1d41). Similar to 93ed259cf and Id2342454b for the 'site' module. Doesn't need to be in separate commits since per-user HTML isn't cached the same way. Bug: T92459 Bug: T108590 Change-Id: I195f67d061de1306c97413aada7919e9f1b1d12c --- diff --git a/autoload.php b/autoload.php index 50d544c1f9..2587addfe6 100644 --- a/autoload.php +++ b/autoload.php @@ -1169,6 +1169,7 @@ $wgAutoloadLocalClasses = [ 'ResourceLoaderUserDefaultsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserDefaultsModule.php', 'ResourceLoaderUserModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserModule.php', 'ResourceLoaderUserOptionsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserOptionsModule.php', + 'ResourceLoaderUserStylesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserStylesModule.php', 'ResourceLoaderUserTokensModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserTokensModule.php', 'ResourceLoaderWikiModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderWikiModule.php', 'RestbaseVirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/RestbaseVirtualRESTService.php', diff --git a/includes/OutputPage.php b/includes/OutputPage.php index d34ace8fb0..753c3b7a25 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -3650,7 +3650,7 @@ class OutputPage extends ContextSource { ) { // We're on a preview of a CSS subpage // Exclude this page from the user module in case it's in there (bug 26283) - $link = $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_STYLES, + $link = $this->makeResourceLoaderLink( 'user.styles', ResourceLoaderModule::TYPE_STYLES, [ 'excludepage' => $this->getTitle()->getPrefixedDBkey() ] ); $otherTags = array_merge( $otherTags, $link['html'] ); @@ -3665,7 +3665,7 @@ class OutputPage extends ContextSource { $otherTags[] = Html::inlineStyle( $previewedCSS ); } else { // Load the user styles normally - $moduleStyles[] = 'user'; + $moduleStyles[] = 'user.styles'; } // Per-user preference styles diff --git a/includes/resourceloader/ResourceLoaderUserModule.php b/includes/resourceloader/ResourceLoaderUserModule.php index 8d4f263493..8f58040a8c 100644 --- a/includes/resourceloader/ResourceLoaderUserModule.php +++ b/includes/resourceloader/ResourceLoaderUserModule.php @@ -1,7 +1,5 @@ getSkin() . '.js'] = [ 'type' => 'script' ]; } - if ( $config->get( 'AllowUserCss' ) ) { - $pages["$userPage/common.css"] = [ 'type' => 'style' ]; - $pages["$userPage/" . $context->getSkin() . '.css'] = [ 'type' => 'style' ]; - } - - $useSiteJs = $config->get( 'UseSiteJs' ); - $useSiteCss = $config->get( 'UseSiteCss' ); // User group pages are maintained site-wide and enabled with site JS/CSS. - if ( $useSiteJs || $useSiteCss ) { + if ( $config->get( 'UseSiteJs' ) ) { foreach ( $user->getEffectiveGroups() as $group ) { if ( $group == '*' ) { continue; } - if ( $useSiteJs ) { - $pages["MediaWiki:Group-$group.js"] = [ 'type' => 'script' ]; - } - if ( $useSiteCss ) { - $pages["MediaWiki:Group-$group.css"] = [ 'type' => 'style' ]; - } + $pages["MediaWiki:Group-$group.js"] = [ 'type' => 'script' ]; } } - // Hack for bug 26283: if we're on a preview page for a CSS/JS page, - // we need to exclude that page from this module. In that case, the excludepage - // parameter will be set to the name of the page we need to exclude. + // Hack for T28283: Allow excluding pages for preview on a CSS/JS page. + // The excludepage parameter is set by OutputPage. $excludepage = $context->getRequest()->getVal( 'excludepage' ); if ( isset( $pages[$excludepage] ) ) { - // This works because $excludepage is generated with getPrefixedDBkey(), - // just like the keys in $pages[] above unset( $pages[$excludepage] ); } @@ -95,4 +76,11 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule { public function getGroup() { return 'user'; } + + /** + * @return array + */ + public function getDependencies( ResourceLoaderContext $context = null ) { + return [ 'user.styles' ]; + } } diff --git a/includes/resourceloader/ResourceLoaderUserStylesModule.php b/includes/resourceloader/ResourceLoaderUserStylesModule.php new file mode 100644 index 0000000000..8d8e008593 --- /dev/null +++ b/includes/resourceloader/ResourceLoaderUserStylesModule.php @@ -0,0 +1,86 @@ +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' ]; + } + } + + // Hack for T28283: Allow excluding pages for preview on a CSS/JS page. + // The excludepage parameter is set by OutputPage. + $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'; + } +} diff --git a/resources/Resources.php b/resources/Resources.php index 746cbd15f7..388d78dc83 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -52,6 +52,7 @@ return [ // Scripts managed by the current user (stored in their user space) 'user' => [ 'class' => 'ResourceLoaderUserModule' ], + 'user.styles' => [ 'class' => 'ResourceLoaderUserStylesModule' ], // Scripts generated based on the current user's preferences 'user.cssprefs' => [ 'class' => 'ResourceLoaderUserCSSPrefsModule' ],