mediawiki.Uri: Don't double-escape fragments
authorRoan Kattouw <roan.kattouw@gmail.com>
Fri, 19 Jan 2018 23:16:29 +0000 (15:16 -0800)
committerRoan Kattouw <roan.kattouw@gmail.com>
Fri, 19 Jan 2018 23:31:51 +0000 (15:31 -0800)
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
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js

index 450b415..7f12835 100644 (file)
                                        } );
                                }
                                uri.query = q;
+
+                               // Decode uri.fragment, otherwise it gets double-encoded when serializing
+                               if ( uri.fragment !== undefined ) {
+                                       uri.fragment = Uri.decode( uri.fragment );
+                               }
                        },
 
                        /**
index 84b8f06..918c923 100644 (file)
                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';
        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(
                        {
                                port: '81',
                                path: '/dir/dir.2/index.htm',
                                query: { q1: '0', test1: null, test2: 'value (escaped)' },
-                               fragment: 'top'
+                               fragment: 'café'
                        },
                        'basic object properties'
                );
                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 ) {