From 9e3d20429361cd15a8da1007d3550e291ad519b1 Mon Sep 17 00:00:00 2001 From: Krinkle Date: Sat, 21 May 2011 18:33:48 +0000 Subject: [PATCH] Fixing mediawiki.action.watch.ajax * Adding error capturing in case there is an error (either in the API or with the request itself). Right now if it fails it just keeps reading "Watching..." and no error is displayed. This lack became visible when r88522 changed ApiWatch to require a token and POST. * Added message 'watcherrortext'. * Moved messages-array in Resources.php form legacy.ajax to action.watch.ajax (looks like this was forgotten in r78147) * Switched it to make a POST request in preparation of making it work with the changed API backend as of r88522. --- languages/messages/MessagesEn.php | 1 + languages/messages/MessagesQqq.php | 1 + maintenance/language/messages.inc | 3 +- resources/Resources.php | 18 +++---- .../mediawiki.action.watch.ajax.js | 53 ++++++++++++++++--- 5 files changed, 60 insertions(+), 16 deletions(-) diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index 8dd6b38b7c..9719c47fac 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -2718,6 +2718,7 @@ The e-mail address you entered in [[Special:Preferences|your user preferences]] Future changes to this page and its associated talk page will be listed there, and the page will appear '''bolded''' in the [[Special:RecentChanges|list of recent changes]] to make it easier to pick out.", 'removedwatch' => 'Removed from watchlist', 'removedwatchtext' => 'The page "[[:$1]]" has been removed from [[Special:Watchlist|your watchlist]].', +'watcherrortext' => 'An error occurred while changing your watchlist settings for "$1".', 'watch' => 'Watch', 'watchthispage' => 'Watch this page', 'unwatch' => 'Unwatch', diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php index d1b2274870..e23dfb110f 100644 --- a/languages/messages/MessagesQqq.php +++ b/languages/messages/MessagesQqq.php @@ -2360,6 +2360,7 @@ This is a button text used in [[Special:Emailuser]] when called without a (valid 'addedwatchtext' => 'Explanation shown when clicking on the {{msg|watch}} tab. See also {{msg|addedwatch}}.', 'removedwatch' => 'Page title displayed when clicking on {{msg|unwatch}} tab (only when not using the AJAX feauture which allows watching a page without reloading the page or such). See also {{msg|removedwatchtext}}.', 'removedwatchtext' => "After a page has been removed from a user's watchlist by clicking the {{msg|unwatch}} tab at the top of an article, this message appears just below the title of the article. $1 is the title of the article. See also {{msg|removedwatch}} and {{msg|addedwatchtext}}.", +'watcherrortext' => "When a user clicked the watch/unwatch tab and the action did not succeed, this message is displayed. See also {{msg|addedwatchtext}}. and {{msg|addedwatchtext}}. This message is used raw and should not contain wikitext.", 'watch' => 'Name of the Watch tab. Should be in the imperative mood.', 'watchthispage' => '{{Identical|Watch this page}}', 'unwatch' => 'Label of "Unwatch" tab.', diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc index 20464a4162..e9275860f2 100644 --- a/maintenance/language/messages.inc +++ b/maintenance/language/messages.inc @@ -1820,7 +1820,8 @@ $wgMessageStructure = array( ), 'watching' => array( 'watching', - 'unwatching', + 'watching', + 'watcherrortext', ), 'enotif' => array( 'enotif_mailer', diff --git a/resources/Resources.php b/resources/Resources.php index 3e959319ee..84d918ab7a 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -482,7 +482,15 @@ return array( ), 'mediawiki.action.watch.ajax' => array( 'scripts' => 'resources/mediawiki.action/mediawiki.action.watch.ajax.js', - 'dependencies' => 'mediawiki.util', + 'messages' => array( + 'watch', + 'unwatch', + 'watching', + 'unwatching', + 'tooltip-ca-watch', + 'tooltip-ca-unwatch', + 'watcherrortext', + ), ), /* Special pages */ @@ -580,14 +588,6 @@ return array( 'scripts' => 'common/ajax.js', 'remoteBasePath' => $GLOBALS['wgStylePath'], 'localBasePath' => "{$GLOBALS['IP']}/skins", - 'messages' => array( - 'watch', - 'unwatch', - 'watching', - 'unwatching', - 'tooltip-ca-watch', - 'tooltip-ca-unwatch', - ), 'dependencies' => 'mediawiki.legacy.wikibits', ), 'mediawiki.legacy.commonPrint' => array( diff --git a/resources/mediawiki.action/mediawiki.action.watch.ajax.js b/resources/mediawiki.action/mediawiki.action.watch.ajax.js index 484b3b0d12..55a131fcf3 100644 --- a/resources/mediawiki.action/mediawiki.action.watch.ajax.js +++ b/resources/mediawiki.action/mediawiki.action.watch.ajax.js @@ -23,8 +23,40 @@ var setLinkText = function( $link, action ) { } }; +var errorHandler = function( $link ) { + + // Reset link text to whatever it was before we switching it to the '(un)watch'+ing message. + setLinkText( $link, $link.data( 'action' ) ); + + // Format error message + var cleanTitle = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' ); + var link = mw.html.element( + 'a', { + 'href': mw.util.wikiGetlink( mw.config.get( 'wgPageName' ) ), + 'title': cleanTitle + }, cleanTitle + ); + var msg = mw.msg( 'watcherrortext', link ); + + // Report to user about the error + mw.util.jsMessage( msg, 'watch' ); +}; + +/** + * Process the result of the API watch action. + * + * @param response Data object from API request. + * @param $link jQuery object of the watch link. + * @return Boolean true on success, false otherwise. + */ var processResult = function( response, $link ) { - watchResponse = response.watch; + + if ( ( 'error' in response ) || !response.watch ) { + errorHandler( $link ); + return false; + } + + var watchResponse = response.watch; // To ensure we set the same status for all watch links with the // same target we trigger a custom event on *all* watch links. @@ -35,7 +67,7 @@ var processResult = function( response, $link ) { } else { // Either we got an error code or it just plain broke. window.location.href = $link[0].href; - return; + return false; } mw.util.jsMessage( watchResponse.message, 'watch' ); @@ -47,6 +79,7 @@ var processResult = function( response, $link ) { } else { $( '#wpWatchthis' ).removeAttr( 'checked' ); } + return true; }; $( document ).ready( function() { @@ -88,15 +121,23 @@ $( document ).ready( function() { // API return contains a localized data.watch.message string. 'uselang': mw.config.get( 'wgUserLanguage' ) }; + if ( $link.data( 'action' ) == 'unwatch' ) { reqData.unwatch = ''; } - $.getJSON( mw.util.wikiScript( 'api' ), - reqData, - function( data, textStatus, xhr ) { + + $.ajax({ + url: mw.util.wikiScript( 'api' ), + dataType: 'json', + type: 'POST', + data: reqData, + success: function( data, textStatus, xhr ) { processResult( data, $link ); + }, + error: function(){ + processResult( {}, $link ); } - ); + }); return false; }); -- 2.20.1