From 66a61a9448b95e02cccc990a83f969a149b6c997 Mon Sep 17 00:00:00 2001 From: Krinkle Date: Sun, 8 May 2011 20:48:20 +0000 Subject: [PATCH] Fix exception thrown in mw.util.addPortletLink * As of jQuery 1.4.4, Sizzle's query must be a string (it does a query.replace call before everything else). It fails otherwise. * In REL1_17 and 1.17wmf1 this isn't a problem since jQuery 1.4.2 is there, in which Sizzle didn't fail on non-strings yet. * Nonetheless this is undocumented support, we should make sure that the variable passed is a string on our side * Adding a check for it in mw.util.addPortletLink's nextnode argument. * Adding a test to mw.util.test that calls addPortletLink with three arguments, making nextnode implied undefined/null. This test returned "ERROR" before I made the fix in mw.util.addPortletLink. Exact error: TypeError: Result of expression 'query' [undefined] is not an object. Origin: line 4085 of jQuery/mediaWiki module load. Line 4081: Sizzle = function( query, context, extra, seed ) { Line 4085: query = query.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); --- resources/mediawiki.util/mediawiki.util.js | 24 +++++++++++-------- .../mediawiki.util/mediawiki.util.test.js | 3 +++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/resources/mediawiki.util/mediawiki.util.js b/resources/mediawiki.util/mediawiki.util.js index 39ceb7779b..dd53c43446 100644 --- a/resources/mediawiki.util/mediawiki.util.js +++ b/resources/mediawiki.util/mediawiki.util.js @@ -375,19 +375,23 @@ this.updateTooltipAccessKeys( $link ); } - // Append using DOM-element passing - if ( nextnode && nextnode.parentNode == $ul[0] ) { + // Where to put our node ? + // - nextnode is a DOM element (before MW 1.17, in wikibits.js, this was the only option) + if ( nextnode && nextnode.parentNode == $ul[0] ) { $(nextnode).before( $item ); + + // - nextnode is a CSS selector for jQuery + } else if ( typeof nextnode == 'string' && $ul.find( nextnode ).length !== 0 ) { + $ul.find( nextnode ).eq( 0 ).before( $item ); + + + // If the jQuery selector isn't found within the