MediaWiki
REL1_24
|
00001 <?php 00002 00012 class OutputPageTest extends MediaWikiTestCase { 00013 const SCREEN_MEDIA_QUERY = 'screen and (min-width: 982px)'; 00014 const SCREEN_ONLY_MEDIA_QUERY = 'only screen and (min-width: 982px)'; 00015 00030 protected function assertTransformCssMediaCase( $args ) { 00031 $queryData = array(); 00032 if ( isset( $args['printableQuery'] ) ) { 00033 $queryData['printable'] = $args['printableQuery']; 00034 } 00035 00036 if ( isset( $args['handheldQuery'] ) ) { 00037 $queryData['handheld'] = $args['handheldQuery']; 00038 } 00039 00040 $fauxRequest = new FauxRequest( $queryData, false ); 00041 $this->setMwGlobals( array( 00042 'wgRequest' => $fauxRequest, 00043 ) ); 00044 00045 $actualReturn = OutputPage::transformCssMedia( $args['media'] ); 00046 $this->assertSame( $args['expectedReturn'], $actualReturn, $args['message'] ); 00047 } 00048 00053 public function testPrintRequests() { 00054 $this->assertTransformCssMediaCase( array( 00055 'printableQuery' => '1', 00056 'media' => 'screen', 00057 'expectedReturn' => null, 00058 'message' => 'On printable request, screen returns null' 00059 ) ); 00060 00061 $this->assertTransformCssMediaCase( array( 00062 'printableQuery' => '1', 00063 'media' => self::SCREEN_MEDIA_QUERY, 00064 'expectedReturn' => null, 00065 'message' => 'On printable request, screen media query returns null' 00066 ) ); 00067 00068 $this->assertTransformCssMediaCase( array( 00069 'printableQuery' => '1', 00070 'media' => self::SCREEN_ONLY_MEDIA_QUERY, 00071 'expectedReturn' => null, 00072 'message' => 'On printable request, screen media query with only returns null' 00073 ) ); 00074 00075 $this->assertTransformCssMediaCase( array( 00076 'printableQuery' => '1', 00077 'media' => 'print', 00078 'expectedReturn' => '', 00079 'message' => 'On printable request, media print returns empty string' 00080 ) ); 00081 } 00082 00087 public function testScreenRequests() { 00088 $this->assertTransformCssMediaCase( array( 00089 'media' => 'screen', 00090 'expectedReturn' => 'screen', 00091 'message' => 'On screen request, screen media type is preserved' 00092 ) ); 00093 00094 $this->assertTransformCssMediaCase( array( 00095 'media' => 'handheld', 00096 'expectedReturn' => 'handheld', 00097 'message' => 'On screen request, handheld media type is preserved' 00098 ) ); 00099 00100 $this->assertTransformCssMediaCase( array( 00101 'media' => self::SCREEN_MEDIA_QUERY, 00102 'expectedReturn' => self::SCREEN_MEDIA_QUERY, 00103 'message' => 'On screen request, screen media query is preserved.' 00104 ) ); 00105 00106 $this->assertTransformCssMediaCase( array( 00107 'media' => self::SCREEN_ONLY_MEDIA_QUERY, 00108 'expectedReturn' => self::SCREEN_ONLY_MEDIA_QUERY, 00109 'message' => 'On screen request, screen media query with only is preserved.' 00110 ) ); 00111 00112 $this->assertTransformCssMediaCase( array( 00113 'media' => 'print', 00114 'expectedReturn' => 'print', 00115 'message' => 'On screen request, print media type is preserved' 00116 ) ); 00117 } 00118 00123 public function testHandheld() { 00124 $this->assertTransformCssMediaCase( array( 00125 'handheldQuery' => '1', 00126 'media' => 'handheld', 00127 'expectedReturn' => '', 00128 'message' => 'On request with handheld querystring and media is handheld, returns empty string' 00129 ) ); 00130 00131 $this->assertTransformCssMediaCase( array( 00132 'handheldQuery' => '1', 00133 'media' => 'screen', 00134 'expectedReturn' => null, 00135 'message' => 'On request with handheld querystring and media is screen, returns null' 00136 ) ); 00137 } 00138 00139 public static function provideMakeResourceLoaderLink() { 00140 return array( 00141 // Load module script only 00142 array( 00143 array( 'test.foo', ResourceLoaderModule::TYPE_SCRIPTS ), 00144 '<script>if(window.mw){ 00145 document.write("\u003Cscript src=\"http://127.0.0.1:8080/w/load.php?debug=false\u0026amp;lang=en\u0026amp;modules=test.foo\u0026amp;only=scripts\u0026amp;skin=fallback\u0026amp;*\"\u003E\u003C/script\u003E"); 00146 }</script> 00147 ' 00148 ), 00149 array( 00150 // Don't condition wrap raw modules (like the startup module) 00151 array( 'test.raw', ResourceLoaderModule::TYPE_SCRIPTS ), 00152 '<script src="http://127.0.0.1:8080/w/load.php?debug=false&lang=en&modules=test.raw&only=scripts&skin=fallback&*"></script> 00153 ' 00154 ), 00155 // Load module styles only 00156 // This also tests the order the modules are put into the url 00157 array( 00158 array( array( 'test.baz', 'test.foo', 'test.bar' ), ResourceLoaderModule::TYPE_STYLES ), 00159 '<link rel=stylesheet href="http://127.0.0.1:8080/w/load.php?debug=false&lang=en&modules=test.bar%2Cbaz%2Cfoo&only=styles&skin=fallback&*"> 00160 ' 00161 ), 00162 // Load private module (only=scripts) 00163 array( 00164 array( 'test.quux', ResourceLoaderModule::TYPE_SCRIPTS ), 00165 '<script>if(window.mw){ 00166 mw.test.baz({token:123});mw.loader.state({"test.quux":"ready"}); 00167 00168 }</script> 00169 ' 00170 ), 00171 // Load private module (combined) 00172 array( 00173 array( 'test.quux', ResourceLoaderModule::TYPE_COMBINED ), 00174 '<script>if(window.mw){ 00175 mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"css":[".mw-icon{transition:none}\n"]},{}); 00176 00177 }</script> 00178 ' 00179 ), 00180 // Load module script with with ESI 00181 array( 00182 array( 'test.foo', ResourceLoaderModule::TYPE_SCRIPTS, true ), 00183 '<script><esi:include src="http://127.0.0.1:8080/w/load.php?debug=false&lang=en&modules=test.foo&only=scripts&skin=fallback&*" /></script> 00184 ' 00185 ), 00186 // Load module styles with with ESI 00187 array( 00188 array( 'test.foo', ResourceLoaderModule::TYPE_STYLES, true ), 00189 '<style><esi:include src="http://127.0.0.1:8080/w/load.php?debug=false&lang=en&modules=test.foo&only=styles&skin=fallback&*" /></style> 00190 ', 00191 ), 00192 // Load no modules 00193 array( 00194 array( array(), ResourceLoaderModule::TYPE_COMBINED ), 00195 '', 00196 ), 00197 // noscript group 00198 array( 00199 array( 'test.noscript', ResourceLoaderModule::TYPE_STYLES ), 00200 '<noscript><link rel=stylesheet href="http://127.0.0.1:8080/w/load.php?debug=false&lang=en&modules=test.noscript&only=styles&skin=fallback&*"></noscript> 00201 ' 00202 ), 00203 // Load two modules in separate groups 00204 array( 00205 array( array( 'test.group.foo', 'test.group.bar' ), ResourceLoaderModule::TYPE_COMBINED ), 00206 '<script src="http://127.0.0.1:8080/w/load.php?debug=false&lang=en&modules=test.group.bar&skin=fallback&*"></script> 00207 <script src="http://127.0.0.1:8080/w/load.php?debug=false&lang=en&modules=test.group.foo&skin=fallback&*"></script> 00208 ', 00209 ), 00210 ); 00211 } 00212 00217 public function testMakeResourceLoaderLink( $args, $expectedHtml ) { 00218 $this->setMwGlobals( array( 00219 'wgResourceLoaderDebug' => false, 00220 'wgResourceLoaderUseESI' => true, 00221 'wgLoadScript' => 'http://127.0.0.1:8080/w/load.php', 00222 // Affects whether CDATA is inserted 00223 'wgWellFormedXml' => false, 00224 ) ); 00225 $class = new ReflectionClass( 'OutputPage' ); 00226 $method = $class->getMethod( 'makeResourceLoaderLink' ); 00227 $method->setAccessible( true ); 00228 $ctx = new RequestContext(); 00229 $ctx->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'fallback' ) ); 00230 $ctx->setLanguage( 'en' ); 00231 $out = new OutputPage( $ctx ); 00232 $rl = $out->getResourceLoader(); 00233 $rl->register( array( 00234 'test.foo' => new ResourceLoaderTestModule( array( 00235 'script' => 'mw.test.foo( { a: true } );', 00236 'styles' => '.mw-test-foo { content: "style"; }', 00237 )), 00238 'test.bar' => new ResourceLoaderTestModule( array( 00239 'script' => 'mw.test.bar( { a: true } );', 00240 'styles' => '.mw-test-bar { content: "style"; }', 00241 )), 00242 'test.baz' => new ResourceLoaderTestModule( array( 00243 'script' => 'mw.test.baz( { a: true } );', 00244 'styles' => '.mw-test-baz { content: "style"; }', 00245 )), 00246 'test.quux' => new ResourceLoaderTestModule( array( 00247 'script' => 'mw.test.baz( { token: 123 } );', 00248 'styles' => '/* pref-animate=off */ .mw-icon { transition: none; }', 00249 'group' => 'private', 00250 )), 00251 'test.raw' => new ResourceLoaderTestModule( array( 00252 'script' => 'mw.test.baz( { token: 123 } );', 00253 'isRaw' => true, 00254 )), 00255 'test.noscript' => new ResourceLoaderTestModule( array( 00256 'styles' => '.mw-test-noscript { content: "style"; }', 00257 'group' => 'noscript', 00258 )), 00259 'test.group.bar' => new ResourceLoaderTestModule( array( 00260 'styles' => '.mw-group-bar { content: "style"; }', 00261 'group' => 'bar', 00262 )), 00263 'test.group.foo' => new ResourceLoaderTestModule( array( 00264 'styles' => '.mw-group-foo { content: "style"; }', 00265 'group' => 'foo', 00266 )), 00267 ) ); 00268 $links = $method->invokeArgs( $out, $args ); 00269 // Strip comments to avoid variation due to wgDBname in WikiID and cache key 00270 $actualHtml = preg_replace( '#/\*[^*]+\*/#', '', $links['html'] ); 00271 $this->assertEquals( $expectedHtml, $actualHtml ); 00272 } 00273 }