$this->assertEquals( $expectedHtml, $actualHtml );
}
+ public static function provideBuildExemptModules() {
+ return [
+ 'empty' => [
+ 'exemptStyleModules' => [],
+ '<meta name="ResourceLoaderDynamicStyles" content=""/>',
+ ],
+ 'empty sets' => [
+ 'exemptStyleModules' => [ 'site' => [], 'noscript' => [], 'private' => [], 'user' => [] ],
+ '<meta name="ResourceLoaderDynamicStyles" content=""/>',
+ ],
+ // @codingStandardsIgnoreStart Generic.Files.LineLength
+ 'default logged-out' => [
+ 'exemptStyleModules' => [ 'site' => [ 'site.styles' ] ],
+ '<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
+ '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=site.styles&only=styles&skin=fallback"/>',
+ ],
+ 'default logged-in' => [
+ 'exemptStyleModules' => [ 'site' => [ 'site.styles' ], 'user' => [ 'user.styles' ] ],
+ '<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
+ '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=site.styles&only=styles&skin=fallback"/>' . "\n" .
+ '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=user.styles&only=styles&skin=fallback&version=1e9z0ox"/>',
+ ],
+ 'custom modules' => [
+ 'exemptStyleModules' => [
+ 'site' => [ 'site.styles', 'example.site.a', 'example.site.b' ],
+ 'user' => [ 'user.styles', 'example.user' ],
+ ],
+ '<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
+ '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=example.site.a%2Cb%7Csite.styles&only=styles&skin=fallback"/>' . "\n" .
+ '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=example.user%7Cuser.styles&only=styles&skin=fallback&version=17f1vjw"/>',
+ ],
+ // @codingStandardsIgnoreEnd Generic.Files.LineLength
+ ];
+ }
+
+ /**
+ * @dataProvider provideBuildExemptModules
+ * @covers OutputPage::buildExemptModules
+ */
+ public function testBuildExemptModules( array $exemptStyleModules, $expect ) {
+ $this->setMwGlobals( [
+ 'wgResourceLoaderDebug' => false,
+ 'wgLoadScript' => '/w/load.php',
+ // Stub wgCacheEpoch as it influences getVersionHash used for the
+ // urls in the expected HTML
+ 'wgCacheEpoch' => '20140101000000',
+ ] );
+
+ // Set up stubs
+ $ctx = new RequestContext();
+ $ctx->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'fallback' ) );
+ $ctx->setLanguage( 'en' );
+ $outputPage = $this->getMockBuilder( 'OutputPage' )
+ ->setConstructorArgs( [ $ctx ] )
+ ->setMethods( [ 'isUserCssPreview', 'buildCssLinksArray' ] )
+ ->getMock();
+ $outputPage->expects( $this->any() )
+ ->method( 'isUserCssPreview' )
+ ->willReturn( false );
+ $outputPage->expects( $this->any() )
+ ->method( 'buildCssLinksArray' )
+ ->willReturn( [] );
+ $rl = $outputPage->getResourceLoader();
+ $rl->setMessageBlobStore( new NullMessageBlobStore() );
+
+ // Register custom modules
+ $rl->register( [
+ 'example.site.a' => new ResourceLoaderTestModule( [ 'group' => 'site' ] ),
+ 'example.site.b' => new ResourceLoaderTestModule( [ 'group' => 'site' ] ),
+ 'example.user' => new ResourceLoaderTestModule( [ 'group' => 'user' ] ),
+ ] );
+
+ $outputPage = TestingAccessWrapper::newFromObject( $outputPage );
+ $outputPage->rlExemptStyleModules = $exemptStyleModules;
+ $this->assertEquals(
+ $expect,
+ strval( $outputPage->buildExemptModules() )
+ );
+ }
+
/**
* @dataProvider provideVaryHeaders
* @covers OutputPage::addVaryHeader