resourceloader: Throw exception when config serialization fails
authorRoan Kattouw <roan.kattouw@gmail.com>
Tue, 9 Oct 2018 20:43:56 +0000 (13:43 -0700)
committerKrinkle <krinklemail@gmail.com>
Thu, 11 Oct 2018 21:08:28 +0000 (21:08 +0000)
If something puts a string that's invalid UTF-8 in a JS config variable,
JSON serialization will fail on the entire config blob. Currently, this
causes the entire config blob to be silently dropped, which breaks all
JavaScript because elementary variables like wgPageName are missing.

This change makes this scenario fail loudly rather than quietly, by
throwing an exception. This also makes bugs like these easier to track
down.

Bug: T206475
Change-Id: Ief2ae00228389a23627d440dc1cd9a54cf2b6926

includes/resourceloader/ResourceLoader.php

index fe9ba74..e2b60fc 100644 (file)
@@ -1524,13 +1524,21 @@ MESSAGE;
         *
         * @param array $configuration List of configuration values keyed by variable name
         * @return string JavaScript code
+        * @throws Exception
         */
        public static function makeConfigSetScript( array $configuration ) {
-               return Xml::encodeJsCall(
+               $js = Xml::encodeJsCall(
                        'mw.config.set',
                        [ $configuration ],
                        self::inDebugMode()
                );
+               if ( $js === false ) {
+                       throw new Exception(
+                               'JSON serialization of config data failed. ' .
+                               'This usually means the config data is not valid UTF-8.'
+                       );
+               }
+               return $js;
        }
 
        /**