From 1b1a85ba7f67e50ce9a0285100273a5ef3debf05 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bartosz=20Dziewo=C5=84ski?= Date: Mon, 5 Oct 2015 14:50:29 +0200 Subject: [PATCH] mediawiki.jqueryMsg: Always parse messages with '&' 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 --- .../src/mediawiki/mediawiki.jqueryMsg.js | 2 +- .../mediawiki/mediawiki.jqueryMsg.test.js | 40 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/resources/src/mediawiki/mediawiki.jqueryMsg.js b/resources/src/mediawiki/mediawiki.jqueryMsg.js index c9c0455c5a..9ef95d5482 100644 --- a/resources/src/mediawiki/mediawiki.jqueryMsg.js +++ b/resources/src/mediawiki/mediawiki.jqueryMsg.js @@ -1288,7 +1288,7 @@ // 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 ); } diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js index f287caa6ca..0bff70519a 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js @@ -688,7 +688,7 @@ } ); // HTML in wikitext - QUnit.test( 'HTML', 26, function ( assert ) { + QUnit.test( 'HTML', 32, function ( assert ) { mw.messages.set( 'jquerymsg-italics-msg', 'Very important' ); assertBothModes( assert, [ 'jquerymsg-italics-msg' ], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' ); @@ -829,6 +829,44 @@ 'Foo<tag/>bar', 'Self-closing tags don\'t cause a parse error' ); + + mw.messages.set( 'jquerymsg-entities1', 'A&B' ); + mw.messages.set( 'jquerymsg-entities2', 'A>B' ); + mw.messages.set( 'jquerymsg-entities3', 'A→B' ); + assert.htmlEqual( + formatParse( 'jquerymsg-entities1' ), + 'A&B', + 'Lone "&" is escaped in text' + ); + assert.htmlEqual( + formatParse( 'jquerymsg-entities2' ), + 'A&gt;B', + '">" entity is double-escaped in text' // (WHY?) + ); + assert.htmlEqual( + formatParse( 'jquerymsg-entities3' ), + 'A&rarr;B', + '"→" entity is double-escaped in text' + ); + + mw.messages.set( 'jquerymsg-entities-attr1', '' ); + mw.messages.set( 'jquerymsg-entities-attr2', '' ); + mw.messages.set( 'jquerymsg-entities-attr3', '' ); + assert.htmlEqual( + formatParse( 'jquerymsg-entities-attr1' ), + '', + 'Lone "&" is escaped in attribute' + ); + assert.htmlEqual( + formatParse( 'jquerymsg-entities-attr2' ), + '', + '">" entity is not double-escaped in attribute' // (WHY?) + ); + assert.htmlEqual( + formatParse( 'jquerymsg-entities-attr3' ), + '', + '"→" entity is double-escaped in attribute' + ); } ); QUnit.test( 'Behavior in case of invalid wikitext', 3, function ( assert ) { -- 2.20.1