From d825fbb1b8b7a0b9361901dafe0a5468357ef91e Mon Sep 17 00:00:00 2001 From: Trevor Parscal Date: Mon, 20 Sep 2010 21:23:29 +0000 Subject: [PATCH] Added group functionality to ResourceLoaderModule objects. Also fixed a bug that was registering non-ResourceLoaderFileModule objects incorrectly in the startup script. --- includes/ResourceLoader.php | 25 +++++++------ includes/ResourceLoaderModule.php | 58 ++++++++++++++++++++++++++++--- resources/mediawiki/mediawiki.js | 7 ++-- 3 files changed, 73 insertions(+), 17 deletions(-) diff --git a/includes/ResourceLoader.php b/includes/ResourceLoader.php index 555d3413bb..8597bc861e 100644 --- a/includes/ResourceLoader.php +++ b/includes/ResourceLoader.php @@ -176,8 +176,7 @@ class ResourceLoader { } /** - * Gets registration code for all modules, except pre-registered ones listed in - * self::$preRegisteredModules + * Gets registration code for all modules * * @param $context ResourceLoaderContext object * @return String: JavaScript code for registering all modules with the client loader @@ -193,23 +192,29 @@ class ResourceLoader { // Support module loader scripts if ( ( $loader = $module->getLoaderScript() ) !== false ) { $deps = FormatJson::encode( $module->getDependencies() ); - $version = wfTimestamp( TS_ISO_8601, - round( $module->getModifiedTime( $context ), -2 ) ); + $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 );\n"; + "( '$name', '$version', $deps, $group );\n"; } // Automatically register module else { - // Modules without dependencies pass two arguments (name, timestamp) to + // Modules without dependencies or a group pass two arguments (name, timestamp) to // mediaWiki.loader.register() - if ( !count( $module->getDependencies() ) ) { + if ( !count( $module->getDependencies() && $module->getGroup() === null ) ) { $registrations[] = array( $name, $module->getModifiedTime( $context ) ); } - // Modules with dependencies pass three arguments (name, timestamp, dependencies) + // Modules with dependencies but no group pass three arguments (name, timestamp, dependencies) + // to mediaWiki.loader.register() + else if ( $module->getGroup() === null ) { + $registrations[] = array( + $name, $module->getModifiedTime( $context ), $module->getDependencies() ); + } + // Modules with dependencies pass four arguments (name, timestamp, dependencies, group) // to mediaWiki.loader.register() else { - $registrations[] = array( $name, $module->getModifiedTime( $context ), - $module->getDependencies() ); + $registrations[] = array( + $name, $module->getModifiedTime( $context ), $module->getDependencies(), $module->getGroup() ); } } } diff --git a/includes/ResourceLoaderModule.php b/includes/ResourceLoaderModule.php index f883c6f68e..d7c8a8311c 100644 --- a/includes/ResourceLoaderModule.php +++ b/includes/ResourceLoaderModule.php @@ -91,6 +91,16 @@ abstract class ResourceLoaderModule { // Stub, override expected return array(); } + + /** + * Get the group this module is in. + * + * @return string of group name + */ + public function getGroup() { + // Stub, override expected + return null; + } /** * Get the loader JS for this module, if set. @@ -99,7 +109,7 @@ abstract class ResourceLoaderModule { */ public function getLoaderScript() { // Stub, override expected - return ''; + return false; } /** @@ -146,6 +156,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { protected $scripts = array(); protected $styles = array(); protected $messages = array(); + protected $group; protected $dependencies = array(); protected $debugScripts = array(); protected $languageScripts = array(); @@ -170,7 +181,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { * array( * // Required module options (mutually exclusive) * 'scripts' => 'dir/script.js' | array( 'dir/script1.js', 'dir/script2.js' ... ), - * + * * // Optional module options * 'languageScripts' => array( * '[lang name]' => 'dir/lang.js' | '[lang name]' => array( 'dir/lang1.js', 'dir/lang2.js' ... ) @@ -190,6 +201,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { * ... * ), * 'messages' => array( 'message1', 'message2' ... ), + * 'group' => 'stuff', * ) */ public function __construct( $options = array() ) { @@ -204,6 +216,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { case 'messages': $this->messages = (array)$value; break; + case 'group': + $this->group = (string)$value; + break; case 'dependencies': $this->dependencies = (array)$value; break; @@ -253,7 +268,16 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { public function addMessages( $messages ) { $this->messages = array_merge( $this->messages, (array)$messages ); } - + + /** + * Sets the group of this module. + * + * @param $group string group name + */ + public function setGroup( $group ) { + $this->group = $group; + } + /** * Add dependencies. Dependency information is taken into account when * loading a module on the client side. When adding a module on the @@ -403,6 +427,10 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { return $this->messages; } + public function getGroup() { + return $this->group; + } + public function getDependencies() { return $this->dependencies; } @@ -798,6 +826,12 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule { } return $pages; } + + /* Methods */ + + public function getGroup() { + return 'site'; + } } /** @@ -821,6 +855,12 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule { } return array(); } + + /* Methods */ + + public function getGroup() { + return 'user'; + } } /** @@ -848,7 +888,7 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule { if ( $user ) { return $this->modifiedTime[$hash] = $user->getTouched(); } else { - return 0; + return 1; } } @@ -901,6 +941,10 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule { return $wgContLang->getDir() !== $context->getDirection(); } + + public function getGroup() { + return 'user'; + } } class ResourceLoaderStartUpModule extends ResourceLoaderModule { @@ -1034,4 +1078,10 @@ JAVASCRIPT; return $wgContLang->getDir() !== $context->getDirection(); } + + /* Methods */ + + public function getGroup() { + return 'startup'; + } } diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js index 913b0afe5e..14be5c753d 100644 --- a/resources/mediawiki/mediawiki.js +++ b/resources/mediawiki/mediawiki.js @@ -541,7 +541,7 @@ window.mediaWiki = new ( function( $ ) { * Registers a module, letting the system know about it and it's dependencies. loader.js files contain calls * to this function. */ - this.register = function( module, version, dependencies, status ) { + this.register = function( module, version, dependencies, group ) { // Allow multiple registration if ( typeof module === 'object' ) { for ( var m = 0; m < module.length; m++ ) { @@ -557,12 +557,13 @@ window.mediaWiki = new ( function( $ ) { if ( typeof module !== 'string' ) { throw new Error( 'module must be a string, not a ' + typeof module ); } - if ( typeof registry[module] !== 'undefined' && typeof status === 'undefined' ) { + if ( typeof registry[module] !== 'undefined' ) { throw new Error( 'module already implemeneted: ' + module ); } // List the module as registered registry[module] = { - 'state': typeof status === 'string' ? status : 'registered', + 'state': 'registered', + 'group': typeof group === 'string' ? group : null, 'dependencies': [], 'version': typeof version !== 'undefined' ? parseInt( version ) : 0 }; -- 2.20.1