From 066588f12a8d976f514ccf87df45a860c5119bf8 Mon Sep 17 00:00:00 2001 From: Trevor Parscal Date: Fri, 24 Sep 2010 21:03:29 +0000 Subject: [PATCH] Moved more generated javascript to ResourceLoader functions. Cleaned some things up in the startup module. --- includes/ResourceLoader.php | 43 +++++++++++++++++++++++++++++++ includes/ResourceLoaderModule.php | 34 +++++++++++------------- 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/includes/ResourceLoader.php b/includes/ResourceLoader.php index 6da7ffacc3..c6f9ce2a05 100644 --- a/includes/ResourceLoader.php +++ b/includes/ResourceLoader.php @@ -437,4 +437,47 @@ class ResourceLoader { 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"; + } + } } diff --git a/includes/ResourceLoaderModule.php b/includes/ResourceLoaderModule.php index a27502b353..5b9f900d41 100644 --- a/includes/ResourceLoaderModule.php +++ b/includes/ResourceLoaderModule.php @@ -1048,7 +1048,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { public static function getModuleRegistrations( ResourceLoaderContext $context ) { wfProfileIn( __METHOD__ ); - $scripts = ''; + $out = ''; $registrations = array(); foreach ( ResourceLoader::getModules() as $name => $module ) { // Support module loader scripts @@ -1056,8 +1056,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { $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 { @@ -1080,7 +1079,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { } } } - $out = $scripts . "mediaWiki.loader.register( " . FormatJson::encode( $registrations ) . " );"; + $out .= ResourceLoader::makeLoaderRegisterScript( $registrations ); wfProfileOut( __METHOD__ ); return $out; @@ -1091,14 +1090,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { 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' ) ), @@ -1111,17 +1104,20 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { 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 ) { -- 2.20.1