Bartosz Dziewoński has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/295610

Change subject: mw.Upload.BookletLayout: Better handle error messages from 
AbuseFilter and TitleBlacklist
......................................................................

mw.Upload.BookletLayout: Better handle error messages from AbuseFilter and 
TitleBlacklist

And hopefully, also other extensions, if they follow the format where
result.error.message is a message key that can be used to report the
error to the user.

The message text is loaded dynamically from the foreign wiki.

* TitleBlacklist: I42a0c5b0ea7e61088dd609b764dd7d1396c60cd5
* AbuseFilter: I5780eae96930211191ecd874aacf53fdacb58f89

Bug: T115260
Bug: T137841
Change-Id: I5d1a289cf3d3b9de53047566172ab19a859e608e
---
M languages/i18n/en.json
M languages/i18n/qqq.json
M resources/Resources.php
M resources/src/mediawiki/api/messages.js
M resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
5 files changed, 55 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/10/295610/1

diff --git a/languages/i18n/en.json b/languages/i18n/en.json
index ac23f6d..1f52400 100644
--- a/languages/i18n/en.json
+++ b/languages/i18n/en.json
@@ -4057,7 +4057,6 @@
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM",
        "mw-widgets-titleinput-description-new-page": "page does not exist yet",
        "mw-widgets-titleinput-description-redirect": "redirect to $1",
-       "api-error-blacklisted": "Please choose a different, descriptive 
title.",
        "sessionmanager-tie": "Cannot combine multiple request authentication 
types: $1.",
        "sessionprovider-generic": "$1 sessions",
        "sessionprovider-mediawiki-session-cookiesessionprovider": 
"cookie-based sessions",
diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json
index db50cd2..49718e5 100644
--- a/languages/i18n/qqq.json
+++ b/languages/i18n/qqq.json
@@ -4238,7 +4238,6 @@
        "mw-widgets-dateinput-placeholder-month": "Placeholder displayed in a 
date input field when it's empty, representing a date format with 4 digits for 
year and 2 digits for month, separated with hyphens (without a day). This 
should be uppercase, if possible, and must not include any additional 
explanations. If there is no good way to translate it, make this message 
blank.",
        "mw-widgets-titleinput-description-new-page": "Description label for a 
new page in the title input widget.",
        "mw-widgets-titleinput-description-redirect": "Description label for a 
redirect in the title input widget.",
-       "api-error-blacklisted": "Used as error message.\n\nFollowed by the 
link {{msg-mw|Mwe-upwiz-feedback-blacklist-info-prompt}}.",
        "sessionmanager-tie": "Used as an error message when multiple session 
sources are tied in priority.\n\nParameters:\n* $1 - List of dession type 
descriptions, from messages like 
{{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.",
        "sessionprovider-generic": "Used to create a generic session type 
description when one isn't provided via the proper message. Should be phrased 
to make sense when added to a message such as 
{{msg-mw|cannotloginnow-text}}.\n\nParameters:\n* $1 - PHP classname.",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "Description 
of the sessions provided by the CookieSessionProvider class, which use HTTP 
cookies. Should be phrased to make sense when added to a message such as 
{{msg-mw|cannotloginnow-text}}.",
diff --git a/resources/Resources.php b/resources/Resources.php
index e31e77e..cf8c2e9 100644
--- a/resources/Resources.php
+++ b/resources/Resources.php
@@ -1298,7 +1298,6 @@
                        'filename-thumb-name',
                        'badfilename',
                        'protectedpagetext',
-                       'api-error-blacklisted', // HACK
                ],
        ],
        'mediawiki.ForeignStructuredUpload.BookletLayout' => [
diff --git a/resources/src/mediawiki/api/messages.js 
b/resources/src/mediawiki/api/messages.js
index df21eb2..9ba562e 100644
--- a/resources/src/mediawiki/api/messages.js
+++ b/resources/src/mediawiki/api/messages.js
@@ -44,6 +44,25 @@
                 */
                loadMessages: function ( messages ) {
                        return this.getMessages( messages ).then( $.proxy( 
mw.messages, 'set' ) );
+               },
+
+               /**
+                * Loads a set of mesages and add them to mw.messages. Only 
messages that are not already known
+                * are loaded. If all messages are known, the returned promise 
is resolved immediately.
+                *
+                * @param {Array} messages Messages to retrieve
+                * @return {jQuery.Promise}
+                */
+               loadMessagesIfMissing: function ( messages ) {
+                       var missing = messages.filter( function ( msg ) {
+                               return !mw.message( msg ).exists();
+                       } );
+
+                       if ( missing.length === 0 ) {
+                               return $.Deferred().resolve();
+                       }
+
+                       return this.getMessages( missing ).then( $.proxy( 
mw.messages, 'set' ) );
                }
        } );
 
