ApiSandbox: Fix HTTP error handling
authorBrad Jorsch <bjorsch@wikimedia.org>
Sat, 20 May 2017 10:09:20 +0000 (12:09 +0200)
committerBrad Jorsch <bjorsch@wikimedia.org>
Sat, 20 May 2017 11:21:56 +0000 (13:21 +0200)
Since bf69459, ApiSandbox seems to stall out when an API request
results in an HTTP error (e.g. due to a PHP fatal error). Before that
revision, it displayed the 'apisandbox-results-error' message in this
situation.

Apparently the jQuery 3 changes to Deferred behavior caused it to be
impossible to have a then() filter return `this` (or anything else) in
order to avoid replacing the existing promise that's being resolved or
rejected.

Bug: T165857
Change-Id: I3f646cdfe7fe8987437980790788821f51e728d1

resources/src/mediawiki.special/mediawiki.special.apisandbox.js

index f53850a..da8bdcd 100644 (file)
                                        }
                                } )
                                        .then( null, function ( code, data, result, jqXHR ) {
+                                               var deferred = $.Deferred();
+
                                                if ( code !== 'http' ) {
                                                        // Not really an error, work around mw.Api thinking it is.
-                                                       return $.Deferred()
-                                                               .resolve( result, jqXHR )
-                                                               .promise();
+                                                       deferred.resolve( result, jqXHR );
+                                               } else {
+                                                       // Just forward it.
+                                                       deferred.reject.apply( deferred, arguments );
                                                }
-                                               return this;
+                                               return deferred.promise();
                                        } )
-                                       .fail( function ( code, data ) {
-                                               var details = 'HTTP error: ' + data.exception;
-                                               $result.empty()
-                                                       .append(
-                                                               new OO.ui.LabelWidget( {
-                                                                       label: mw.message( 'apisandbox-results-error', details ).text(),
-                                                                       classes: [ 'error' ]
-                                                               } ).$element
-                                                       );
-                                       } )
-                                       .done( function ( data, jqXHR ) {
+                                       .then( function ( data, jqXHR ) {
                                                var m, loadTime, button, clear,
                                                        ct = jqXHR.getResponseHeader( 'Content-Type' );
 
                                                                .on( 'click', button.setDisabled, [ true ], button )
                                                                .$element.appendTo( $result );
                                                }
+                                       }, function ( code, data ) {
+                                               var details = 'HTTP error: ' + data.exception;
+                                               $result.empty()
+                                                       .append(
+                                                               new OO.ui.LabelWidget( {
+                                                                       label: mw.message( 'apisandbox-results-error', details ).text(),
+                                                                       classes: [ 'error' ]
+                                                               } ).$element
+                                                       );
                                        } );
                        } );
                },