From d78d9fe3fb5afdcb3968d9957e6ff18c31106f6c Mon Sep 17 00:00:00 2001 From: Fomafix Date: Tue, 10 Sep 2019 08:07:57 +0200 Subject: [PATCH] resourceloader: Replace Xml::encodeJsCall by encodeJsonForScript Also document that encodeJsonForScript can return false on invalid UTF-8 characters. Bug: T32956 Change-Id: I9c2fd33fb2130ada67fa70ff176e5488f1a014bf --- includes/resourceloader/ResourceLoader.php | 20 ++++++++----------- .../ResourceLoaderClientHtml.php | 2 +- .../ResourceLoaderLanguageDataModule.php | 15 +++++--------- .../ResourceLoaderUserDefaultsModule.php | 8 +++----- .../ResourceLoaderUserOptionsModule.php | 11 +++++----- .../ResourceLoaderUserTokensModule.php | 9 ++++----- 6 files changed, 27 insertions(+), 38 deletions(-) diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index 4a23eae74f..6121bbf304 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -812,9 +812,9 @@ class ResourceLoader implements LoggerAwareInterface { $errorText = implode( "\n\n", $this->errors ); $errorResponse = self::makeComment( $errorText ); if ( $context->shouldIncludeScripts() ) { - $errorResponse .= 'if (window.console && console.error) {' - . Xml::encodeJsCall( 'console.error', [ $errorText ] ) - . "}\n"; + $errorResponse .= 'if (window.console && console.error) { console.error(' + . self::encodeJsonForScript( $errorText ) + . "); }\n"; } // Prepend error info to the response @@ -1323,7 +1323,7 @@ MESSAGE; * @internal * @since 1.32 * @param mixed $data - * @return string JSON + * @return string|false JSON string, false on error */ public static function encodeJsonForScript( $data ) { // Keep output as small as possible by disabling needless escape modes @@ -1544,20 +1544,16 @@ MESSAGE; * @throws Exception */ public static function makeConfigSetScript( array $configuration ) { - $js = Xml::encodeJsCall( - 'mw.config.set', - [ $configuration ], - self::inDebugMode() - ); - if ( $js === false ) { + $json = self::encodeJsonForScript( $configuration ); + if ( $json === false ) { $e = new Exception( 'JSON serialization of config data failed. ' . 'This usually means the config data is not valid UTF-8.' ); MWExceptionHandler::logException( $e ); - $js = Xml::encodeJsCall( 'mw.log.error', [ $e->__toString() ] ); + return 'mw.log.error(' . self::encodeJsonForScript( $e->__toString() ) . ');'; } - return $js; + return "mw.config.set($json);"; } /** diff --git a/includes/resourceloader/ResourceLoaderClientHtml.php b/includes/resourceloader/ResourceLoaderClientHtml.php index 151b5fd502..ea35de6bea 100644 --- a/includes/resourceloader/ResourceLoaderClientHtml.php +++ b/includes/resourceloader/ResourceLoaderClientHtml.php @@ -478,7 +478,7 @@ JAVASCRIPT; ] ); } else { $chunk = ResourceLoader::makeInlineScript( - Xml::encodeJsCall( 'mw.loader.load', [ $url ] ), + 'mw.loader.load(' . ResourceLoader::encodeJsonForScript( $url ) . ');', $nonce ); } diff --git a/includes/resourceloader/ResourceLoaderLanguageDataModule.php b/includes/resourceloader/ResourceLoaderLanguageDataModule.php index 7a7ab892ce..c0a0921e11 100644 --- a/includes/resourceloader/ResourceLoaderLanguageDataModule.php +++ b/includes/resourceloader/ResourceLoaderLanguageDataModule.php @@ -52,16 +52,11 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderFileModule { * @return string JavaScript code */ public function getScript( ResourceLoaderContext $context ) { - $fileScript = parent::getScript( $context ); - $langDataScript = Xml::encodeJsCall( - 'mw.language.setData', - [ - $context->getLanguage(), - $this->getData( $context ) - ], - ResourceLoader::inDebugMode() - ); - return $fileScript . $langDataScript; + return parent::getScript( $context ) + . 'mw.language.setData(' + . ResourceLoader::encodeJsonForScript( $context->getLanguage() ) . ',' + . ResourceLoader::encodeJsonForScript( $this->getData( $context ) ) + . ');'; } /** diff --git a/includes/resourceloader/ResourceLoaderUserDefaultsModule.php b/includes/resourceloader/ResourceLoaderUserDefaultsModule.php index b9dc098268..61cff822c9 100644 --- a/includes/resourceloader/ResourceLoaderUserDefaultsModule.php +++ b/includes/resourceloader/ResourceLoaderUserDefaultsModule.php @@ -40,10 +40,8 @@ class ResourceLoaderUserDefaultsModule extends ResourceLoaderModule { * @return string JavaScript code */ public function getScript( ResourceLoaderContext $context ) { - return Xml::encodeJsCall( - 'mw.user.options.set', - [ User::getDefaultOptions() ], - ResourceLoader::inDebugMode() - ); + return 'mw.user.options.set(' + . ResourceLoader::encodeJsonForScript( User::getDefaultOptions() ) + . ');'; } } diff --git a/includes/resourceloader/ResourceLoaderUserOptionsModule.php b/includes/resourceloader/ResourceLoaderUserOptionsModule.php index 0d40ad71ea..ecbb50193c 100644 --- a/includes/resourceloader/ResourceLoaderUserOptionsModule.php +++ b/includes/resourceloader/ResourceLoaderUserOptionsModule.php @@ -52,11 +52,12 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule { */ public function getScript( ResourceLoaderContext $context ) { // Use FILTER_NOMIN annotation to prevent needless minification and caching (T84960). - return ResourceLoader::FILTER_NOMIN . Xml::encodeJsCall( - 'mw.user.options.set', - [ $context->getUserObj()->getOptions( User::GETOPTIONS_EXCLUDE_DEFAULTS ) ], - ResourceLoader::inDebugMode() - ); + return ResourceLoader::FILTER_NOMIN + . 'mw.user.options.set(' + . ResourceLoader::encodeJsonForScript( + $context->getUserObj()->getOptions( User::GETOPTIONS_EXCLUDE_DEFAULTS ) + ) + . ');'; } /** diff --git a/includes/resourceloader/ResourceLoaderUserTokensModule.php b/includes/resourceloader/ResourceLoaderUserTokensModule.php index ae4fb67b8d..85c14cb992 100644 --- a/includes/resourceloader/ResourceLoaderUserTokensModule.php +++ b/includes/resourceloader/ResourceLoaderUserTokensModule.php @@ -53,11 +53,10 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule { */ public function getScript( ResourceLoaderContext $context ) { // Use FILTER_NOMIN annotation to prevent needless minification and caching (T84960). - return ResourceLoader::FILTER_NOMIN . Xml::encodeJsCall( - 'mw.user.tokens.set', - [ $this->contextUserTokens( $context ) ], - ResourceLoader::inDebugMode() - ); + return ResourceLoader::FILTER_NOMIN + . 'mw.user.tokens.set(' + . ResourceLoader::encodeJsonForScript( $this->contextUserTokens( $context ) ) + . ');'; } /** -- 2.20.1