From: Kunal Mehta Date: Tue, 21 Oct 2014 00:43:26 +0000 (-0700) Subject: resourceloader: Implement '$pages' parameter to ResourceLoaderWikiModule constructor X-Git-Tag: 1.31.0-rc.0~12199^2 X-Git-Url: http://git.cyclocoop.org/%22%20.%20generer_url_ecrire%28%22brouteur%22%2C%28%24id_rubrique%20?a=commitdiff_plain;h=870f50d45c4d3bb501703adc580b70db9ce6f335;p=lhc%2Fweb%2Fwiklou.git resourceloader: Implement '$pages' parameter to ResourceLoaderWikiModule constructor This makes it easier for subclasses to use ResourceLoaderWikiModule. Currently many subclasses of this simply need to override the getPages() method. UserModule and SiteModule keep their getPages override due to the set of pages being dependent on context. Change-Id: I388531398671afacfec36c6c5746d72267b5bdac --- diff --git a/autoload.php b/autoload.php index 90fab64926..bf0ba98d7f 100644 --- a/autoload.php +++ b/autoload.php @@ -977,14 +977,12 @@ $wgAutoloadLocalClasses = array( 'ResourceLoaderContext' => __DIR__ . '/includes/resourceloader/ResourceLoaderContext.php', 'ResourceLoaderEditToolbarModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderEditToolbarModule.php', 'ResourceLoaderFileModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderFileModule.php', - 'ResourceLoaderFilePageModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderFilePageModule.php', 'ResourceLoaderFilePath' => __DIR__ . '/includes/resourceloader/ResourceLoaderFilePath.php', 'ResourceLoaderImage' => __DIR__ . '/includes/resourceloader/ResourceLoaderImage.php', 'ResourceLoaderImageModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderImageModule.php', 'ResourceLoaderLanguageDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageDataModule.php', 'ResourceLoaderLanguageNamesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageNamesModule.php', 'ResourceLoaderModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderModule.php', - 'ResourceLoaderNoscriptModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderNoscriptModule.php', 'ResourceLoaderSiteModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSiteModule.php', 'ResourceLoaderSkinModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSkinModule.php', 'ResourceLoaderStartUpModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderStartUpModule.php', diff --git a/includes/resourceloader/ResourceLoaderFilePageModule.php b/includes/resourceloader/ResourceLoaderFilePageModule.php deleted file mode 100644 index 8c7fbe7674..0000000000 --- a/includes/resourceloader/ResourceLoaderFilePageModule.php +++ /dev/null @@ -1,37 +0,0 @@ - array( 'type' => 'style' ), - ); - } -} diff --git a/includes/resourceloader/ResourceLoaderNoscriptModule.php b/includes/resourceloader/ResourceLoaderNoscriptModule.php deleted file mode 100644 index 61927d7705..0000000000 --- a/includes/resourceloader/ResourceLoaderNoscriptModule.php +++ /dev/null @@ -1,54 +0,0 @@ - array( 'type' => 'style' ) ); - } - - /* Methods */ - - /** - * Gets group name - * - * @return string Name of group - */ - public function getGroup() { - return 'noscript'; - } -} diff --git a/includes/resourceloader/ResourceLoaderSiteModule.php b/includes/resourceloader/ResourceLoaderSiteModule.php index 35d5c05190..19e0baeb5e 100644 --- a/includes/resourceloader/ResourceLoaderSiteModule.php +++ b/includes/resourceloader/ResourceLoaderSiteModule.php @@ -27,13 +27,10 @@ */ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule { - /* Protected Methods */ - /** - * Gets list of pages used by this module + * Get list of pages used by this module * * @param ResourceLoaderContext $context - * * @return array List of pages */ protected function getPages( ResourceLoaderContext $context ) { @@ -51,12 +48,10 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule { return $pages; } - /* Methods */ - /** - * Gets group name + * Get group name * - * @return string Name of group + * @return string */ public function getGroup() { return 'site'; diff --git a/includes/resourceloader/ResourceLoaderUserGroupsModule.php b/includes/resourceloader/ResourceLoaderUserGroupsModule.php index ee350cf0b5..417cfced0b 100644 --- a/includes/resourceloader/ResourceLoaderUserGroupsModule.php +++ b/includes/resourceloader/ResourceLoaderUserGroupsModule.php @@ -25,13 +25,9 @@ */ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule { - /* Protected Members */ - protected $origin = self::ORIGIN_USER_SITEWIDE; protected $targets = array( 'desktop', 'mobile' ); - /* Protected Methods */ - /** * @param ResourceLoaderContext $context * @return array @@ -63,9 +59,9 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule { return $pages; } - /* Methods */ - /** + * Get group name + * * @return string */ public function getGroup() { diff --git a/includes/resourceloader/ResourceLoaderUserModule.php b/includes/resourceloader/ResourceLoaderUserModule.php index e2d39d0aae..a09784455c 100644 --- a/includes/resourceloader/ResourceLoaderUserModule.php +++ b/includes/resourceloader/ResourceLoaderUserModule.php @@ -27,15 +27,13 @@ */ class ResourceLoaderUserModule extends ResourceLoaderWikiModule { - /* Protected Members */ - protected $origin = self::ORIGIN_USER_INDIVIDUAL; - /* Protected Methods */ - /** + * Get list of pages used by this module + * * @param ResourceLoaderContext $context - * @return array + * @return array List of pages */ protected function getPages( ResourceLoaderContext $context ) { $allowUserJs = $this->getConfig()->get( 'AllowUserJs' ); @@ -74,9 +72,9 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule { return $pages; } - /* Methods */ - /** + * Get group name + * * @return string */ public function getGroup() { diff --git a/includes/resourceloader/ResourceLoaderWikiModule.php b/includes/resourceloader/ResourceLoaderWikiModule.php index 1a1a6d0008..7b44cc67a6 100644 --- a/includes/resourceloader/ResourceLoaderWikiModule.php +++ b/includes/resourceloader/ResourceLoaderWikiModule.php @@ -29,17 +29,37 @@ * because of its dependence on the functionality of * Title::isCssJsSubpage. */ -abstract class ResourceLoaderWikiModule extends ResourceLoaderModule { +class ResourceLoaderWikiModule extends ResourceLoaderModule { - /* Protected Members */ - - # Origin is user-supplied code + // Origin defaults to users with sitewide authority protected $origin = self::ORIGIN_USER_SITEWIDE; // In-object cache for title info protected $titleInfo = array(); - /* Abstract Protected Methods */ + // List of page names that contain CSS + protected $styles = array(); + + // List of page names that contain JavaScript + protected $scripts = array(); + + // Group of module + protected $group; + + /** + * @param array $options For back-compat, this can be omitted in favour of overwriting getPages. + */ + public function __construct( array $options = null ) { + if ( isset( $options['styles'] ) ) { + $this->styles = $options['styles']; + } + if ( isset( $options['scripts'] ) ) { + $this->scripts = $options['scripts']; + } + if ( isset( $options['group'] ) ) { + $this->group = $options['group']; + } + } /** * Subclasses should return an associative array of resources in the module. @@ -57,9 +77,34 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule { * @param ResourceLoaderContext $context * @return array */ - abstract protected function getPages( ResourceLoaderContext $context ); + protected function getPages( ResourceLoaderContext $context ) { + $config = $this->getConfig(); + $pages = array(); + + // Filter out pages from origins not allowed by the current wiki configuration. + if ( $config->get( 'UseSiteJs' ) ) { + foreach ( $this->scripts as $script ) { + $pages[$script] = array( 'type' => 'script' ); + } + } + + if ( $config->get( 'UseSiteCss' ) ) { + foreach ( $this->styles as $style ) { + $pages[$style] = array( 'type' => 'style' ); + } + } + + return $pages; + } - /* Protected Methods */ + /** + * Get group name + * + * @return string + */ + public function getGroup() { + return $this->group; + } /** * Get the Database object used in getTitleMTimes(). Defaults to the local slave DB @@ -105,8 +150,6 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule { return $content->serialize( $format ); } - /* Methods */ - /** * @param ResourceLoaderContext $context * @return string diff --git a/resources/Resources.php b/resources/Resources.php index 965c78330a..0874e68ead 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -29,12 +29,19 @@ return array( /** * Special modules who have their own classes */ + 'startup' => array( 'class' => 'ResourceLoaderStartUpModule' ), // Scripts managed by the local wiki (stored in the MediaWiki namespace) 'site' => array( 'class' => 'ResourceLoaderSiteModule' ), - 'noscript' => array( 'class' => 'ResourceLoaderNoscriptModule' ), - 'startup' => array( 'class' => 'ResourceLoaderStartUpModule' ), - 'filepage' => array( 'class' => 'ResourceLoaderFilePageModule' ), + 'noscript' => array( + 'class' => 'ResourceLoaderWikiModule', + 'styles' => array( 'MediaWiki:Noscript.css' ), + 'group' => 'noscript', + ), + 'filepage' => array( + 'class' => 'ResourceLoaderWikiModule', + 'styles' => array( 'MediaWiki:Filepage.css' ), + ), 'user.groups' => array( 'class' => 'ResourceLoaderUserGroupsModule' ), // Scripts managed by the current user (stored in their user space) diff --git a/tests/TestsAutoLoader.php b/tests/TestsAutoLoader.php index 4ed28a8007..b410898557 100644 --- a/tests/TestsAutoLoader.php +++ b/tests/TestsAutoLoader.php @@ -44,7 +44,6 @@ $wgAutoloadClasses += array( 'ResourceLoaderTestCase' => "$testDir/phpunit/ResourceLoaderTestCase.php", 'ResourceLoaderTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php", 'ResourceLoaderFileModuleTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php", - 'ResourceLoaderWikiModuleTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php", 'TestUser' => "$testDir/phpunit/includes/TestUser.php", 'LessFileCompilationTest' => "$testDir/phpunit/LessFileCompilationTest.php", diff --git a/tests/phpunit/ResourceLoaderTestCase.php b/tests/phpunit/ResourceLoaderTestCase.php index 055beb018c..deecb31e57 100644 --- a/tests/phpunit/ResourceLoaderTestCase.php +++ b/tests/phpunit/ResourceLoaderTestCase.php @@ -98,10 +98,3 @@ class ResourceLoaderTestModule extends ResourceLoaderModule { class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule { } - -class ResourceLoaderWikiModuleTestModule extends ResourceLoaderWikiModule { - // Override expected via PHPUnit mocks and stubs - protected function getPages( ResourceLoaderContext $context ) { - return array(); - } -} diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php index 9dc180506f..93a3ebba61 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php @@ -2,12 +2,94 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase { + /** + * @covers ResourceLoaderWikiModule::__construct + * @dataProvider provideConstructor + */ + public function testConstructor( $params ) { + $module = new ResourceLoaderWikiModule( $params ); + $this->assertInstanceOf( 'ResourceLoaderWikiModule', $module ); + } + + public static function provideConstructor() { + return array( + // Nothing + array( null ), + array( array() ), + // Unrecognized settings + array( array( 'foo' => 'baz' ) ), + // Real settings + array( array( 'scripts' => array( 'MediaWiki:Common.js' ) ) ), + ); + } + + /** + * @dataProvider provideGetPages + * @covers ResourceLoaderWikiModule::getPages + */ + public function testGetPages( $params, Config $config, $expected ) { + $module = new ResourceLoaderWikiModule( $params ); + $module->setConfig( $config ); + + // Use getDefinitionSummary because getPages is protected + $summary = $module->getDefinitionSummary( ResourceLoaderContext::newDummyContext() ); + $this->assertEquals( + $expected, + $summary['pages'] + ); + } + + public static function provideGetPages() { + $settings = array( + 'UseSiteJs' => true, + 'UseSiteCss' => true, + ); + + $params = array( + 'styles' => array( 'MediaWiki:Common.css' ), + 'scripts' => array( 'MediaWiki:Common.js' ), + ); + + return array( + array( array(), new HashConfig( $settings ), array() ), + array( $params, new HashConfig( $settings ), array( + 'MediaWiki:Common.js' => array( 'type' => 'script' ), + 'MediaWiki:Common.css' => array( 'type' => 'style' ) + ) ), + array( $params, new HashConfig( array( 'UseSiteCss' => false ) + $settings ), array( + 'MediaWiki:Common.js' => array( 'type' => 'script' ), + ) ), + array( $params, new HashConfig( array( 'UseSiteJs' => false ) + $settings ), array( + 'MediaWiki:Common.css' => array( 'type' => 'style' ), + ) ), + array( $params, new HashConfig( array( 'UseSiteJs' => false, 'UseSiteCss' => false ) ), array() ), + ); + } + + /** + * @covers ResourceLoaderWikiModule::getGroup + * @dataProvider provideGetGroup + */ + public function testGetGroup( $params, $expected ) { + $module = new ResourceLoaderWikiModule( $params ); + $this->assertEquals( $expected, $module->getGroup() ); + } + + public static function provideGetGroup() { + return array( + // No group specified + array( array(), null ), + // A random group + array( array( 'group' => 'foobar' ), 'foobar' ), + ); + } + /** * @covers ResourceLoaderWikiModule::isKnownEmpty * @dataProvider provideIsKnownEmpty */ public function testIsKnownEmpty( $titleInfo, $group, $expected ) { - $module = $this->getMockBuilder( 'ResourceLoaderWikiModuleTestModule' ) + $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' ) ->setMethods( array( 'getTitleInfo', 'getGroup' ) ) ->getMock(); $module->expects( $this->any() )