$wgResourceLoaderMinifierMaxLineLength = 1000;
/**
- * Whether to include the mediawiki.legacy JS library (old wikibits.js), and its
- * dependencies.
+ * Whether to ensure the mediawiki.legacy library is loaded before other modules.
+ *
+ * @deprecated since 1.26: Always declare dependencies.
*/
$wgIncludeLegacyJavaScript = true;
/**
- * Whether to preload the mediawiki.util module as blocking module in the top
- * queue.
+ * Whether to ensure the mediawiki.util is loaded before other modules.
*
- * Before MediaWiki 1.19, modules used to load slower/less asynchronous which
- * allowed modules to lack dependencies on 'popular' modules that were likely
- * loaded already.
+ * Before MediaWiki 1.19, modules used to load less asynchronous which allowed
+ * modules to lack dependencies on 'popular' modules that were likely loaded already.
*
* This setting is to aid scripts during migration by providing mediawiki.util
- * unconditionally (which was the most commonly missed dependency).
- * It doesn't cover all missing dependencies obviously but should fix most of
- * them.
+ * unconditionally (which was the most commonly missed dependency). It doesn't
+ * cover all missing dependencies obviously but should fix most of them.
*
* This should be removed at some point after site/user scripts have been fixed.
* Enable this if your wiki has a large amount of user/site scripts that are
* lacking dependencies.
- * @todo Deprecate
+ *
+ * @deprecated since 1.26: Always declare dependencies.
*/
$wgPreloadJavaScriptMwUtil = false;
'wgLegalTitleChars' => Title::convertByteClassToUnicodeClass( Title::legalChars() ),
'wgResourceLoaderStorageVersion' => $conf->get( 'ResourceLoaderStorageVersion' ),
'wgResourceLoaderStorageEnabled' => $conf->get( 'ResourceLoaderStorageEnabled' ),
+ 'wgResourceLoaderLegacyModules' => self::getLegacyModules(),
);
Hooks::run( 'ResourceLoaderGetConfigVars', array( &$vars ) );
return array( 'jquery', 'mediawiki' );
}
+ public static function getLegacyModules() {
+ global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil;
+
+ $legacyModules = array();
+ if ( $wgIncludeLegacyJavaScript ) {
+ $legacyModules[] = 'mediawiki.legacy.wikibits';
+ }
+ if ( $wgPreloadJavaScriptMwUtil ) {
+ $legacyModules[] = 'mediawiki.util';
+ }
+
+ return $legacyModules;
+ }
+
/**
* Get the load URL of the startup modules.
*
* @return array Array of modules with helper keys for easy overriding
*/
public function getDefaultModules() {
- global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
- $wgAjaxWatch, $wgEnableAPI, $wgEnableWriteAPI;
+ global $wgUseAjax, $wgAjaxWatch, $wgEnableAPI, $wgEnableWriteAPI;
$out = $this->getOutput();
$user = $out->getUser();
'mediawiki.page.ready',
),
// modules that exist for legacy reasons
- 'legacy' => array(),
+ 'legacy' => ResourceLoaderStartUpModule::getLegacyModules(),
// modules relating to search functionality
'search' => array(),
// modules relating to functionality relating to watching an article
// modules which relate to the current users preferences
'user' => array(),
);
- if ( $wgIncludeLegacyJavaScript ) {
- $modules['legacy'][] = 'mediawiki.legacy.wikibits';
- }
-
- if ( $wgPreloadJavaScriptMwUtil ) {
- $modules['legacy'][] = 'mediawiki.util';
- }
// Add various resources if required
if ( $wgUseAjax ) {
}
function runScript() {
- var script, markModuleReady, nestedAddScript;
+ var script, markModuleReady, nestedAddScript, legacyWait,
+ // Expand to include dependencies since we have to exclude both legacy modules
+ // and their dependencies from the legacyWait (to prevent a circular dependency).
+ legacyModules = resolve( mw.config.get( 'wgResourceLoaderLegacyModules', [] ) );
try {
script = registry[module].script;
markModuleReady = function () {
} );
};
- if ( $.isArray( script ) ) {
- nestedAddScript( script, markModuleReady, 0 );
- } else if ( $.isFunction( script ) ) {
- // Pass jQuery twice so that the signature of the closure which wraps
- // the script can bind both '$' and 'jQuery'.
- registry[module].state = 'ready';
- script( $, $ );
- handlePending( module );
- } else if ( typeof script === 'string' ) {
- // Site and user modules are a legacy scripts that run in the global scope.
- // This is transported as a string instead of a function to avoid needing
- // to use string manipulation to undo the function wrapper.
- if ( module === 'user' ) {
- // Implicit dependency on the site module. Not real dependency because
- // it should run after 'site' regardless of whether it succeeds or fails.
- mw.loader.using( 'site' ).always( function () {
+ legacyWait = ( $.inArray( module, legacyModules ) !== -1 )
+ ? $.Deferred().resolve()
+ : mw.loader.using( legacyModules );
+
+ legacyWait.always( function () {
+ if ( $.isArray( script ) ) {
+ nestedAddScript( script, markModuleReady, 0 );
+ } else if ( $.isFunction( script ) ) {
+ // Pass jQuery twice so that the signature of the closure which wraps
+ // the script can bind both '$' and 'jQuery'.
+ registry[module].state = 'ready';
+ script( $, $ );
+ handlePending( module );
+ } else if ( typeof script === 'string' ) {
+ // Site and user modules are a legacy scripts that run in the global scope.
+ // This is transported as a string instead of a function to avoid needing
+ // to use string manipulation to undo the function wrapper.
+ if ( module === 'user' ) {
+ // Implicit dependency on the site module. Not real dependency because
+ // it should run after 'site' regardless of whether it succeeds or fails.
+ mw.loader.using( 'site' ).always( function () {
+ registry[module].state = 'ready';
+ $.globalEval( script );
+ handlePending( module );
+ } );
+ } else {
registry[module].state = 'ready';
$.globalEval( script );
handlePending( module );
- } );
- } else {
- registry[module].state = 'ready';
- $.globalEval( script );
- handlePending( module );
+ }
}
- }
+ } );
} catch ( e ) {
// This needs to NOT use mw.log because these errors are common in production mode
// and not in debug mode, such as when a symbol that should be global isn't exported