X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fresourceloader%2FResourceLoaderClientHtml.php;h=e324d044233de05b8231d0cdcc57bb818655dbe4;hb=4306994b7999ce4018a534844502a10f46eb169e;hp=5c072bfdec6fb195a9ce7ef94d57af158bd0163c;hpb=0245bce0171c8e6466724bbfffbd97297bcbce35;p=lhc%2Fweb%2Fwiklou.git
diff --git a/includes/resourceloader/ResourceLoaderClientHtml.php b/includes/resourceloader/ResourceLoaderClientHtml.php
index 5c072bfdec..e324d04423 100644
--- a/includes/resourceloader/ResourceLoaderClientHtml.php
+++ b/includes/resourceloader/ResourceLoaderClientHtml.php
@@ -22,7 +22,7 @@ use Wikimedia\WrappedString;
use Wikimedia\WrappedStringList;
/**
- * Bootstrap a ResourceLoader client on an HTML page.
+ * Load and configure a ResourceLoader client on an HTML page.
*
* @since 1.28
*/
@@ -46,9 +46,6 @@ class ResourceLoaderClientHtml {
/** @var array */
private $moduleStyles = [];
- /** @var array */
- private $moduleScripts = [];
-
/** @var array */
private $exemptStates = [];
@@ -101,16 +98,6 @@ class ResourceLoaderClientHtml {
$this->moduleStyles = $modules;
}
- /**
- * Ensure the scripts of one or more modules are loaded.
- *
- * @deprecated since 1.28
- * @param array $modules Array of module names
- */
- public function setModuleScripts( array $modules ) {
- $this->moduleScripts = $modules;
- }
-
/**
* Set state of special modules that are handled by the caller manually.
*
@@ -139,7 +126,6 @@ class ResourceLoaderClientHtml {
],
'general' => [],
'styles' => [],
- 'scripts' => [],
// Embedding for private modules
'embed' => [
'styles' => [],
@@ -217,26 +203,6 @@ class ResourceLoaderClientHtml {
}
}
- foreach ( $this->moduleScripts as $name ) {
- $module = $rl->getModule( $name );
- if ( !$module ) {
- continue;
- }
-
- $group = $module->getGroup();
- $context = $this->getContext( $group, ResourceLoaderModule::TYPE_SCRIPTS );
- if ( $module->isKnownEmpty( $context ) ) {
- // Avoid needless request for empty module
- $data['states'][$name] = 'ready';
- } else {
- // Load from load.php?only=scripts via
- $data['scripts'][] = $name;
-
- // Avoid duplicate request from mw.loader
- $data['states'][$name] = 'loading';
- }
- }
-
return $data;
}
@@ -267,56 +233,52 @@ class ResourceLoaderClientHtml {
$chunks = [];
// Change "client-nojs" class to client-js. This allows easy toggling of UI components.
- // This happens synchronously on every page view to avoid flashes of wrong content.
+ // This must happen synchronously on every page view to avoid flashes of wrong content.
// See also #getDocumentAttributes() and /resources/src/startup.js.
- $chunks[] = Html::inlineScript(
- 'document.documentElement.className = document.documentElement.className'
- . '.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );',
- $nonce
- );
+ $script = <<config ) {
- $chunks[] = ResourceLoader::makeInlineScript(
- ResourceLoader::makeConfigSetScript( $this->config ),
- $nonce
- );
+ $confJson = ResourceLoader::encodeJsonForScript( $this->config );
+ $script .= <<exemptStates, $data['states'] );
if ( $states ) {
- $chunks[] = ResourceLoader::makeInlineScript(
- ResourceLoader::makeLoaderStateScript( $states ),
- $nonce
- );
+ $stateJson = ResourceLoader::encodeJsonForScript( $states );
+ $script .= <<getLoad(
- $data['embed']['general'],
- ResourceLoaderModule::TYPE_COMBINED,
- $nonce
- );
+ // Inline script: Declare general modules to load on this page.
+ if ( $data['general'] ) {
+ $pageModulesJson = ResourceLoader::encodeJsonForScript( $data['general'] );
+ $script .= <<context->getDebug() ) {
+ $chunks[] = Html::inlineScript( $script, $nonce );
+ } else {
+ $chunks[] = Html::inlineScript(
+ ResourceLoader::filter( 'minify-js', $script, [ 'cache' => false ] ),
$nonce
);
}
- // Inline RLQ: Load only=scripts
- if ( $data['scripts'] ) {
+ // Inline RLQ: Embedded modules
+ if ( $data['embed']['general'] ) {
$chunks[] = $this->getLoad(
- $data['scripts'],
- ResourceLoaderModule::TYPE_SCRIPTS,
+ $data['embed']['general'],
+ ResourceLoaderModule::TYPE_COMBINED,
$nonce
);
}
@@ -341,7 +303,7 @@ class ResourceLoaderClientHtml {
// Async scripts. Once the startup is loaded, inline RLQ scripts will run.
// Pass-through a custom 'target' from OutputPage (T143066).
- $startupQuery = [];
+ $startupQuery = [ 'raw' => '1' ];
foreach ( [ 'target', 'safemode' ] as $param ) {
if ( $this->options[$param] !== null ) {
$startupQuery[$param] = (string)$this->options[$param];
@@ -386,7 +348,7 @@ class ResourceLoaderClientHtml {
private static function makeContext( ResourceLoaderContext $mainContext, $group, $type,
array $extraQuery = []
) {
- // Create new ResourceLoaderContext so that $extraQuery may trigger isRaw().
+ // Create new ResourceLoaderContext so that $extraQuery is supported (eg. for 'sync=1').
$req = new FauxRequest( array_merge( $mainContext->getRequest()->getValues(), $extraQuery ) );
// Set 'only' if not combined
$req->setVal( 'only', $type === ResourceLoaderModule::TYPE_COMBINED ? null : $type );
@@ -472,12 +434,6 @@ class ResourceLoaderClientHtml {
);
}
} else {
- // See if we have one or more raw modules
- $isRaw = false;
- foreach ( $moduleSet as $key => $module ) {
- $isRaw |= $module->isRaw();
- }
-
// Special handling for the user group; because users might change their stuff
// on-wiki like user pages, or user preferences; we need to find the highest
// timestamp of these user-changeable modules so we can ensure cache misses on change
@@ -493,19 +449,23 @@ class ResourceLoaderClientHtml {
// Decide whether to use 'style' or 'script' element
if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
$chunk = Html::linkedStyle( $url );
+ } elseif ( $context->getRaw() ) {
+ // This request is asking for the module to be delivered standalone,
+ // (aka "raw") without communicating to any mw.loader client.
+ // Use cases:
+ // - startup (naturally because this is what will define mw.loader)
+ // - html5shiv (loads synchronously in old IE before the async startup module arrives)
+ // - QUnit (needed in SpecialJavaScriptTest before async startup)
+ $chunk = Html::element( 'script', [
+ // The 'sync' option is only supported in combination with 'raw'.
+ 'async' => !isset( $extraQuery['sync'] ),
+ 'src' => $url
+ ] );
} else {
- if ( $context->getRaw() || $isRaw ) {
- $chunk = Html::element( 'script', [
- // In SpecialJavaScriptTest, QUnit must load synchronous
- 'async' => !isset( $extraQuery['sync'] ),
- 'src' => $url
- ] );
- } else {
- $chunk = ResourceLoader::makeInlineScript(
- Xml::encodeJsCall( 'mw.loader.load', [ $url ] ),
- $nonce
- );
- }
+ $chunk = ResourceLoader::makeInlineScript(
+ Xml::encodeJsCall( 'mw.loader.load', [ $url ] ),
+ $nonce
+ );
}
if ( $group == 'noscript' ) {