resourceloader: Allow style-only modules to have deprecation warnings
authorBartosz Dziewoński <matma.rex@gmail.com>
Wed, 16 May 2018 15:56:26 +0000 (17:56 +0200)
committerBartosz Dziewoński <matma.rex@gmail.com>
Thu, 17 May 2018 10:12:12 +0000 (10:12 +0000)
The deprecation warning for the module 'mediawiki.ui' (used
e.g. on Special:UserLogin) is now actually shown.

Change-Id: If35a106c77622dbf7e8b5628fbea28f9e7ffd76d

includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderModule.php
tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php

index d0a9c42..80825ff 100644 (file)
@@ -139,7 +139,8 @@ class ResourceLoaderClientHtml {
                                'styles' => [],
                                'general' => [],
                        ],
-
+                       // Deprecations for style-only modules
+                       'styledeprecations' => [],
                ];
 
                foreach ( $this->modules as $name ) {
@@ -204,6 +205,10 @@ class ResourceLoaderClientHtml {
                                        $data['styles'][] = $name;
                                }
                        }
+                       $deprecation = $module->getDeprecationInformation();
+                       if ( $deprecation ) {
+                               $data['styledeprecations'][] = $deprecation;
+                       }
                }
 
                foreach ( $this->moduleScripts as $name ) {
@@ -307,7 +312,15 @@ class ResourceLoaderClientHtml {
                        );
                }
 
-               // External stylesheets
+               // Deprecations for only=styles modules
+               if ( $data['styledeprecations'] ) {
+                       $chunks[] = ResourceLoader::makeInlineScript(
+                               implode( '', $data['styledeprecations'] ),
+                               $nonce
+                       );
+               }
+
+               // External stylesheets (only=styles)
                if ( $data['styles'] ) {
                        $chunks[] = $this->getLoad(
                                $data['styles'],
index 6d1529b..7351cb3 100644 (file)
@@ -139,7 +139,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         *
         * @return string JavaScript code
         */
-       protected function getDeprecationInformation() {
+       public function getDeprecationInformation() {
                $deprecationInfo = $this->deprecated;
                if ( $deprecationInfo ) {
                        $name = $this->getName();
index e763a19..829a219 100644 (file)
@@ -72,6 +72,10 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                                'shouldEmbed' => true,
                                'styles' => '.shouldembed{}',
                        ],
+                       'test.styles.deprecated' => [
+                               'type' => ResourceLoaderModule::LOAD_STYLES,
+                               'deprecated' => 'Deprecation message.',
+                       ],
 
                        'test.scripts' => [],
                        'test.scripts.user' => [ 'group' => 'user' ],
@@ -125,6 +129,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                        'test.styles.private',
                        'test.styles.pure',
                        'test.styles.shouldembed',
+                       'test.styles.deprecated',
                        'test.unregistered.styles',
                ] );
                $client->setModuleScripts( [
@@ -145,6 +150,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                                'test.styles.user.empty' => 'ready',
                                'test.styles.private' => 'ready',
                                'test.styles.shouldembed' => 'ready',
+                               'test.styles.deprecated' => 'ready',
                                'test.scripts' => 'loading',
                                'test.scripts.user' => 'loading',
                                'test.scripts.user.empty' => 'ready',
@@ -155,6 +161,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                        ],
                        'styles' => [
                                'test.styles.pure',
+                               'test.styles.deprecated',
                        ],
                        'scripts' => [
                                'test.scripts',
@@ -169,6 +176,13 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                                        'test.user',
                                ],
                        ],
+                       'styledeprecations' => [
+                               Xml::encodeJsCall(
+                                       'mw.log.warn',
+                                       [ 'This page is using the deprecated ResourceLoader module "test.styles.deprecated".
+Deprecation message.' ]
+                               )
+                       ],
                ];
 
                $access = TestingAccessWrapper::newFromObject( $client );
@@ -195,6 +209,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                $client->setModuleStyles( [
                        'test.styles.pure',
                        'test.styles.private',
+                       'test.styles.deprecated',
                ] );
                $client->setModuleScripts( [
                        'test.scripts',
@@ -207,12 +222,13 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                $expected = '<script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>' . "\n"
                        . '<script>(window.RLQ=window.RLQ||[]).push(function(){'
                        . 'mw.config.set({"key":"value"});'
-                       . 'mw.loader.state({"test.exempt":"ready","test.private":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.scripts":"loading"});'
+                       . 'mw.loader.state({"test.exempt":"ready","test.private":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.styles.deprecated":"ready","test.scripts":"loading"});'
                        . 'mw.loader.implement("test.private@{blankVer}",function($,jQuery,require,module){},{"css":[]});'
                        . 'mw.loader.load(["test"]);'
                        . 'mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.scripts\u0026only=scripts\u0026skin=fallback");'
+                       . 'mw.log.warn("This page is using the deprecated ResourceLoader module \"test.styles.deprecated\".\nDeprecation message.");'
                        . '});</script>' . "\n"
-                       . '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=nl&amp;modules=test.styles.pure&amp;only=styles&amp;skin=fallback"/>' . "\n"
+                       . '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=nl&amp;modules=test.styles.deprecated%2Cpure&amp;only=styles&amp;skin=fallback"/>' . "\n"
                        . '<style>.private{}</style>' . "\n"
                        . '<script async="" src="/w/load.php?debug=false&amp;lang=nl&amp;modules=startup&amp;only=scripts&amp;skin=fallback"></script>';
                // phpcs:enable