jqueryMsg: Allow sneaking in non-qqx JavaScript messages in qqx mode
authorBartosz Dziewoński <matma.rex@gmail.com>
Tue, 14 May 2019 05:41:17 +0000 (07:41 +0200)
committerJames D. Forrester <jforrester@wikimedia.org>
Tue, 14 May 2019 18:05:13 +0000 (19:05 +0100)
In commit bb084a35739e3f3c54c8680f756ebebb90e13f28 I assumed that
with uselang=qqx, any messages defined in JavaScript would be just
the message key wrapped in parentheses.

It turns out that extensions (e.g. VisualEditor) have been sneaking
in messages in content language using the system we assumed to only
contain messages in user language. This trick stopped working.

Detect this and return the real message, if it's defined.

Bug: T222944
Change-Id: I3f2a6ceb249402ef76e788c494fd5bdc519faf65

resources/src/mediawiki.base/mediawiki.base.js
resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js

index 9016c7c..00a74fe 100644 (file)
                 * @return {string} Parsed message
                 */
                parser: function () {
-                       var text;
-                       if ( mw.config.get( 'wgUserLanguage' ) === 'qqx' ) {
+                       var text = this.map.get( this.key );
+                       if (
+                               mw.config.get( 'wgUserLanguage' ) === 'qqx' &&
+                               ( !text || text === '(' + this.key + ')' )
+                       ) {
                                text = '(' + this.key + '$*)';
-                       } else {
-                               text = this.map.get( this.key );
                        }
                        return mw.format.apply( null, [ text ].concat( this.parameters ) );
                },
index 6416612..e0c9833 100644 (file)
@@ -317,13 +317,14 @@ mw.jqueryMsg.Parser.prototype = {
                var wikiText;
 
                if ( !Object.prototype.hasOwnProperty.call( this.astCache, key ) ) {
-                       if ( mw.config.get( 'wgUserLanguage' ) === 'qqx' ) {
+                       wikiText = this.settings.messages.get( key );
+                       if (
+                               mw.config.get( 'wgUserLanguage' ) === 'qqx' &&
+                               ( !wikiText || wikiText === '(' + key + ')' )
+                       ) {
                                wikiText = '(' + key + '$*)';
-                       } else {
-                               wikiText = this.settings.messages.get( key );
-                               if ( typeof wikiText !== 'string' ) {
-                                       wikiText = '⧼' + key + '⧽';
-                               }
+                       } else if ( typeof wikiText !== 'string' ) {
+                               wikiText = '⧼' + key + '⧽';
                        }
                        wikiText = mw.internalDoTransformFormatForQqx( wikiText, replacements );
                        this.astCache[ key ] = this.wikiTextToAst( wikiText );
index 1c7d8ee..2fcf61e 100644 (file)
                );
 
                mw.config.set( 'wgUserLanguage', 'qqx' );
+
                $bar = $( '<b>' ).text( 'bar' );
-               assert.strictEqual( mw.message( 'foo', $bar, 'baz' ).parse(), '(foo: <b>bar</b>, baz)', 'qqx message with parameters' );
+               mw.messages.set( 'qqx-message', '(qqx-message)' );
+               mw.messages.set( 'non-qqx-message', '<b>hello world</b>' );
+
+               assert.strictEqual( mw.message( 'missing-message' ).parse(), '(missing-message)', 'qqx message (missing)' );
+               assert.strictEqual( mw.message( 'missing-message', $bar, 'baz' ).parse(), '(missing-message: <b>bar</b>, baz)', 'qqx message (missing) with parameters' );
+               assert.strictEqual( mw.message( 'qqx-message' ).parse(), '(qqx-message)', 'qqx message (defined)' );
+               assert.strictEqual( mw.message( 'qqx-message', $bar, 'baz' ).parse(), '(qqx-message: <b>bar</b>, baz)', 'qqx message (defined) with parameters' );
+               assert.strictEqual( mw.message( 'non-qqx-message' ).parse(), '<b>hello world</b>', 'non-qqx message in qqx mode' );
        } );
 
        QUnit.test( 'setParserDefaults', function ( assert ) {
index 425e18e..08262b2 100644 (file)
                );
 
                mw.config.set( 'wgUserLanguage', 'qqx' );
-               assert.strictEqual( mw.message( 'foo' ).plain(), '(foo)', 'qqx message' );
-               assert.strictEqual( mw.message( 'foo', 'bar', 'baz' ).plain(), '(foo: bar, baz)', 'qqx message with parameters' );
+
+               mw.messages.set( 'qqx-message', '(qqx-message)' );
+               mw.messages.set( 'non-qqx-message', 'hello world' );
+
+               assert.strictEqual( mw.message( 'missing-message' ).plain(), '(missing-message)', 'qqx message (missing)' );
+               assert.strictEqual( mw.message( 'missing-message', 'bar', 'baz' ).plain(), '(missing-message: bar, baz)', 'qqx message (missing) with parameters' );
+               assert.strictEqual( mw.message( 'qqx-message' ).plain(), '(qqx-message)', 'qqx message (defined)' );
+               assert.strictEqual( mw.message( 'qqx-message', 'bar', 'baz' ).plain(), '(qqx-message: bar, baz)', 'qqx message (defined) with parameters' );
+               assert.strictEqual( mw.message( 'non-qqx-message' ).plain(), 'hello world', 'non-qqx message in qqx mode' );
        } );
 
        QUnit.test( 'mw.msg', function ( assert ) {