Work in progress on ResourceLoader mobilification
authorBrion Vibber <brion@pobox.com>
Thu, 11 Oct 2012 22:37:59 +0000 (15:37 -0700)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 18 Oct 2012 00:55:54 +0000 (00:55 +0000)
Goes along with MobileFrontend changes: https://gerrit.wikimedia.org/r/28434

Adds 'targets' option to module definitions, defaulting to 'desktop'.
Only a couple more modules are whitelisted into both desktop and mobile for now.

Startup module takes a 'target' parameter (defaults to 'desktop') to filter
the resource module registration list. Only modules matching the filter get
registered, and thus will be loadable from client-side RL.

Change-Id: Ifb772d4995b8e2ec4b63776fe0bb5b0214f82e04

includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
resources/Resources.php

index aa177f8..db4c758 100644 (file)
@@ -113,6 +113,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        protected $debugRaw = true;
        /** Boolean: Whether mw.loader.state() call should be omitted */
        protected $raw = false;
+       protected $targets = array( 'desktop' );
+
        /**
         * Array: Cache for mtime
         * @par Usage:
@@ -232,6 +234,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                // Lists of strings
                                case 'dependencies':
                                case 'messages':
+                               case 'targets':
                                        $this->{$member} = (array) $option;
                                        break;
                                // Single strings
@@ -670,4 +673,14 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        public function getFlip( $context ) {
                return $context->getDirection() === 'rtl';
        }
+
+       /**
+        * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
+        *
+        * @return array of strings
+        */
+       public function getTargets() {
+               return $this->targets;
+       }
+
 }
index e364b71..c570f0a 100644 (file)
@@ -450,4 +450,13 @@ abstract class ResourceLoaderModule {
                return self::$jsParser;
        }
 
+       /**
+        * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
+        * Default implementation hardcodes 'desktop'.
+        *
+        * @return array of strings
+        */
+       public function getTargets() {
+               return array( 'desktop' );
+       }
 }
index 20ee83f..4979047 100644 (file)
@@ -114,6 +114,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                $out = '';
                $registrations = array();
                $resourceLoader = $context->getResourceLoader();
+               $target = $context->getRequest()->getVal( 'target', 'desktop' );
 
                // Register sources
                $out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
@@ -121,41 +122,44 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register modules
                foreach ( $resourceLoader->getModuleNames() as $name ) {
                        $module = $resourceLoader->getModule( $name );
-                       $deps = $module->getDependencies();
-                       $group = $module->getGroup();
-                       $source = $module->getSource();
-                       // Support module loader scripts
-                       $loader = $module->getLoaderScript();
-                       if ( $loader !== false ) {
-                               $version = wfTimestamp( TS_ISO_8601_BASIC,
-                                       $module->getModifiedTime( $context ) );
-                               $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $source, $loader );
-                       }
-                       // Automatically register module
-                       else {
-                               // 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 ) );
-                               // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
-                               // mw.loader.register()
-                               if ( !count( $deps ) && $group === null && $source === 'local' ) {
-                                       $registrations[] = array( $name, $mtime );
-                               }
-                               // Modules with dependencies but no group or foreign source pass three arguments
-                               // (name, timestamp, dependencies) to mw.loader.register()
-                               elseif ( $group === null && $source === 'local' ) {
-                                       $registrations[] = array( $name, $mtime, $deps );
-                               }
-                               // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
-                               // to mw.loader.register()
-                               elseif ( $source === 'local' ) {
-                                       $registrations[] = array( $name, $mtime, $deps, $group );
+                       $moduleTargets = $module->getTargets();
+                       if ( in_array( $target, $moduleTargets ) ) {
+                               $deps = $module->getDependencies();
+                               $group = $module->getGroup();
+                               $source = $module->getSource();
+                               // Support module loader scripts
+                               $loader = $module->getLoaderScript();
+                               if ( $loader !== false ) {
+                                       $version = wfTimestamp( TS_ISO_8601_BASIC,
+                                               $module->getModifiedTime( $context ) );
+                                       $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $source, $loader );
                                }
-                               // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
-                               // to mw.loader.register()
+                               // Automatically register module
                                else {
-                                       $registrations[] = array( $name, $mtime, $deps, $group, $source );
+                                       // 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 ) );
+                                       // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
+                                       // mw.loader.register()
+                                       if ( !count( $deps ) && $group === null && $source === 'local' ) {
+                                               $registrations[] = array( $name, $mtime );
+                                       }
+                                       // Modules with dependencies but no group or foreign source pass three arguments
+                                       // (name, timestamp, dependencies) to mw.loader.register()
+                                       elseif ( $group === null && $source === 'local' ) {
+                                               $registrations[] = array( $name, $mtime, $deps );
+                                       }
+                                       // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
+                                       // to mw.loader.register()
+                                       elseif ( $source === 'local' ) {
+                                               $registrations[] = array( $name, $mtime, $deps, $group );
+                                       }
+                                       // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
+                                       // to mw.loader.register()
+                                       else {
+                                               $registrations[] = array( $name, $mtime, $deps, $group, $source );
+                                       }
                                }
                        }
                }
index c906143..4ec8b3e 100644 (file)
@@ -108,6 +108,7 @@ return array(
        'jquery' => array(
                'scripts' => 'resources/jquery/jquery.js',
                'debugRaw' => false,
+               'targets' => array( 'desktop', 'mobile' ),
        ),
 
        /* jQuery Plugins */
@@ -180,6 +181,7 @@ return array(
        ),
        'jquery.hidpi' => array(
                'scripts' => 'resources/jquery/jquery.hidpi.js',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.highlightText' => array(
                'scripts' => 'resources/jquery/jquery.highlightText.js',
@@ -549,6 +551,7 @@ return array(
                'scripts' => 'resources/mediawiki/mediawiki.js',
                'debugScripts' => 'resources/mediawiki/mediawiki.log.js',
                'debugRaw' => false,
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api' => array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.js',
@@ -629,6 +632,7 @@ return array(
                'dependencies' => array(
                        'jquery.hidpi',
                ),
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.htmlform' => array(
                'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',