From 4b3a426ae08389436cd337a109de4888dc445250 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 11 Oct 2012 15:37:59 -0700 Subject: [PATCH] Work in progress on ResourceLoader mobilification 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 --- .../ResourceLoaderFileModule.php | 13 ++++ .../resourceloader/ResourceLoaderModule.php | 9 +++ .../ResourceLoaderStartUpModule.php | 70 ++++++++++--------- resources/Resources.php | 4 ++ 4 files changed, 63 insertions(+), 33 deletions(-) diff --git a/includes/resourceloader/ResourceLoaderFileModule.php b/includes/resourceloader/ResourceLoaderFileModule.php index aa177f8a03..db4c758ba1 100644 --- a/includes/resourceloader/ResourceLoaderFileModule.php +++ b/includes/resourceloader/ResourceLoaderFileModule.php @@ -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; + } + } diff --git a/includes/resourceloader/ResourceLoaderModule.php b/includes/resourceloader/ResourceLoaderModule.php index e364b712f0..c570f0ac40 100644 --- a/includes/resourceloader/ResourceLoaderModule.php +++ b/includes/resourceloader/ResourceLoaderModule.php @@ -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' ); + } } diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php index 20ee83f9c7..49790473e7 100644 --- a/includes/resourceloader/ResourceLoaderStartUpModule.php +++ b/includes/resourceloader/ResourceLoaderStartUpModule.php @@ -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 ); + } } } } diff --git a/resources/Resources.php b/resources/Resources.php index c906143e98..4ec8b3e61e 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -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', -- 2.20.1