http://www.mediawiki.org/wiki/Special:Code/MediaWiki/56248
Revision: 56248
Author: catrope
Date: 2009-09-12 21:40:28 +0000 (Sat, 12 Sep 2009)
Log Message:
-----------
EditToolbar: (bug 20618) Stop the link dialog from inserting links to empty
titles or URLs. Currently, the URL check only checks for the empty string and
'http://' , but we could replace that by a more elaborate URL-valiating regex.
Also bump style versions and recombine for r56247
Modified Paths:
--------------
trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.hooks.php
trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.i18n.php
trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.js
trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.php
trunk/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php
trunk/extensions/UsabilityInitiative/js/plugins.combined.js
trunk/extensions/UsabilityInitiative/js/plugins.combined.min.js
Modified: trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.hooks.php
===================================================================
--- trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.hooks.php
2009-09-12 21:29:51 UTC (rev 56247)
+++ trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.hooks.php
2009-09-12 21:40:28 UTC (rev 56248)
@@ -50,6 +50,7 @@
'edittoolbar-tool-link-int-target-status-invalid',
'edittoolbar-tool-link-int-target-status-loading',
'edittoolbar-tool-link-int-invalid',
+ 'edittoolbar-tool-link-ext-invalid',
'edittoolbar-tool-file',
'edittoolbar-tool-file-pre',
'edittoolbar-tool-file-example',
Modified: trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.i18n.php
===================================================================
--- trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.i18n.php
2009-09-12 21:29:51 UTC (rev 56247)
+++ trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.i18n.php
2009-09-12 21:40:28 UTC (rev 56248)
@@ -36,6 +36,7 @@
'edittoolbar-tool-link-int-target-status-invalid' => 'Invalid title',
'edittoolbar-tool-link-int-target-status-loading' => 'Checking page
existence...',
'edittoolbar-tool-link-int-invalid' => 'The title you specified is
invalid.',
+ 'edittoolbar-tool-link-ext-invalid' => 'The URL you specified is
invalid.',
'edittoolbar-tool-file' => 'Embedded file',
'edittoolbar-tool-file-pre' => '$1{{ns:file}}:',
'edittoolbar-tool-file-example' => 'Example.jpg',
Modified: trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.js
===================================================================
--- trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.js
2009-09-12 21:29:51 UTC (rev 56247)
+++ trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.js
2009-09-12 21:40:28 UTC (rev 56248)
@@ -912,14 +912,15 @@
var whitespace = [ '', '' ];
switch ( $j( '#edittoolbar-link-tabs'
).tabs( 'option', 'selected' ) ) {
case 0: // Internal link
+ var target = $j(
'#edittoolbar-link-int-target' ).val();
+ var text = $j(
'#edittoolbar-link-int-text' ).val();
// FIXME: Exactly how
fragile is this?
- if ( $j(
'#edittoolbar-link-int-target-status-invalid' ).is( ':visible' ) ) {
+ if ( $j(
'#edittoolbar-link-int-target-status-invalid' ).is( ':visible' ) ||
+ target
== '' ) {
// Refuse to
add links to invalid titles
alert( gM(
'edittoolbar-tool-link-int-invalid' ) );
return;
}
- var target = $j(
'#edittoolbar-link-int-target' ).val();
- var text = $j(
'#edittoolbar-link-int-text' ).val();
whitespace = $j(
'#edittoolbar-link-dialog-tab-int' ).data( 'whitespace' );
if ( target == text )
insertText =
'[[' + target + ']]';
@@ -932,6 +933,12 @@
var escTarget =
escapeExternalTarget( target );
var escText =
escapeExternalText( text );
whitespace = $j(
'#edittoolbar-link-dialog-tab-ext' ).data( 'whitespace' );
+ if ( target == '' ||
target == 'http://' ) {
+ // Refuse to
add links to invalid URLs
+ // TODO: More
elaborate regex here?
+ alert( gM(
'edittoolbar-tool-link-ext-invalid' ) );
+ return;
+ }
if ( escTarget ==
escText )
insertText =
escTarget;
else if ( text == '' )
Modified: trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.php
===================================================================
--- trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.php
2009-09-12 21:29:51 UTC (rev 56247)
+++ trunk/extensions/UsabilityInitiative/EditToolbar/EditToolbar.php
2009-09-12 21:40:28 UTC (rev 56248)
@@ -19,7 +19,7 @@
/* Configuration */
// Bump the version number every time you change any of the .css/.js files
-$wgEditToolbarStyleVersion = 29;
+$wgEditToolbarStyleVersion = 30;
// Set this to true to simply override the stock toolbar for everyone
$wgEditToolbarGlobalEnable = false;
Modified: trunk/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php
===================================================================
--- trunk/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php
2009-09-12 21:29:51 UTC (rev 56247)
+++ trunk/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php
2009-09-12 21:40:28 UTC (rev 56248)
@@ -61,7 +61,7 @@
array( 'src' => 'js/plugins/jquery.browser.js',
'version' => 3 ),
array( 'src' => 'js/plugins/jquery.cookie.js',
'version' => 3 ),
array( 'src' =>
'js/plugins/jquery.namespaceSelect.js', 'version' => 1 ),
- array( 'src' =>
'js/plugins/jquery.suggestions.js', 'version' => 1 ),
+ array( 'src' =>
'js/plugins/jquery.suggestions.js', 'version' => 2 ),
array( 'src' =>
'js/plugins/jquery.textSelection.js', 'version' => 9 ),
array( 'src' =>
'js/plugins/jquery.wikiEditor.js', 'version' => 4 ),
array( 'src' =>
'js/plugins/jquery.wikiEditor.toolbar.js', 'version' => 11 ),
@@ -70,10 +70,10 @@
array( 'src' => 'js/js2/jquery-ui-1.7.2.js',
'version' => '1.7.2x' ),
),
'combined' => array(
- array( 'src' => 'js/plugins.combined.js',
'version' => 18 ),
+ array( 'src' => 'js/plugins.combined.js',
'version' => 19 ),
),
'minified' => array(
- array( 'src' => 'js/plugins.combined.min.js',
'version' => 18 ),
+ array( 'src' => 'js/plugins.combined.min.js',
'version' => 19 ),
),
),
);
Modified: trunk/extensions/UsabilityInitiative/js/plugins.combined.js
===================================================================
--- trunk/extensions/UsabilityInitiative/js/plugins.combined.js 2009-09-12
21:29:51 UTC (rev 56247)
+++ trunk/extensions/UsabilityInitiative/js/plugins.combined.js 2009-09-12
21:40:28 UTC (rev 56248)
@@ -484,6 +484,10 @@
$.suggestions.restore( context );
} else {
context.data.$textbox.val( result.data( 'text'
) );
+
+ // .val() doesn't call any event handlers, so
+ // let the world know what happened
+ context.data.$textbox.change();
}
}
$.suggestions.special( context );
@@ -613,7 +617,7 @@
if ( $result.get( 0 )
!= $other.get( 0 ) ) {
return;
}
- highlight( $result,
true );
+
$.suggestions.highlight( context, $result, true );
context.data.$container.hide();
if ( typeof
context.config.result.select == 'function' ) {
context.config.result.select.call( $result, context.data.$textbox );
Modified: trunk/extensions/UsabilityInitiative/js/plugins.combined.min.js
===================================================================
--- trunk/extensions/UsabilityInitiative/js/plugins.combined.min.js
2009-09-12 21:29:51 UTC (rev 56247)
+++ trunk/extensions/UsabilityInitiative/js/plugins.combined.min.js
2009-09-12 21:40:28 UTC (rev 56248)
@@ -31,13 +31,13 @@
result=context.data.$container.find('.suggestions-results
div:first');else{result=selected.next();if(result.size()==0)
result=selected;}}
selected.removeClass('suggestions-result-current');result.addClass('suggestions-result-current');}
-if(updateTextbox){if(result.size()==0){$.suggestions.restore(context);}else{context.data.$textbox.val(result.data('text'));}}
+if(updateTextbox){if(result.size()==0){$.suggestions.restore(context);}else{context.data.$textbox.val(result.data('text'));context.data.$textbox.change();}}
$.suggestions.special(context);},keypress:function(context,key){switch(key){case
40:if(context.data.$container.is(':visible')){$.suggestions.highlight(context,'next',true);}else{$.suggestions.update(context,false);}
context.data.$textbox.trigger('change');break;case
38:if(context.data.$container.is(':visible')){$.suggestions.highlight(context,'prev',true);}
context.data.$textbox.trigger('change');break;case
27:context.data.$container.hide();$.suggestions.restore(context);$.suggestions.cancel(context);context.data.$textbox.trigger('change');break;case
13:context.data.$container.hide();break;default:$.suggestions.update(context,true);break;}}};$.fn.suggestions=function(){var
returnValue=null;var args=arguments;$(this).each(function(){var
context=$(this).data('suggestions-context');if(typeof
context=='undefined'){context={config:{'fetch':function(){},'cancel':function(){},'special':{},'result':{},'$region':$(this),'suggestions':[],'maxRows':7,'delay':1200,'submitOnClick':false}};}
if(args.length>0){if(typeof args[0]=='object'){for(key in
args[0]){$.suggestions.configure(context,key,args[0][key]);}}else if(typeof
args[0]=='string'){if(args.length>1){$.suggestions.configure(context,args[0],args[1]);}else
if(returnValue==null){returnValue=(args[0]in
context.config?undefined:context.config[args[0]]);}}}
if(typeof
context.data=='undefined'){context.data={'timerID':null,'prevText':null,'visibleResults':0,'mouseDownOn':$([]),'$textbox':$(this)};context.data.$container=$('<div
/>').css({'top':Math.round(context.data.$textbox.offset().top+context.data.$textbox.outerHeight()),'left':Math.round(context.data.$textbox.offset().left),'width':context.data.$textbox.outerWidth(),'display':'none'}).mouseover(function(e){$.suggestions.highlight(context,$(e.target).closest('.suggestions-results
div'),false);}).addClass('suggestions').append($('<div
/>').addClass('suggestions-results').mousedown(function(e){context.data.mouseDownOn=$(e.target).closest('.suggestions-results
div');}).mouseup(function(e){var
$result=$(e.target).closest('.suggestions-results div');var
$other=context.data.mouseDownOn;context.data.mouseDownOn=$([]);if($result.get(0)!=$other.get(0)){return;}
-highlight($result,true);context.data.$container.hide();if(typeof
context.config.result.select=='function'){context.config.result.select.call($result,context.data.$textbox);}
+$.suggestions.highlight(context,$result,true);context.data.$container.hide();if(typeof
context.config.result.select=='function'){context.config.result.select.call($result,context.data.$textbox);}
context.data.$textbox.focus();})).append($('<div
/>').addClass('suggestions-special').mousedown(function(e){context.data.mouseDownOn=$(e.target).closest('.suggestions-special');}).mouseup(function(e){var
$special=$(e.target).closest('.suggestions-special');var
$other=context.data.mouseDownOn;context.data.mouseDownOn=$([]);if($special.get(0)!=$other.get(0)){return;}
context.data.$container.hide();if(typeof
context.config.special.select=='function'){context.config.special.select.call($special,context.data.$textbox);}
context.data.$textbox.focus();})).appendTo($('body'));$(this).attr('autocomplete','off').keydown(function(e){context.data.keypressed=(e.keyCode==undefined)?e.which:e.keyCode;context.data.keypressedCount=0;}).keypress(function(){context.data.keypressedCount++;$.suggestions.keypress(context,context.data.keypressed);}).keyup(function(){if(context.data.keypressedCount==0){$.suggestions.keypress(context,context.data.keypressed);}}).blur(function(){if(context.data.mouseDownOn.size()>0){return;}
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs