mediawiki.jqueryMsg: Always parse messages with '&'
authorBartosz Dziewoński <matma.rex@gmail.com>
Mon, 5 Oct 2015 12:50:29 +0000 (14:50 +0200)
committerBartosz Dziewoński <matma.rex@gmail.com>
Mon, 5 Oct 2015 13:00:20 +0000 (15:00 +0200)
To give consistent output for messages containing HTML entities.

Turns out that we're also inconsistent about escaping in HTML tag
attributes vs. escaping in text (see tests for 'jquerymsg-entities2'
and 'jquerymsg-entities-attr2'). This patch does not try to fix this.

Bug: T55576
Change-Id: I08cf9d552d1f0243a160babb8c3cf9f257be1be3

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

index c9c0455..9ef95d5 100644 (file)
                // Caching is somewhat problematic, because we do need different message functions for different maps, so
                // we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
                // Do not use mw.jqueryMsg unless required
-               if ( this.format === 'plain' || !/\{\{|[\[<>]/.test( this.map.get( this.key ) ) ) {
+               if ( this.format === 'plain' || !/\{\{|[\[<>&]/.test( this.map.get( this.key ) ) ) {
                        // Fall back to mw.msg's simple parser
                        return oldParser.apply( this );
                }
index f287caa..0bff705 100644 (file)
        } );
 
        // HTML in wikitext
-       QUnit.test( 'HTML', 26, function ( assert ) {
+       QUnit.test( 'HTML', 32, function ( assert ) {
                mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
 
                assertBothModes( assert, [ 'jquerymsg-italics-msg' ], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
                        'Foo&lt;tag/&gt;bar',
                        'Self-closing tags don\'t cause a parse error'
                );
+
+               mw.messages.set( 'jquerymsg-entities1', 'A&B' );
+               mw.messages.set( 'jquerymsg-entities2', 'A&gt;B' );
+               mw.messages.set( 'jquerymsg-entities3', 'A&rarr;B' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities1' ),
+                       'A&amp;B',
+                       'Lone "&" is escaped in text'
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities2' ),
+                       'A&amp;gt;B',
+                       '"&gt;" entity is double-escaped in text' // (WHY?)
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities3' ),
+                       'A&amp;rarr;B',
+                       '"&rarr;" entity is double-escaped in text'
+               );
+
+               mw.messages.set( 'jquerymsg-entities-attr1', '<i title="A&B"></i>' );
+               mw.messages.set( 'jquerymsg-entities-attr2', '<i title="A&gt;B"></i>' );
+               mw.messages.set( 'jquerymsg-entities-attr3', '<i title="A&rarr;B"></i>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr1' ),
+                       '<i title="A&amp;B"></i>',
+                       'Lone "&" is escaped in attribute'
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr2' ),
+                       '<i title="A&gt;B"></i>',
+                       '"&gt;" entity is not double-escaped in attribute' // (WHY?)
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr3' ),
+                       '<i title="A&amp;rarr;B"></i>',
+                       '"&rarr;" entity is double-escaped in attribute'
+               );
        } );
 
        QUnit.test( 'Behavior in case of invalid wikitext', 3, function ( assert ) {