resourceloader: Implement ResourceLoaderRawFileModule for 'mediawiki.js'
authorTimo Tijhof <krinklemail@gmail.com>
Wed, 13 May 2015 18:23:26 +0000 (19:23 +0100)
committerTimo Tijhof <krinklemail@gmail.com>
Thu, 14 May 2015 21:44:36 +0000 (22:44 +0100)
When adding files to this module, they all imply a global scope.
While most files have their own closure, it is still inconsistent
with normal modules which always have a closure via mw.loader.implement.

Base modules like 'mediawiki' are lacking such a closure, thus making
it hard to share variables within the different files that make up the
module without making it a globally public.

The use case is 13203c0a2180e5, where we could expose the sha1()
library within the scope of this module only.

Change-Id: I93fcd045f47ec6a595b26f739939e1d371832ac9

autoload.php
includes/resourceloader/ResourceLoaderRawFileModule.php [new file with mode: 0644]
resources/Resources.php

index d158481..8b80295 100644 (file)
@@ -1009,6 +1009,7 @@ $wgAutoloadLocalClasses = array(
        'ResourceLoaderLanguageDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageDataModule.php',
        'ResourceLoaderLanguageNamesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageNamesModule.php',
        'ResourceLoaderModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderModule.php',
+       'ResourceLoaderRawFileModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderRawFileModule.php',
        'ResourceLoaderSiteModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSiteModule.php',
        'ResourceLoaderSkinModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSkinModule.php',
        'ResourceLoaderSpecialCharacterDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php',
diff --git a/includes/resourceloader/ResourceLoaderRawFileModule.php b/includes/resourceloader/ResourceLoaderRawFileModule.php
new file mode 100644 (file)
index 0000000..d9005fa
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Module containing files that are loaded without ResourceLoader.
+ *
+ * Primary usecase being "base" modules loaded by the startup module,
+ * such as jquery and the mw.loader client itself. These make use of
+ * ResourceLoaderModule and load.php for convenience but aren't actually
+ * registered in the startup module (as it would have to load itself).
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Timo Tijhof
+ */
+
+class ResourceLoaderRawFileModule extends ResourceLoaderFileModule {
+
+       /**
+        * Enable raw mode to omit mw.loader.state() call as mw.loader
+        * does not yet exist when these modules execute.
+        * @var boolean
+        */
+       protected $raw = true;
+
+       /**
+        * Get all JavaScript code.
+        *
+        * @param ResourceLoaderContext $context
+        * @return string JavaScript code
+        */
+       public function getScript( ResourceLoaderContext $context ) {
+               $script = parent::getScript( $context );
+               // Add closure explicitly because raw modules can't be wrapped mw.loader.implement.
+               // Unlike with mw.loader.implement, this closure is immediately invoked.
+               // @see ResourceLoader::makeModuleResponse
+               // @see ResourceLoader::makeLoaderImplementScript
+               return "(function () {\n{$script}\n}());";
+       }
+}
index ae5b3f9..ac85d3a 100644 (file)
@@ -773,6 +773,7 @@ return array(
        /* MediaWiki */
 
        'mediawiki' => array(
+               'class' => 'ResourceLoaderRawFileModule',
                // Keep maintenance/jsduck/eg-iframe.html in sync
                'scripts' => array(
                        'resources/src/mediawiki/mediawiki.js',
@@ -780,7 +781,6 @@ return array(
                        'resources/src/mediawiki/mediawiki.startUp.js',
                ),
                'debugScripts' => 'resources/src/mediawiki/mediawiki.log.js',
-               'raw' => true,
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.apihelp' => array(