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