Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/js/_enqueues/admin/edit-comments.js
Original file line number Diff line number Diff line change
Expand Up @@ -449,6 +449,12 @@ window.setCommentsList = function() {
a.on( 'click', function( e ){
e.preventDefault();
e.stopPropagation(); // Ticket #35904.

// Abort undo if there is an unfinished AJAX request on this comment. See #35501.
if ( list.wpList.xhrs.inProgress( 'comment-' + id ) ) {
return false;
}

list.wpList.del(this);
$('#undo-' + id).css( {backgroundColor:'#ceb'} ).fadeOut(350, function(){
$(this).remove();
Expand Down
44 changes: 41 additions & 3 deletions src/js/_enqueues/lib/lists.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,27 @@ var functions = {
recolor: 'recolor'
}, wpList;

/**
* Tracks in-progress XHR requests per element to prevent concurrent calls.
*
* @since x.x.x
* @private
*/
var xhrs = {};

/**
* Checks if an element has an in-progress XHR request.
*
* @since x.x.x
* @private
*
* @param {string} element Element ID to check.
* @return {boolean} True if a request is in progress for this element.
*/
function isXhrInProgress( element ) {
return Object.prototype.hasOwnProperty.call( xhrs, element ) && 4 !== xhrs[ element ].readyState;
}

/**
* @namespace
*/
Expand Down Expand Up @@ -414,6 +435,11 @@ wpList = {
settings.element = data[2] || settings.element || null;
settings.delColor = data[3] ? '#' + data[3] : settings.delColor;

// Prevent concurrent AJAX requests on the same element.
if ( isXhrInProgress( settings.element ) ) {
return false;
}

if ( ! settings || ! settings.element ) {
return false;
}
Expand Down Expand Up @@ -466,6 +492,8 @@ wpList = {
};

settings.complete = function( jqXHR, status ) {
delete xhrs[ settings.element ];

if ( typeof settings.delAfter === 'function' ) {
$eventTarget.queue( function() {
settings.delAfter( returnedResponse, $.extend( {
Expand All @@ -477,7 +505,7 @@ wpList = {
}
};

$.ajax( settings );
xhrs[ settings.element ] = $.ajax( settings );

return false;
},
Expand Down Expand Up @@ -508,6 +536,11 @@ wpList = {
settings.dimAddColor = data[4] ? '#' + data[4] : settings.dimAddColor;
settings.dimDelColor = data[5] ? '#' + data[5] : settings.dimDelColor;

// Prevent concurrent AJAX requests on the same element.
if ( isXhrInProgress( settings.element ) ) {
return false;
}

if ( ! settings || ! settings.element || ! settings.dimClass ) {
return true;
}
Expand Down Expand Up @@ -591,6 +624,8 @@ wpList = {
};

settings.complete = function( jqXHR, status ) {
delete xhrs[ settings.element ];

if ( typeof settings.dimAfter === 'function' ) {
$eventTarget.queue( function() {
settings.dimAfter( returnedResponse, $.extend( {
Expand All @@ -602,7 +637,7 @@ wpList = {
}
};

$.ajax( settings );
xhrs[ settings.element ] = $.ajax( settings );

return false;
},
Expand Down Expand Up @@ -840,7 +875,10 @@ wpList = {
$.fn.wpList = function( settings ) {
this.each( function( index, list ) {
list.wpList = {
settings: $.extend( {}, wpList.settings, { what: wpList.parseData( list, 'list' )[1] || '' }, settings )
settings: $.extend( {}, wpList.settings, { what: wpList.parseData( list, 'list' )[1] || '' }, settings ),
xhrs: {
inProgress: isXhrInProgress
}
};

$.each( functions, function( func, callback ) {
Expand Down
Loading