From a0c441503f8e8d427c98fc710e024842f0c861c9 Mon Sep 17 00:00:00 2001 From: Roan Kattouw Date: Fri, 19 Jan 2018 15:16:29 -0800 Subject: [PATCH] mediawiki.Uri: Don't double-escape fragments Fragments were ingested already-escaped, then escaped again when serializing. To prevent double-escaping, decode fragments when ingesting them. Bug: T183710 Change-Id: I19fc889bb7bde446476203bf6d6352dce8298256 --- resources/src/mediawiki/mediawiki.Uri.js | 5 +++++ .../suites/resources/mediawiki/mediawiki.Uri.test.js | 8 +++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/resources/src/mediawiki/mediawiki.Uri.js b/resources/src/mediawiki/mediawiki.Uri.js index 450b415d96..7f12835ec7 100644 --- a/resources/src/mediawiki/mediawiki.Uri.js +++ b/resources/src/mediawiki/mediawiki.Uri.js @@ -324,6 +324,11 @@ } ); } uri.query = q; + + // Decode uri.fragment, otherwise it gets double-encoded when serializing + if ( uri.fragment !== undefined ) { + uri.fragment = Uri.decode( uri.fragment ); + } }, /** diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js index 84b8f06354..918c923a7b 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js @@ -206,6 +206,8 @@ uri = uriBase.clone(); uri.fragment = 'frag'; assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php#frag', 'add a fragment' ); + uri.fragment = 'café'; + assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php#caf%C3%A9', 'fragment is url-encoded' ); uri = uriBase.clone(); uri.host = 'fr.wiki.local'; @@ -391,7 +393,7 @@ QUnit.test( 'Advanced URL', function ( assert ) { var uri, queryString, relativePath; - uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' ); + uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#caf%C3%A9' ); assert.deepEqual( { @@ -412,7 +414,7 @@ port: '81', path: '/dir/dir.2/index.htm', query: { q1: '0', test1: null, test2: 'value (escaped)' }, - fragment: 'top' + fragment: 'café' }, 'basic object properties' ); @@ -432,7 +434,7 @@ relativePath = uri.getRelativePath(); assert.ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' ); assert.ok( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' ); - assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragment in relative path' ); + assert.ok( relativePath.indexOf( mw.Uri.encode( uri.fragment ) ) >= 0, 'escaped fragment in relative path' ); } ); QUnit.test( 'Parse a uri with an @ symbol in the path and query', function ( assert ) { -- 2.20.1