return "mediaWiki.loader.state( '$name', '$state' );\n";
}
}
+
+ public static function makeCustomLoaderScript( $name, $version, $dependencies, $group, $script ) {
+ $name = Xml::escapeJsString( $name );
+ $version = (int) $version > 1 ? (int) $version : 1;
+ if ( is_array( $dependencies ) ) {
+ $dependencies = FormatJson::encode( $dependencies );
+ } else if ( is_string( $dependencies ) ) {
+ $dependencies = "'" . Xml::escapeJsString( $dependencies ) . "'";
+ } else {
+ $dependencies = 'null';
+ }
+ if ( is_string( $group ) ) {
+ $group = "'" . Xml::escapeJsString( $group ) . "'";
+ } else {
+ $group = 'null';
+ }
+ $script = str_replace( "\n", "\n\t", trim( $script ) );
+ return "( function( name, version, dependencies ) {\t$script\t} )" .
+ "( '$name', $version, $dependencies, $group );\n";
+ }
+
+ public static function makeLoaderRegisterScript( $name, $version = null, $dependencies = null, $group = null ) {
+ if ( is_array( $name ) ) {
+ $registrations = FormatJson::encode( $name );
+ return "mediaWiki.loader.register( $registrations );\n";
+ } else {
+ $name = Xml::escapeJsString( $name );
+ $version = (int) $version > 1 ? (int) $version : 1;
+ if ( is_array( $dependencies ) ) {
+ $dependencies = FormatJson::encode( $dependencies );
+ } else if ( is_string( $dependencies ) ) {
+ $dependencies = "'" . Xml::escapeJsString( $dependencies ) . "'";
+ } else {
+ $dependencies = 'null';
+ }
+ if ( is_string( $group ) ) {
+ $group = "'" . Xml::escapeJsString( $group ) . "'";
+ } else {
+ $group = 'null';
+ }
+ return "mediaWiki.loader.register( '$name', $version, $dependencies, $group );\n";
+ }
+ }
}
public static function getModuleRegistrations( ResourceLoaderContext $context ) {
wfProfileIn( __METHOD__ );
- $scripts = '';
+ $out = '';
$registrations = array();
foreach ( ResourceLoader::getModules() as $name => $module ) {
// Support module loader scripts
$deps = FormatJson::encode( $module->getDependencies() );
$group = FormatJson::encode( $module->getGroup() );
$version = wfTimestamp( TS_ISO_8601, round( $module->getModifiedTime( $context ), -2 ) );
- $scripts .= "( function( name, version, dependencies ) { $loader } )\n" .
- "( '$name', '$version', $deps, $group );\n";
+ $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $loader );
}
// Automatically register module
else {
}
}
}
- $out = $scripts . "mediaWiki.loader.register( " . FormatJson::encode( $registrations ) . " );";
+ $out .= ResourceLoader::makeLoaderRegisterScript( $registrations );
wfProfileOut( __METHOD__ );
return $out;
public function getScript( ResourceLoaderContext $context ) {
global $IP, $wgLoadScript;
- $scripts = file_get_contents( "$IP/resources/startup.js" );
+ $out = file_get_contents( "$IP/resources/startup.js" );
if ( $context->getOnly() === 'scripts' ) {
- // Get all module registrations
- $registration = self::getModuleRegistrations( $context );
- // Build configuration
- $config = FormatJson::encode( $this->getConfig( $context ) );
- // Add a well-known start-up function
- $scripts .= "window.startUp = function() {\n\t$registration\n\tmediaWiki.config.set( $config );\n};\n";
// Build load query for jquery and mediawiki modules
$query = array(
'modules' => implode( '|', array( 'jquery', 'mediawiki' ) ),
ResourceLoader::getModule( 'mediawiki' )->getModifiedTime( $context )
), -2 ) )
);
- // Uniform query order
+ // Ensure uniform query order
ksort( $query );
- // Build HTML code for loading jquery and mediawiki modules
- $loadScript = Html::linkedScript( $wgLoadScript . '?' . wfArrayToCGI( $query ) );
- // Add code to add jquery and mediawiki loading code; only if the current client is compatible
- $scripts .= "if ( isCompatible() ) {\n\tdocument.write( " . FormatJson::encode( $loadScript ) . ");\n}\n";
- // Delete the compatible function - it's not needed anymore
- $scripts .= "delete window['isCompatible'];\n";
+
+ // Startup function
+ $configuration = FormatJson::encode( $this->getConfig( $context ) );
+ $registrations = self::getModuleRegistrations( $context );
+ $out .= "window.startUp = function() {\n\t$registrations\n\tmediaWiki.config.set( $configuration );\n};";
+
+ // Conditional script injection
+ $scriptTag = Xml::escapeJsString( Html::linkedScript( $wgLoadScript . '?' . wfArrayToCGI( $query ) ) );
+ $out .= "if ( isCompatible() ) {\n\tdocument.write( '$scriptTag' );\n}\ndelete window['isCompatible'];";
}
- return $scripts;
+ return $out;
}
public function getModifiedTime( ResourceLoaderContext $context ) {