From 687dc7cf57bdc74a80b2ae3176cda1facd535ee9 Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Mon, 4 Apr 2016 00:43:30 +0100 Subject: [PATCH] mediawiki.util: Use wgScript in getUrl() when setting query string This makes the behaviour more in line with Title::getLocalURL() in PHP. * Only use wgArticlePath if there was a non-empty query string. * Remove needless call to isEmptyObject. This is already done by $.params(). * Add test case "title with empty query string". Change-Id: I414350a527eea3822ff2843c1c06a925f41a2c03 --- resources/src/mediawiki/mediawiki.util.js | 44 ++++++++++--------- .../mediawiki/mediawiki.Title.test.js | 11 ++--- .../mediawiki/mediawiki.util.test.js | 31 +++++++------ 3 files changed, 47 insertions(+), 39 deletions(-) diff --git a/resources/src/mediawiki/mediawiki.util.js b/resources/src/mediawiki/mediawiki.util.js index cc983e4125..cccc468d30 100644 --- a/resources/src/mediawiki/mediawiki.util.js +++ b/resources/src/mediawiki/mediawiki.util.js @@ -101,36 +101,38 @@ /** * Get the link to a page name (relative to `wgServer`), * - * @param {string|null} [str=wgPageName] Page name + * @param {string|null} [pageName=wgPageName] Page name * @param {Object} [params] A mapping of query parameter names to values, * e.g. `{ action: 'edit' }` - * @return {string} Url of the page with name of `str` + * @return {string} Url of the page with name of `pageName` */ - getUrl: function ( str, params ) { - var titleFragmentStart, - url, + getUrl: function ( pageName, params ) { + var titleFragmentStart, url, query, fragment = '', - pageName = typeof str === 'string' ? str : mw.config.get( 'wgPageName' ); - - // Find any fragment should one exist - if ( typeof str === 'string' ) { - titleFragmentStart = pageName.indexOf( '#' ); - if ( titleFragmentStart !== -1 ) { - fragment = pageName.slice( titleFragmentStart + 1 ); - // Exclude the fragment from the page name - pageName = pageName.slice( 0, titleFragmentStart ); - } + title = typeof pageName === 'string' ? pageName : mw.config.get( 'wgPageName' ); + + // Find any fragment + titleFragmentStart = title.indexOf( '#' ); + if ( titleFragmentStart !== -1 ) { + fragment = title.slice( titleFragmentStart + 1 ); + // Exclude the fragment from the page name + title = title.slice( 0, titleFragmentStart ); } - url = mw.config.get( 'wgArticlePath' ).replace( '$1', util.wikiUrlencode( pageName ) ); - - // Add query string if necessary - if ( params && !$.isEmptyObject( params ) ) { - url += ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) + $.param( params ); + // Produce query string + if ( params ) { + query = $.param( params ); + } + if ( query ) { + url = title + ? util.wikiScript() + '?title=' + util.wikiUrlencode( title ) + '&' + query + : util.wikiScript() + '?' + query; + } else { + url = mw.config.get( 'wgArticlePath' ).replace( '$1', util.wikiUrlencode( title ) ); } // Append the encoded fragment - if ( fragment.length > 0 ) { + if ( fragment.length ) { url += '#' + util.escapeId( fragment ); } diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js index 932ba7d5db..991725b8c6 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js @@ -360,19 +360,20 @@ QUnit.test( 'getUrl', 4, function ( assert ) { var title; - - // Config - mw.config.set( 'wgArticlePath', '/wiki/$1' ); + mw.config.set( { + wgScript: '/w/index.php', + wgArticlePath: '/wiki/$1' + } ); title = new mw.Title( 'Foobar' ); assert.equal( title.getUrl(), '/wiki/Foobar', 'Basic functionality, getUrl uses mw.util.getUrl' ); - assert.equal( title.getUrl( { action: 'edit' } ), '/wiki/Foobar?action=edit', 'Basic functionality, \'params\' parameter' ); + assert.equal( title.getUrl( { action: 'edit' } ), '/w/index.php?title=Foobar&action=edit', 'Basic functionality, \'params\' parameter' ); title = new mw.Title( 'John Doe', 3 ); assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' ); title = new mw.Title( 'John Cena#And_His_Name_Is', 3 ); - assert.equal( title.getUrl( { meme: true } ), '/wiki/User_talk:John_Cena?meme=true#And_His_Name_Is', 'title with fragment and query parameter' ); + assert.equal( title.getUrl( { meme: true } ), '/w/index.php?title=User_talk:John_Cena&meme=true#And_His_Name_Is', 'title with fragment and query parameter' ); } ); QUnit.test( 'newFromImg', 44, function ( assert ) { diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js index 5d72179560..d697507af6 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js @@ -136,48 +136,53 @@ } ); } ); - QUnit.test( 'getUrl', 12, function ( assert ) { + QUnit.test( 'getUrl', 13, function ( assert ) { + var href; mw.config.set( { + wgScript: '/w/index.php', wgArticlePath: '/wiki/$1', wgPageName: 'Foobar' } ); - var href = mw.util.getUrl( 'Sandbox' ); + href = mw.util.getUrl( 'Sandbox' ); assert.equal( href, '/wiki/Sandbox', 'simple title' ); href = mw.util.getUrl( 'Foo:Sandbox? 5+5=10! (test)/sub ' ); - assert.equal( href, '/wiki/Foo:Sandbox%3F_5%2B5%3D10!_(test)/sub_', 'advanced title' ); + assert.equal( href, '/wiki/Foo:Sandbox%3F_5%2B5%3D10!_(test)/sub_', 'complex title' ); href = mw.util.getUrl(); assert.equal( href, '/wiki/Foobar', 'default title' ); href = mw.util.getUrl( null, { action: 'edit' } ); - assert.equal( href, '/wiki/Foobar?action=edit', 'default title with query string' ); + assert.equal( href, '/w/index.php?title=Foobar&action=edit', 'default title with query string' ); href = mw.util.getUrl( 'Sandbox', { action: 'edit' } ); - assert.equal( href, '/wiki/Sandbox?action=edit', 'simple title with query string' ); + assert.equal( href, '/w/index.php?title=Sandbox&action=edit', 'simple title with query string' ); // Test fragments href = mw.util.getUrl( 'Foo:Sandbox#Fragment', { action: 'edit' } ); - assert.equal( href, '/wiki/Foo:Sandbox?action=edit#Fragment', 'advanced title with query string and fragment' ); + assert.equal( href, '/w/index.php?title=Foo:Sandbox&action=edit#Fragment', 'namespaced title with query string and fragment' ); - href = mw.util.getUrl( 'Foo:Sandbox#', { action: 'edit' } ); - assert.equal( href, '/wiki/Foo:Sandbox?action=edit', 'title with query string and empty fragment' ); + href = mw.util.getUrl( 'Sandbox#', { action: 'edit' } ); + assert.equal( href, '/w/index.php?title=Sandbox&action=edit', 'title with query string and empty fragment' ); + + href = mw.util.getUrl( 'Sandbox', {} ); + assert.equal( href, '/wiki/Sandbox', 'title with empty query string' ); href = mw.util.getUrl( '#Fragment' ); - assert.equal( href, '/wiki/#Fragment', 'epmty title with fragment' ); + assert.equal( href, '/wiki/#Fragment', 'empty title with fragment' ); href = mw.util.getUrl( '#Fragment', { action: 'edit' } ); - assert.equal( href, '/wiki/?action=edit#Fragment', 'epmty title with query string and fragment' ); + assert.equal( href, '/w/index.php?action=edit#Fragment', 'epmty title with query string and fragment' ); href = mw.util.getUrl( 'Foo:Sandbox \xC4#Fragment \xC4', { action: 'edit' } ); - assert.equal( href, '/wiki/Foo:Sandbox_%C3%84?action=edit#Fragment_.C3.84', 'title with query string, fragment, and special characters' ); + assert.equal( href, '/w/index.php?title=Foo:Sandbox_%C3%84&action=edit#Fragment_.C3.84', 'title with query string, fragment, and special characters' ); href = mw.util.getUrl( 'Foo:%23#Fragment', { action: 'edit' } ); - assert.equal( href, '/wiki/Foo:%2523?action=edit#Fragment', 'title containing %23 (#), fragment, and a query string' ); + assert.equal( href, '/w/index.php?title=Foo:%2523&action=edit#Fragment', 'title containing %23 (#), fragment, and a query string' ); href = mw.util.getUrl( '#+&=:;@$-_.!*/[]<>\'§', { action: 'edit' } ); - assert.equal( href, '/wiki/?action=edit#.2B.26.3D:.3B.40.24-_..21.2A.2F.5B.5D.3C.3E.27.C2.A7', 'fragment with various characters' ); + assert.equal( href, '/w/index.php?action=edit#.2B.26.3D:.3B.40.24-_..21.2A.2F.5B.5D.3C.3E.27.C2.A7', 'fragment with various characters' ); } ); QUnit.test( 'wikiScript', 4, function ( assert ) { -- 2.20.1