2010-10-19 18:25:42 +00:00
|
|
|
<?php
|
|
|
|
|
/**
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
|
|
|
*
|
|
|
|
|
* @file
|
|
|
|
|
* @author Trevor Parscal
|
|
|
|
|
* @author Roan Kattouw
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
class ResourceLoaderStartUpModule extends ResourceLoaderModule {
|
2010-11-05 18:33:50 +00:00
|
|
|
|
2010-10-19 18:25:42 +00:00
|
|
|
/* Protected Members */
|
|
|
|
|
|
|
|
|
|
protected $modifiedTime = array();
|
|
|
|
|
|
|
|
|
|
/* Protected Methods */
|
2011-02-08 23:09:22 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param $context ResourceLoaderContext
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
2010-10-19 18:25:42 +00:00
|
|
|
protected function getConfig( $context ) {
|
|
|
|
|
global $wgLoadScript, $wgScript, $wgStylePath, $wgScriptExtension,
|
2011-01-04 06:12:33 +00:00
|
|
|
$wgArticlePath, $wgScriptPath, $wgServer, $wgContLang,
|
2010-10-19 18:25:42 +00:00
|
|
|
$wgVariantArticlePath, $wgActionPaths, $wgUseAjax, $wgVersion,
|
|
|
|
|
$wgEnableAPI, $wgEnableWriteAPI, $wgDBname, $wgEnableMWSuggest,
|
2011-02-21 21:24:09 +00:00
|
|
|
$wgSitename, $wgFileExtensions, $wgExtensionAssetsPath, $wgProto;
|
2010-10-19 18:25:42 +00:00
|
|
|
|
|
|
|
|
// Pre-process information
|
|
|
|
|
$separatorTransTable = $wgContLang->separatorTransformTable();
|
|
|
|
|
$separatorTransTable = $separatorTransTable ? $separatorTransTable : array();
|
|
|
|
|
$compactSeparatorTransTable = array(
|
|
|
|
|
implode( "\t", array_keys( $separatorTransTable ) ),
|
|
|
|
|
implode( "\t", $separatorTransTable ),
|
|
|
|
|
);
|
|
|
|
|
$digitTransTable = $wgContLang->digitTransformTable();
|
|
|
|
|
$digitTransTable = $digitTransTable ? $digitTransTable : array();
|
|
|
|
|
$compactDigitTransTable = array(
|
|
|
|
|
implode( "\t", array_keys( $digitTransTable ) ),
|
|
|
|
|
implode( "\t", $digitTransTable ),
|
|
|
|
|
);
|
|
|
|
|
$mainPage = Title::newMainPage();
|
|
|
|
|
|
|
|
|
|
// Build list of variables
|
|
|
|
|
$vars = array(
|
|
|
|
|
'wgLoadScript' => $wgLoadScript,
|
|
|
|
|
'debug' => $context->getDebug(),
|
|
|
|
|
'skin' => $context->getSkin(),
|
|
|
|
|
'stylepath' => $wgStylePath,
|
|
|
|
|
'wgUrlProtocols' => wfUrlProtocols(),
|
|
|
|
|
'wgArticlePath' => $wgArticlePath,
|
|
|
|
|
'wgScriptPath' => $wgScriptPath,
|
|
|
|
|
'wgScriptExtension' => $wgScriptExtension,
|
|
|
|
|
'wgScript' => $wgScript,
|
|
|
|
|
'wgVariantArticlePath' => $wgVariantArticlePath,
|
|
|
|
|
'wgActionPaths' => $wgActionPaths,
|
|
|
|
|
'wgServer' => $wgServer,
|
|
|
|
|
'wgUserLanguage' => $context->getLanguage(),
|
|
|
|
|
'wgContentLanguage' => $wgContLang->getCode(),
|
|
|
|
|
'wgVersion' => $wgVersion,
|
|
|
|
|
'wgEnableAPI' => $wgEnableAPI,
|
|
|
|
|
'wgEnableWriteAPI' => $wgEnableWriteAPI,
|
|
|
|
|
'wgSeparatorTransformTable' => $compactSeparatorTransTable,
|
|
|
|
|
'wgDigitTransformTable' => $compactDigitTransTable,
|
|
|
|
|
'wgMainPageTitle' => $mainPage ? $mainPage->getPrefixedText() : null,
|
|
|
|
|
'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(),
|
|
|
|
|
'wgNamespaceIds' => $wgContLang->getNamespaceIds(),
|
|
|
|
|
'wgSiteName' => $wgSitename,
|
2011-01-12 20:58:36 +00:00
|
|
|
'wgFileExtensions' => array_values( $wgFileExtensions ),
|
2010-10-19 18:25:42 +00:00
|
|
|
'wgDBname' => $wgDBname,
|
2011-01-22 22:34:36 +00:00
|
|
|
// This sucks, it is only needed on Special:Upload, but I could
|
|
|
|
|
// not find a way to add vars only for a certain module
|
|
|
|
|
'wgFileCanRotate' => BitmapHandler::canRotate(),
|
2011-01-23 02:22:27 +00:00
|
|
|
'wgAvailableSkins' => Skin::getSkinNames(),
|
2011-02-16 14:28:26 +00:00
|
|
|
'wgExtensionAssetsPath' => $wgExtensionAssetsPath,
|
2011-02-21 21:24:09 +00:00
|
|
|
'wgProto' => $wgProto,
|
2010-10-19 18:25:42 +00:00
|
|
|
);
|
|
|
|
|
if ( $wgUseAjax && $wgEnableMWSuggest ) {
|
|
|
|
|
$vars['wgMWSuggestTemplate'] = SearchEngine::getMWSuggestTemplate();
|
|
|
|
|
}
|
|
|
|
|
|
2011-01-09 11:44:52 +00:00
|
|
|
wfRunHooks( 'ResourceLoaderGetConfigVars', array( &$vars ) );
|
|
|
|
|
|
2010-10-19 18:25:42 +00:00
|
|
|
return $vars;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Gets registration code for all modules
|
|
|
|
|
*
|
|
|
|
|
* @param $context ResourceLoaderContext object
|
|
|
|
|
* @return String: JavaScript code for registering all modules with the client loader
|
|
|
|
|
*/
|
|
|
|
|
public static function getModuleRegistrations( ResourceLoaderContext $context ) {
|
|
|
|
|
global $wgCacheEpoch;
|
|
|
|
|
wfProfileIn( __METHOD__ );
|
|
|
|
|
|
|
|
|
|
$out = '';
|
|
|
|
|
$registrations = array();
|
* Made Resources.php return a pure-data array instead of an ugly mix of data and code. This allows the class code to be lazy-loaded with the autoloader, for a performance advantage especially on non-APC installs. And using the convention where if the class is omitted, ResourceLoaderFileModule is assumed, the registration code becomes shorter and simpler.
* Modified ResourceLoader to lazy-initialise module objects, for a further performance advantage.
* Deleted ResourceLoader::getModules(), provided getModuleNames() instead. Although the startup module needs this functionality, it's slow to generate, so to avoid misuse, it's better to provide a foolproof fast interface and let the startup module do the slow thing itself.
* Modified ResourceLoader::register() to optionally accept an info array instead of an object.
* Added $wgResourceModules, allowing extensions to efficiently define their own resource loader modules. The trouble with hooks is that they contain code, and code is slow. We've been through all this before with i18n. Hooks are useful as a performance tool only if you call them very rarely.
* Moved ResourceLoader settings to their own section in DefaultSettings.php
* Added options to ResourceLoaderFileModule equivalent to the $localBasePath and $remoteBasePath parameters, to allow it to be instantiated via the new array style. Also added remoteExtPath, which allows modules to be registered before $wgExtensionAssetsPath is known.
* Added OutputPage::getResourceLoader(), mostly for debugging.
* The time saving at the moment is about 5ms per request with no extensions, which is significant already with 6 load.php requests for a cold cache page view. This is a much more scalable interface; the relative saving will grow as more extensions are added which use this interface, especially for non-APC installs.
Although the interface is backwards compatible, extension updates will follow in a subsequent commit.
2010-11-19 10:41:06 +00:00
|
|
|
$resourceLoader = $context->getResourceLoader();
|
|
|
|
|
foreach ( $resourceLoader->getModuleNames() as $name ) {
|
|
|
|
|
$module = $resourceLoader->getModule( $name );
|
2010-10-19 18:25:42 +00:00
|
|
|
// Support module loader scripts
|
* Introduced Xml::encodeJsCall(), to replace the awkward repetitive code that was doing the same thing throughout the resource loader with varying degrees of security and correctness.
* Modified Xml::encodeJsVar() to allow it to pass through JS expressions without encoding, using a special object.
* In ResourceLoader::makeModuleResponse(), renamed $messages to $messagesBlob to make it clear that it's JSON-encoded, not an array.
* Fixed MessageBlobStore to store {} for an empty message array instead of [].
* In ResourceLoader::makeMessageSetScript(), fixed call to non-existent function mediaWiki.msg.set.
* For security, changed the calling convention of makeMessageSetScript() and makeLoaderImplementScript() to require explicit object construction of XmlJsCode() before interpreting their input as JS code.
* Documented several ResourceLoader static functions.
* In ResourceLoaderWikiModule, for readability, reduced the indenting level by flipping some if blocks and adding continue statements.
* In makeCustomLoaderScript(), allow non-numeric $version. The only caller I can find is already sending a non-numeric $version, presumably it was broken. Luckily there aren't any loader scripts in existence, I had to make one to test it.
* wfGetDb -> wfGetDB
* Added an extra line break in the startup module output, for readability.
* In ResourceLoaderStartUpModule::getModuleRegistrations(), fixed another assignment expression
2010-11-04 07:53:37 +00:00
|
|
|
$loader = $module->getLoaderScript();
|
|
|
|
|
if ( $loader !== false ) {
|
2010-10-19 18:25:42 +00:00
|
|
|
$deps = $module->getDependencies();
|
|
|
|
|
$group = $module->getGroup();
|
2010-11-03 07:58:03 +00:00
|
|
|
$version = wfTimestamp( TS_ISO_8601_BASIC,
|
2011-03-20 17:08:38 +00:00
|
|
|
$module->getModifiedTime( $context ) );
|
2010-10-19 18:25:42 +00:00
|
|
|
$out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $loader );
|
|
|
|
|
}
|
|
|
|
|
// Automatically register module
|
|
|
|
|
else {
|
2011-01-13 14:42:19 +00:00
|
|
|
// getModifiedTime() is supposed to return a UNIX timestamp, but it doesn't always
|
|
|
|
|
// seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
|
|
|
|
|
$moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
|
|
|
|
|
$mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
|
2010-10-19 18:25:42 +00:00
|
|
|
// Modules without dependencies or a group pass two arguments (name, timestamp) to
|
2011-02-19 22:59:44 +00:00
|
|
|
// mw.loader.register()
|
2010-10-19 18:25:42 +00:00
|
|
|
if ( !count( $module->getDependencies() && $module->getGroup() === null ) ) {
|
|
|
|
|
$registrations[] = array( $name, $mtime );
|
|
|
|
|
}
|
2010-11-03 07:58:03 +00:00
|
|
|
// Modules with dependencies but no group pass three arguments
|
2011-02-19 22:59:44 +00:00
|
|
|
// (name, timestamp, dependencies) to mw.loader.register()
|
2010-10-19 18:25:42 +00:00
|
|
|
else if ( $module->getGroup() === null ) {
|
|
|
|
|
$registrations[] = array(
|
|
|
|
|
$name, $mtime, $module->getDependencies() );
|
|
|
|
|
}
|
|
|
|
|
// Modules with dependencies pass four arguments (name, timestamp, dependencies, group)
|
2011-02-19 22:59:44 +00:00
|
|
|
// to mw.loader.register()
|
2010-10-19 18:25:42 +00:00
|
|
|
else {
|
|
|
|
|
$registrations[] = array(
|
|
|
|
|
$name, $mtime, $module->getDependencies(), $module->getGroup() );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
$out .= ResourceLoader::makeLoaderRegisterScript( $registrations );
|
|
|
|
|
|
|
|
|
|
wfProfileOut( __METHOD__ );
|
|
|
|
|
return $out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Methods */
|
|
|
|
|
|
|
|
|
|
public function getScript( ResourceLoaderContext $context ) {
|
|
|
|
|
global $IP, $wgLoadScript;
|
|
|
|
|
|
|
|
|
|
$out = file_get_contents( "$IP/resources/startup.js" );
|
|
|
|
|
if ( $context->getOnly() === 'scripts' ) {
|
2011-03-20 17:15:51 +00:00
|
|
|
|
|
|
|
|
// The core modules:
|
|
|
|
|
$modules = array( 'jquery', 'mediawiki' );
|
|
|
|
|
wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$modules ) );
|
|
|
|
|
|
|
|
|
|
// Get the latest version
|
|
|
|
|
$version = 0;
|
|
|
|
|
foreach ( $modules as $moduleName ) {
|
|
|
|
|
$version = max( $version,
|
|
|
|
|
$context->getResourceLoader()->getModule( $moduleName )->getModifiedTime( $context )
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
// Build load query for StartupModules
|
2010-10-19 18:25:42 +00:00
|
|
|
$query = array(
|
2011-03-20 17:15:51 +00:00
|
|
|
'modules' => implode( '|', $modules ),
|
2010-10-19 18:25:42 +00:00
|
|
|
'only' => 'scripts',
|
|
|
|
|
'lang' => $context->getLanguage(),
|
|
|
|
|
'skin' => $context->getSkin(),
|
|
|
|
|
'debug' => $context->getDebug() ? 'true' : 'false',
|
2011-03-20 17:15:51 +00:00
|
|
|
'version' => wfTimestamp( TS_ISO_8601_BASIC, round( $version, -2 ) )
|
2010-10-19 18:25:42 +00:00
|
|
|
);
|
|
|
|
|
// Ensure uniform query order
|
|
|
|
|
ksort( $query );
|
|
|
|
|
|
|
|
|
|
// Startup function
|
* Introduced Xml::encodeJsCall(), to replace the awkward repetitive code that was doing the same thing throughout the resource loader with varying degrees of security and correctness.
* Modified Xml::encodeJsVar() to allow it to pass through JS expressions without encoding, using a special object.
* In ResourceLoader::makeModuleResponse(), renamed $messages to $messagesBlob to make it clear that it's JSON-encoded, not an array.
* Fixed MessageBlobStore to store {} for an empty message array instead of [].
* In ResourceLoader::makeMessageSetScript(), fixed call to non-existent function mediaWiki.msg.set.
* For security, changed the calling convention of makeMessageSetScript() and makeLoaderImplementScript() to require explicit object construction of XmlJsCode() before interpreting their input as JS code.
* Documented several ResourceLoader static functions.
* In ResourceLoaderWikiModule, for readability, reduced the indenting level by flipping some if blocks and adding continue statements.
* In makeCustomLoaderScript(), allow non-numeric $version. The only caller I can find is already sending a non-numeric $version, presumably it was broken. Luckily there aren't any loader scripts in existence, I had to make one to test it.
* wfGetDb -> wfGetDB
* Added an extra line break in the startup module output, for readability.
* In ResourceLoaderStartUpModule::getModuleRegistrations(), fixed another assignment expression
2010-11-04 07:53:37 +00:00
|
|
|
$configuration = $this->getConfig( $context );
|
2010-10-19 18:25:42 +00:00
|
|
|
$registrations = self::getModuleRegistrations( $context );
|
2010-11-03 07:58:03 +00:00
|
|
|
$out .= "var startUp = function() {\n" .
|
|
|
|
|
"\t$registrations\n" .
|
2011-02-19 23:52:11 +00:00
|
|
|
"\t" . Xml::encodeJsCall( 'mediaWiki.config.set', array( $configuration ) ) .
|
* Introduced Xml::encodeJsCall(), to replace the awkward repetitive code that was doing the same thing throughout the resource loader with varying degrees of security and correctness.
* Modified Xml::encodeJsVar() to allow it to pass through JS expressions without encoding, using a special object.
* In ResourceLoader::makeModuleResponse(), renamed $messages to $messagesBlob to make it clear that it's JSON-encoded, not an array.
* Fixed MessageBlobStore to store {} for an empty message array instead of [].
* In ResourceLoader::makeMessageSetScript(), fixed call to non-existent function mediaWiki.msg.set.
* For security, changed the calling convention of makeMessageSetScript() and makeLoaderImplementScript() to require explicit object construction of XmlJsCode() before interpreting their input as JS code.
* Documented several ResourceLoader static functions.
* In ResourceLoaderWikiModule, for readability, reduced the indenting level by flipping some if blocks and adding continue statements.
* In makeCustomLoaderScript(), allow non-numeric $version. The only caller I can find is already sending a non-numeric $version, presumably it was broken. Luckily there aren't any loader scripts in existence, I had to make one to test it.
* wfGetDb -> wfGetDB
* Added an extra line break in the startup module output, for readability.
* In ResourceLoaderStartUpModule::getModuleRegistrations(), fixed another assignment expression
2010-11-04 07:53:37 +00:00
|
|
|
"};\n";
|
2010-10-19 18:25:42 +00:00
|
|
|
|
|
|
|
|
// Conditional script injection
|
* Introduced Xml::encodeJsCall(), to replace the awkward repetitive code that was doing the same thing throughout the resource loader with varying degrees of security and correctness.
* Modified Xml::encodeJsVar() to allow it to pass through JS expressions without encoding, using a special object.
* In ResourceLoader::makeModuleResponse(), renamed $messages to $messagesBlob to make it clear that it's JSON-encoded, not an array.
* Fixed MessageBlobStore to store {} for an empty message array instead of [].
* In ResourceLoader::makeMessageSetScript(), fixed call to non-existent function mediaWiki.msg.set.
* For security, changed the calling convention of makeMessageSetScript() and makeLoaderImplementScript() to require explicit object construction of XmlJsCode() before interpreting their input as JS code.
* Documented several ResourceLoader static functions.
* In ResourceLoaderWikiModule, for readability, reduced the indenting level by flipping some if blocks and adding continue statements.
* In makeCustomLoaderScript(), allow non-numeric $version. The only caller I can find is already sending a non-numeric $version, presumably it was broken. Luckily there aren't any loader scripts in existence, I had to make one to test it.
* wfGetDb -> wfGetDB
* Added an extra line break in the startup module output, for readability.
* In ResourceLoaderStartUpModule::getModuleRegistrations(), fixed another assignment expression
2010-11-04 07:53:37 +00:00
|
|
|
$scriptTag = Html::linkedScript( $wgLoadScript . '?' . wfArrayToCGI( $query ) );
|
2010-11-03 07:58:03 +00:00
|
|
|
$out .= "if ( isCompatible() ) {\n" .
|
* Introduced Xml::encodeJsCall(), to replace the awkward repetitive code that was doing the same thing throughout the resource loader with varying degrees of security and correctness.
* Modified Xml::encodeJsVar() to allow it to pass through JS expressions without encoding, using a special object.
* In ResourceLoader::makeModuleResponse(), renamed $messages to $messagesBlob to make it clear that it's JSON-encoded, not an array.
* Fixed MessageBlobStore to store {} for an empty message array instead of [].
* In ResourceLoader::makeMessageSetScript(), fixed call to non-existent function mediaWiki.msg.set.
* For security, changed the calling convention of makeMessageSetScript() and makeLoaderImplementScript() to require explicit object construction of XmlJsCode() before interpreting their input as JS code.
* Documented several ResourceLoader static functions.
* In ResourceLoaderWikiModule, for readability, reduced the indenting level by flipping some if blocks and adding continue statements.
* In makeCustomLoaderScript(), allow non-numeric $version. The only caller I can find is already sending a non-numeric $version, presumably it was broken. Luckily there aren't any loader scripts in existence, I had to make one to test it.
* wfGetDb -> wfGetDB
* Added an extra line break in the startup module output, for readability.
* In ResourceLoaderStartUpModule::getModuleRegistrations(), fixed another assignment expression
2010-11-04 07:53:37 +00:00
|
|
|
"\t" . Xml::encodeJsCall( 'document.write', array( $scriptTag ) ) .
|
2010-11-03 07:58:03 +00:00
|
|
|
"}\n" .
|
|
|
|
|
"delete isCompatible;";
|
2010-10-19 18:25:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function getModifiedTime( ResourceLoaderContext $context ) {
|
|
|
|
|
global $IP, $wgCacheEpoch;
|
|
|
|
|
|
|
|
|
|
$hash = $context->getHash();
|
|
|
|
|
if ( isset( $this->modifiedTime[$hash] ) ) {
|
|
|
|
|
return $this->modifiedTime[$hash];
|
|
|
|
|
}
|
|
|
|
|
|
2010-12-23 21:01:54 +00:00
|
|
|
// Call preloadModuleInfo() on ALL modules as we're about
|
|
|
|
|
// to call getModifiedTime() on all of them
|
|
|
|
|
$loader = $context->getResourceLoader();
|
|
|
|
|
$loader->preloadModuleInfo( $loader->getModuleNames(), $context );
|
|
|
|
|
|
|
|
|
|
$this->modifiedTime[$hash] = filemtime( "$IP/resources/startup.js" );
|
|
|
|
|
// ATTENTION!: Because of the line above, this is not going to cause
|
2010-11-03 07:58:03 +00:00
|
|
|
// infinite recursion - think carefully before making changes to this
|
|
|
|
|
// code!
|
2010-10-19 18:25:42 +00:00
|
|
|
$time = wfTimestamp( TS_UNIX, $wgCacheEpoch );
|
* Made Resources.php return a pure-data array instead of an ugly mix of data and code. This allows the class code to be lazy-loaded with the autoloader, for a performance advantage especially on non-APC installs. And using the convention where if the class is omitted, ResourceLoaderFileModule is assumed, the registration code becomes shorter and simpler.
* Modified ResourceLoader to lazy-initialise module objects, for a further performance advantage.
* Deleted ResourceLoader::getModules(), provided getModuleNames() instead. Although the startup module needs this functionality, it's slow to generate, so to avoid misuse, it's better to provide a foolproof fast interface and let the startup module do the slow thing itself.
* Modified ResourceLoader::register() to optionally accept an info array instead of an object.
* Added $wgResourceModules, allowing extensions to efficiently define their own resource loader modules. The trouble with hooks is that they contain code, and code is slow. We've been through all this before with i18n. Hooks are useful as a performance tool only if you call them very rarely.
* Moved ResourceLoader settings to their own section in DefaultSettings.php
* Added options to ResourceLoaderFileModule equivalent to the $localBasePath and $remoteBasePath parameters, to allow it to be instantiated via the new array style. Also added remoteExtPath, which allows modules to be registered before $wgExtensionAssetsPath is known.
* Added OutputPage::getResourceLoader(), mostly for debugging.
* The time saving at the moment is about 5ms per request with no extensions, which is significant already with 6 load.php requests for a cold cache page view. This is a much more scalable interface; the relative saving will grow as more extensions are added which use this interface, especially for non-APC installs.
Although the interface is backwards compatible, extension updates will follow in a subsequent commit.
2010-11-19 10:41:06 +00:00
|
|
|
foreach ( $loader->getModuleNames() as $name ) {
|
|
|
|
|
$module = $loader->getModule( $name );
|
2010-10-19 18:25:42 +00:00
|
|
|
$time = max( $time, $module->getModifiedTime( $context ) );
|
|
|
|
|
}
|
|
|
|
|
return $this->modifiedTime[$hash] = $time;
|
|
|
|
|
}
|
|
|
|
|
|
2011-02-18 00:33:45 +00:00
|
|
|
/**
|
|
|
|
|
* @param $context ResourceLoaderContext
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
2010-10-19 18:25:42 +00:00
|
|
|
public function getFlip( $context ) {
|
|
|
|
|
global $wgContLang;
|
|
|
|
|
|
|
|
|
|
return $wgContLang->getDir() !== $context->getDirection();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Methods */
|
|
|
|
|
|
|
|
|
|
public function getGroup() {
|
|
|
|
|
return 'startup';
|
|
|
|
|
}
|
|
|
|
|
}
|