From cd7923ac16c5182490e5d89f704cf3d9edb453f0 Mon Sep 17 00:00:00 2001 From: Max Semenik Date: Fri, 11 May 2012 23:16:29 +0400 Subject: [PATCH] Introduced the concept of raw ResourceLoader modules This is needed for mobile scripts that are supposed to work on dumb devices and as such can't rely on client-side RL, but still can take advantage of server-side minification and concatenation. Patchset 2: Allow loading raw modules with &raw=true appended to URL. Change-Id: I9410ffbf6633075e07bd06b10a98a4d12d9b6106 --- includes/resourceloader/ResourceLoader.php | 8 ++++---- includes/resourceloader/ResourceLoaderContext.php | 9 +++++++++ includes/resourceloader/ResourceLoaderFileModule.php | 10 ++++++++++ includes/resourceloader/ResourceLoaderModule.php | 11 +++++++++++ .../resourceloader/ResourceLoaderStartUpModule.php | 7 +++++++ 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index 42fd8734e8..9e884942fb 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -685,6 +685,7 @@ class ResourceLoader { } // Generate output + $isRaw = false; foreach ( $modules as $name => $module ) { /** * @var $module ResourceLoaderModule @@ -763,15 +764,14 @@ class ResourceLoader { $missing[] = $name; unset( $modules[$name] ); } + $isRaw |= $module->isRaw(); wfProfileOut( __METHOD__ . '-' . $name ); } // Update module states - if ( $context->shouldIncludeScripts() ) { + if ( $context->shouldIncludeScripts() && !$context->getRaw() && !$isRaw ) { // Set the state of modules loaded as only scripts to ready - if ( count( $modules ) && $context->getOnly() === 'scripts' - && !isset( $modules['startup'] ) ) - { + if ( count( $modules ) && $context->getOnly() === 'scripts' ) { $out .= self::makeLoaderStateScript( array_fill_keys( array_keys( $modules ), 'ready' ) ); } diff --git a/includes/resourceloader/ResourceLoaderContext.php b/includes/resourceloader/ResourceLoaderContext.php index 4e28e76b44..87a3c2df31 100644 --- a/includes/resourceloader/ResourceLoaderContext.php +++ b/includes/resourceloader/ResourceLoaderContext.php @@ -41,6 +41,7 @@ class ResourceLoaderContext { protected $only; protected $version; protected $hash; + protected $raw; /* Methods */ @@ -64,6 +65,7 @@ class ResourceLoaderContext { $this->debug = $request->getFuzzyBool( 'debug', $wgResourceLoaderDebug ); $this->only = $request->getVal( 'only' ); $this->version = $request->getVal( 'version' ); + $this->raw = $request->getFuzzyBool( 'raw' ); $skinnames = Skin::getSkinNames(); // If no skin is specified, or we don't recognize the skin, use the default skin @@ -200,6 +202,13 @@ class ResourceLoaderContext { return $this->version; } + /** + * @return bool + */ + public function getRaw() { + return $this->raw; + } + /** * @return bool */ diff --git a/includes/resourceloader/ResourceLoaderFileModule.php b/includes/resourceloader/ResourceLoaderFileModule.php index e8542acbaf..f0892ec2a8 100644 --- a/includes/resourceloader/ResourceLoaderFileModule.php +++ b/includes/resourceloader/ResourceLoaderFileModule.php @@ -111,6 +111,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { protected $position = 'bottom'; /** Boolean: Link to raw files in debug mode */ protected $debugRaw = true; + /** Boolean: Whether mw.loader.state() call should be omitted */ + protected $raw = false; /** * Array: Cache for mtime * @par Usage: @@ -240,6 +242,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { break; // Single booleans case 'debugRaw': + case 'raw': $this->{$member} = (bool) $option; break; } @@ -367,6 +370,13 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { return $this->dependencies; } + /** + * @return bool + */ + public function isRaw() { + return $this->raw; + } + /** * Get the last modified timestamp of this module. * diff --git a/includes/resourceloader/ResourceLoaderModule.php b/includes/resourceloader/ResourceLoaderModule.php index fa76a25625..035ff0975f 100644 --- a/includes/resourceloader/ResourceLoaderModule.php +++ b/includes/resourceloader/ResourceLoaderModule.php @@ -246,6 +246,17 @@ abstract class ResourceLoaderModule { return 'bottom'; } + /** + * Whether this module's JS expects to work without the client-side ResourceLoader module. + * Returning true from this function will prevent mw.loader.state() call from being + * appended to the bottom of the script. + * + * @return bool + */ + public function isRaw() { + return false; + } + /** * Get the loader JS for this module, if set. * diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php index 74724a6918..467a1ac0f6 100644 --- a/includes/resourceloader/ResourceLoaderStartUpModule.php +++ b/includes/resourceloader/ResourceLoaderStartUpModule.php @@ -173,6 +173,13 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { /* Methods */ + /** + * @return bool + */ + public function isRaw() { + return true; + } + /** * @param $context ResourceLoaderContext * @return string -- 2.20.1