diff --git a/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js 
b/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
index bbd0f1b..afaf7ad 100644
--- a/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
+++ b/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
@@ -263,7 +263,13 @@
                        // Pretty sure it's impossible to get a warning other 
than 'stashfailed' here, which should
                        // really be an error...
                        var errorMessage = 
layout.getErrorMessageForStateDetails();
-                       deferred.reject( errorMessage );
+                       if ( errorMessage.then ) {
+                               errorMessage.then( function ( realErrorMessage 
) {
+                                       deferred.reject( realErrorMessage );
+                               } );
+                       } else {
+                               deferred.reject( errorMessage );
+                       }
                }, function ( progress ) {
                        var elapsedTime = new Date() - startTime,
                                estimatedTotalTime = ( 1 / progress ) * 
elapsedTime,
@@ -310,7 +316,13 @@
                                layout.emit( 'fileSaved', 
layout.upload.getImageInfo() );
                        }, function () {
                                var errorMessage = 
layout.getErrorMessageForStateDetails();
-                               deferred.reject( errorMessage );
+                               if ( errorMessage.then ) {
+                                       errorMessage.then( function ( 
realErrorMessage ) {
+                                               deferred.reject( 
realErrorMessage );
+                                       } );
+                               } else {
+                                       deferred.reject( errorMessage );
+                               }
                        } );
                } );
 
@@ -322,7 +334,8 @@
         * state and state details.
         *
         * @protected
-        * @return {OO.ui.Error} Error to display for given state and details.
+        * @return {OO.ui.Error|jQuery.Promise} Error to display for given 
state and details,
+        *   or a Promise that will be resolved with an OO.ui.Error.
         */
        mw.Upload.BookletLayout.prototype.getErrorMessageForStateDetails = 
function () {
                var message,
@@ -340,15 +353,26 @@
                                );
                        }
 
-                       // HACK We should either have a hook here to allow 
TitleBlacklist to handle this, or just have
-                       // TitleBlacklist produce sane error messages that can 
be displayed without arcane knowledge
-                       if ( error.info === 'TitleBlacklist prevents this title 
from being created' ) {
-                               // HACK Apparently the only reliable way to 
determine whether TitleBlacklist was involved
-                               return new OO.ui.Error(
-                                       // HACK TitleBlacklist doesn't have a 
sensible message, this one is from UploadWizard
-                                       $( '<p>' ).msg( 'api-error-blacklisted' 
),
-                                       { recoverable: false }
-                               );
+                       // Errors in this format are produced by TitleBlacklist 
and AbuseFilter. Perhaps other
+                       // extensions will follow this format in the future.
+                       if ( error.message ) {
+                               return this.upload.getApi().then( function ( 
api ) {
+                                       return api.loadMessagesIfMissing( [ 
error.message ] ).then( function () {
+                                               if ( !mw.message( error.message 
).exists() ) {
+                                                       return 
$.Deferred().reject();
+                                               }
+                                               return new OO.ui.Error(
+                                                       $( '<p>' ).msg( 
error.message ),
+                                                       { recoverable: false }
+                                               );
+                                       } );
+                               } ).then( null, function () {
+                                       // We failed when loading the error 
message, fall back
+                                       return $.Deferred().resolve( new 
OO.ui.Error(
+                                               $( '<p>' ).msg( 
'api-error-unknownerror', JSON.stringify( stateDetails ) ),
+                                               { recoverable: false }
+                                       ) );
+                               } );
                        }
 
                        if ( error.code === 'protectedpage' ) {

-- 
To view, visit https://gerrit.wikimedia.org/r/295610
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5d1a289cf3d3b9de53047566172ab19a859e608e
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Bartosz Dziewoński <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to