Added group functionality to ResourceLoaderModule objects. Also fixed a bug that...
authorTrevor Parscal <tparscal@users.mediawiki.org>
Mon, 20 Sep 2010 21:23:29 +0000 (21:23 +0000)
committerTrevor Parscal <tparscal@users.mediawiki.org>
Mon, 20 Sep 2010 21:23:29 +0000 (21:23 +0000)
includes/ResourceLoader.php
includes/ResourceLoaderModule.php
resources/mediawiki/mediawiki.js

index 555d341..8597bc8 100644 (file)
@@ -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() );
                                }
                        }
                }
index f883c6f..d7c8a83 100644 (file)
@@ -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';
+       }
 }
index 913b0af..14be5c7 100644 (file)
@@ -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
                        };