From ca2a24cf172313d69908f7e98cbc4a0eab2f5130 Mon Sep 17 00:00:00 2001 From: Moriel Schottlender Date: Tue, 19 Dec 2017 14:17:48 -0800 Subject: [PATCH] RCFilters: Only normalize title with 'target' when it is needed We right now only need to normalize titles that are with subpages into target= parameter in the RCLinked page. There's no need to do that in RC or Watchlist, and it might interfere with other (or future) features if we do. This commit sets the normalization as conditional on a config variable, that is given on initialization based on the proper page we're in. Change-Id: I288221edb143e0b3417e161062faf2eb4f9f9a51 --- .../mw.rcfilters.Controller.js | 7 +- .../mw.rcfilters.UriProcessor.js | 16 ++- .../mediawiki.rcfilters/mw.rcfilters.init.js | 3 +- .../mediawiki.rcfilters/UriProcessor.test.js | 111 ++++++++++-------- 4 files changed, 86 insertions(+), 51 deletions(-) diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js index 79546b46d4..aa768f7480 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js @@ -12,6 +12,9 @@ * @cfg {string} savedQueriesPreferenceName Where to save the saved queries * @cfg {string} daysPreferenceName Preference name for the days filter * @cfg {string} limitPreferenceName Preference name for the limit filter + * @cfg {boolean} [normalizeTarget] Dictates whether or not to go through the + * title normalization to separate title subpage/parts into the target= url + * parameter */ mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel, savedQueriesModel, config ) { this.filtersModel = filtersModel; @@ -20,6 +23,7 @@ this.savedQueriesPreferenceName = config.savedQueriesPreferenceName; this.daysPreferenceName = config.daysPreferenceName; this.limitPreferenceName = config.limitPreferenceName; + this.normalizeTarget = !!config.normalizeTarget; this.requestCounter = {}; this.baseFilterState = {}; @@ -213,7 +217,8 @@ this.filtersModel.initializeFilters( filterStructure, views ); this.uriProcessor = new mw.rcfilters.UriProcessor( - this.filtersModel + this.filtersModel, + { normalizeTarget: this.normalizeTarget } ); if ( !mw.user.isAnon() ) { diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js index 7bb0a222c4..b8ff22ee11 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js @@ -3,10 +3,20 @@ /** * URI Processor for RCFilters * + * @class + * + * @constructor * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Filters view model + * @param {Object} [config] Configuration object + * @cfg {boolean} [normalizeTarget] Dictates whether or not to go through the + * title normalization to separate title subpage/parts into the target= url + * parameter */ - mw.rcfilters.UriProcessor = function MwRcfiltersController( filtersModel ) { + mw.rcfilters.UriProcessor = function MwRcfiltersController( filtersModel, config ) { + config = config || {}; this.filtersModel = filtersModel; + + this.normalizeTarget = !!config.normalizeTarget; }; /* Initialization */ @@ -103,6 +113,10 @@ // matches [/wiki/]SpecialNS:RCL/[Namespace:]Title/Subpage/Subsubpage/etc re = /^((?:\/.+?\/)?.*?:.*?)\/(.*)$/; + if ( !this.normalizeTarget ) { + return uri; + } + // target in title param if ( uri.query.title ) { parts = uri.query.title.match( re ); diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js index f7708996ee..9d83c77b00 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js @@ -24,7 +24,8 @@ { savedQueriesPreferenceName: savedQueriesPreferenceName, daysPreferenceName: daysPreferenceName, - limitPreferenceName: limitPreferenceName + limitPreferenceName: limitPreferenceName, + normalizeTarget: specialPage === 'Recentchangeslinked' } ); diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js index fbd159cbb1..398e5d4577 100644 --- a/tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js +++ b/tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js @@ -278,58 +278,73 @@ } ); QUnit.test( '_normalizeTargetInUri', function ( assert ) { - var uriProcessor = new mw.rcfilters.UriProcessor( null ), - cases = [ - { - input: 'http://host/wiki/Special:RecentChangesLinked/Moai', - output: 'http://host/wiki/Special:RecentChangesLinked?target=Moai', - message: 'Target as subpage in path' - }, - { - input: 'http://host/wiki/Special:RecentChangesLinked/Château', - output: 'http://host/wiki/Special:RecentChangesLinked?target=Château', - message: 'Target as subpage in path with special characters' - }, - { - input: 'http://host/wiki/Special:RecentChangesLinked/Moai/Sub1', - output: 'http://host/wiki/Special:RecentChangesLinked?target=Moai/Sub1', - message: 'Target as subpage also has a subpage' - }, - { - input: 'http://host/wiki/Special:RecentChangesLinked/Category:Foo', - output: 'http://host/wiki/Special:RecentChangesLinked?target=Category:Foo', - message: 'Target as subpage in path (with namespace)' - }, - { - input: 'http://host/wiki/Special:RecentChangesLinked/Category:Foo/Bar', - output: 'http://host/wiki/Special:RecentChangesLinked?target=Category:Foo/Bar', - message: 'Target as subpage in path also has a subpage (with namespace)' - }, - { - input: 'http://host/w/index.php?title=Special:RecentChangesLinked/Moai', - output: 'http://host/w/index.php?title=Special:RecentChangesLinked&target=Moai', - message: 'Target as subpage in title param' - }, - { - input: 'http://host/w/index.php?title=Special:RecentChangesLinked/Moai/Sub1', - output: 'http://host/w/index.php?title=Special:RecentChangesLinked&target=Moai/Sub1', - message: 'Target as subpage in title param also has a subpage' - }, - { - input: 'http://host/w/index.php?title=Special:RecentChangesLinked/Category:Foo/Bar', - output: 'http://host/w/index.php?title=Special:RecentChangesLinked&target=Category:Foo/Bar', - message: 'Target as subpage in title param also has a subpage (with namespace)' - }, + var cases = [ + { + input: 'http://host/wiki/Special:RecentChangesLinked/Moai', + output: 'http://host/wiki/Special:RecentChangesLinked?target=Moai', + message: 'Target as subpage in path' + }, + { + input: 'http://host/wiki/Special:RecentChangesLinked/Château', + output: 'http://host/wiki/Special:RecentChangesLinked?target=Château', + message: 'Target as subpage in path with special characters' + }, + { + input: 'http://host/wiki/Special:RecentChangesLinked/Moai/Sub1', + output: 'http://host/wiki/Special:RecentChangesLinked?target=Moai/Sub1', + message: 'Target as subpage also has a subpage' + }, + { + input: 'http://host/wiki/Special:RecentChangesLinked/Category:Foo', + output: 'http://host/wiki/Special:RecentChangesLinked?target=Category:Foo', + message: 'Target as subpage in path (with namespace)' + }, + { + input: 'http://host/wiki/Special:RecentChangesLinked/Category:Foo/Bar', + output: 'http://host/wiki/Special:RecentChangesLinked?target=Category:Foo/Bar', + message: 'Target as subpage in path also has a subpage (with namespace)' + }, + { + input: 'http://host/w/index.php?title=Special:RecentChangesLinked/Moai', + output: 'http://host/w/index.php?title=Special:RecentChangesLinked&target=Moai', + message: 'Target as subpage in title param' + }, + { + input: 'http://host/w/index.php?title=Special:RecentChangesLinked/Moai/Sub1', + output: 'http://host/w/index.php?title=Special:RecentChangesLinked&target=Moai/Sub1', + message: 'Target as subpage in title param also has a subpage' + }, + { + input: 'http://host/w/index.php?title=Special:RecentChangesLinked/Category:Foo/Bar', + output: 'http://host/w/index.php?title=Special:RecentChangesLinked&target=Category:Foo/Bar', + message: 'Target as subpage in title param also has a subpage (with namespace)' + }, + { + input: 'http://host/wiki/Special:Watchlist', + output: 'http://host/wiki/Special:Watchlist', + message: 'No target specified' + }, + { + normalizeTarget: false, + input: 'http://host/wiki/Special:RecentChanges/Foo', + output: 'http://host/wiki/Special:RecentChanges/Foo', + message: 'Do not normalize if "normalizeTarget" is false.' + } + ]; + + cases.forEach( function ( testCase ) { + var uriProcessor = new mw.rcfilters.UriProcessor( + null, { - input: 'http://host/wiki/Special:Watchlist', - output: 'http://host/wiki/Special:Watchlist', - message: 'No target specified' + normalizeTarget: testCase.normalizeTarget === undefined ? + true : testCase.normalizeTarget } - ]; + ); - cases.forEach( function ( testCase ) { assert.equal( - uriProcessor._normalizeTargetInUri( new mw.Uri( testCase.input ) ).toString(), + uriProcessor._normalizeTargetInUri( + new mw.Uri( testCase.input ) + ).toString(), new mw.Uri( testCase.output ).toString(), testCase.message ); -- 2.20.1