diff -r 490d5cc509ed -r cf61fcea0001 wp/wp-content/plugins/akismet/_inc/akismet.js --- a/wp/wp-content/plugins/akismet/_inc/akismet.js Tue Jun 09 11:14:17 2015 +0000 +++ b/wp/wp-content/plugins/akismet/_inc/akismet.js Mon Oct 14 17:39:30 2019 +0200 @@ -1,15 +1,10 @@ jQuery( function ( $ ) { - $( 'a.activate-option' ).click( function(){ - var link = $( this ); - if ( link.hasClass( 'clicked' ) ) { - link.removeClass( 'clicked' ); - } - else { - link.addClass( 'clicked' ); - } - $( '.toggle-have-key' ).slideToggle( 'slow', function() {}); - return false; - }); + var mshotRemovalTimer = null; + var mshotSecondTryTimer = null + var mshotThirdTryTimer = null + + var mshotEnabledLinkSelector = 'a[id^="author_comment_url"], tr.pingback td.column-author a:first-of-type, td.comment p a'; + $('.akismet-status').each(function () { var thisId = $(this).attr('commentid'); $(this).prependTo('#comment-' + thisId + ' .column-comment'); @@ -18,23 +13,10 @@ var thisId = $(this).attr('commentid'); $(this).insertAfter('#comment-' + thisId + ' .author strong:first').show(); }); - $('#the-comment-list').find('tr.comment, tr[id ^= "comment-"]').find('.column-author a[title]').each(function () { - // Comment author URLs are the only URL with a title attribute in the author column. - var thisTitle = $(this).attr('title'); - var thisCommentId = $(this).parents('tr:first').attr('id').split("-"); - - $(this).attr("id", "author_comment_url_"+ thisCommentId[1]); - - if (thisTitle) { - $(this).after( - $( 'x' ) - .attr( 'commentid', thisCommentId[1] ) - .attr( 'title', WPAkismet.strings['Remove this URL'] ) - ); - } - }); - $('.remove_url').live('click', function () { + akismet_enable_comment_author_url_removal(); + + $( '#the-comment-list' ).on( 'click', '.akismet_remove_url', function () { var thisId = $(this).attr('commentid'); var data = { action: 'comment_author_deurl', @@ -71,8 +53,7 @@ }); return false; - }); - $('.akismet_undo_link_removal').live('click', function () { + }).on( 'click', '.akismet_undo_link_removal', function () { var thisId = $(this).attr('cid'); var thisUrl = $(this).attr('href'); var data = { @@ -101,38 +82,95 @@ return false; }); - $('a[id^="author_comment_url"], tr.pingback td.column-author a:first-of-type').mouseover(function () { - var wpcomProtocol = ( 'https:' === location.protocol ) ? 'https://' : 'http://'; - // Need to determine size of author column - var thisParentWidth = $(this).parent().width(); - // It changes based on if there is a gravatar present - thisParentWidth = ($(this).parent().find('.grav-hijack').length) ? thisParentWidth - 42 + 'px' : thisParentWidth + 'px'; - if ($(this).find('.mShot').length == 0 && !$(this).hasClass('akismet_undo_link_removal')) { - var self = $( this ); - $('.widefat td').css('overflow', 'visible'); - $(this).css('position', 'relative'); - var thisHref = $.URLEncode( $(this).attr('href') ); - $(this).append('
'); - setTimeout(function () { - self.find( '.mshot-image' ).attr('src', '//s0.wordpress.com/mshots/v1/'+thisHref+'?w=450&r=2'); - }, 6000); - setTimeout(function () { - self.find( '.mshot-image' ).attr('src', '//s0.wordpress.com/mshots/v1/'+thisHref+'?w=450&r=3'); - }, 12000); - } else { - $(this).find('.mShot').css('left', thisParentWidth).show(); + + // Show a preview image of the hovered URL. Applies to author URLs and URLs inside the comments. + $( '#the-comment-list' ).on( 'mouseover', mshotEnabledLinkSelector, function () { + clearTimeout( mshotRemovalTimer ); + + if ( $( '.akismet-mshot' ).length > 0 ) { + if ( $( '.akismet-mshot:first' ).data( 'link' ) == this ) { + // The preview is already showing for this link. + return; + } + else { + // A new link is being hovered, so remove the old preview. + $( '.akismet-mshot' ).remove(); + } } - }).mouseout(function () { - $(this).find('.mShot').hide(); - }); + + clearTimeout( mshotSecondTryTimer ); + clearTimeout( mshotThirdTryTimer ); + + var thisHref = $( this ).attr( 'href' ); + + var mShot = $( '
' ); + mShot.data( 'link', this ); + + var offset = $( this ).offset(); + + mShot.offset( { + left : Math.min( $( window ).width() - 475, offset.left + $( this ).width() + 10 ), // Keep it on the screen if the link is near the edge of the window. + top: offset.top + ( $( this ).height() / 2 ) - 101 // 101 = top offset of the arrow plus the top border thickness + } ); + + // These retries appear to be superfluous if .mshot-image has already loaded, but it's because mShots + // can return a "Generating thumbnail..." image if it doesn't have a thumbnail ready, so we need + // to retry to see if we can get the newly generated thumbnail. + mshotSecondTryTimer = setTimeout( function () { + mShot.find( '.mshot-image' ).attr( 'src', akismet_mshot_url( thisHref, 2 ) ); + }, 6000 ); + + mshotThirdTryTimer = setTimeout( function () { + mShot.find( '.mshot-image' ).attr( 'src', akismet_mshot_url( thisHref, 3 ) ); + }, 12000 ); + + $( 'body' ).append( mShot ); + } ).on( 'mouseout', 'a[id^="author_comment_url"], tr.pingback td.column-author a:first-of-type, td.comment p a', function () { + mshotRemovalTimer = setTimeout( function () { + clearTimeout( mshotSecondTryTimer ); + clearTimeout( mshotThirdTryTimer ); + + $( '.akismet-mshot' ).remove(); + }, 200 ); + } ).on( 'mouseover', 'tr', function () { + // When the mouse hovers over a comment row, begin preloading mshots for any links in the comment or the comment author. + var linksToPreloadMshotsFor = $( this ).find( mshotEnabledLinkSelector ); + + linksToPreloadMshotsFor.each( function () { + // Don't attempt to preload an mshot for a single link twice. Browser caching should cover this, but in case of + // race conditions, save a flag locally when we've begun trying to preload one. + if ( ! $( this ).data( 'akismet-mshot-preloaded' ) ) { + akismet_preload_mshot( $( this ).attr( 'href' ) ); + $( this ).data( 'akismet-mshot-preloaded', true ); + } + } ); + } ); + $('.checkforspam:not(.button-disabled)').click( function(e) { + e.preventDefault(); + $('.checkforspam:not(.button-disabled)').addClass('button-disabled'); - $('.checkforspam-spinner').addClass( 'spinner' ); + $('.checkforspam-spinner').addClass( 'spinner' ).addClass( 'is-active' ); + + // Update the label on the "Check for Spam" button to use the active "Checking for Spam" language. + $( '.checkforspam .akismet-label' ).text( $( '.checkforspam' ).data( 'active-label' ) ); + akismet_check_for_spam(0, 100); - e.preventDefault(); }); + var spam_count = 0; + var recheck_count = 0; + function akismet_check_for_spam(offset, limit) { + var check_for_spam_buttons = $( '.checkforspam' ); + + // We show the percentage complete down to one decimal point so even queues with 100k + // pending comments will show some progress pretty quickly. + var percentage_complete = Math.round( ( recheck_count / check_for_spam_buttons.data( 'pending-comment-count' ) ) * 1000 ) / 10; + + // Update the progress counter on the "Check for Spam" button. + $( '.checkforspam-progress' ).text( check_for_spam_buttons.data( 'progress-label-format' ).replace( '%1$s', percentage_complete ) ); + $.post( ajaxurl, { @@ -141,20 +179,107 @@ 'limit': limit }, function(result) { - if (result.processed < limit) { - window.location.reload(); + recheck_count += result.counts.processed; + spam_count += result.counts.spam; + + if (result.counts.processed < limit) { + window.location.href = check_for_spam_buttons.data( 'success-url' ).replace( '__recheck_count__', recheck_count ).replace( '__spam_count__', spam_count ); } else { - akismet_check_for_spam(offset + limit, limit); + // Account for comments that were caught as spam and moved out of the queue. + akismet_check_for_spam(offset + limit - result.counts.spam, limit); } } ); } + + if ( "start_recheck" in WPAkismet && WPAkismet.start_recheck ) { + $( '.checkforspam' ).click(); + } + + if ( typeof MutationObserver !== 'undefined' ) { + // Dynamically add the "X" next the the author URL links when a comment is quick-edited. + var comment_list_container = document.getElementById( 'the-comment-list' ); + + if ( comment_list_container ) { + var observer = new MutationObserver( function ( mutations ) { + for ( var i = 0, _len = mutations.length; i < _len; i++ ) { + if ( mutations[i].addedNodes.length > 0 ) { + akismet_enable_comment_author_url_removal(); + + // Once we know that we'll have to check for new author links, skip the rest of the mutations. + break; + } + } + } ); + + observer.observe( comment_list_container, { attributes: true, childList: true, characterData: true } ); + } + } + + function akismet_enable_comment_author_url_removal() { + $( '#the-comment-list' ) + .find( 'tr.comment, tr[id ^= "comment-"]' ) + .find( '.column-author a[href^="http"]:first' ) // Ignore mailto: links, which would be the comment author's email. + .each(function () { + if ( $( this ).parent().find( '.akismet_remove_url' ).length > 0 ) { + return; + } + + var linkHref = $(this).attr( 'href' ); + + // Ignore any links to the current domain, which are diagnostic tools, like the IP address link + // or any other links another plugin might add. + var currentHostParts = document.location.href.split( '/' ); + var currentHost = currentHostParts[0] + '//' + currentHostParts[2] + '/'; + + if ( linkHref.indexOf( currentHost ) != 0 ) { + var thisCommentId = $(this).parents('tr:first').attr('id').split("-"); + + $(this) + .attr("id", "author_comment_url_"+ thisCommentId[1]) + .after( + $( 'x' ) + .attr( 'commentid', thisCommentId[1] ) + .attr( 'title', WPAkismet.strings['Remove this URL'] ) + ); + } + }); + } + + /** + * Generate an mShot URL if given a link URL. + * + * @param string linkUrl + * @param int retry If retrying a request, the number of the retry. + * @return string The mShot URL; + */ + function akismet_mshot_url( linkUrl, retry ) { + var mshotUrl = '//s0.wordpress.com/mshots/v1/' + encodeURIComponent( linkUrl ) + '?w=900'; + + if ( retry ) { + mshotUrl += '&r=' + encodeURIComponent( retry ); + } + + return mshotUrl; + } + + /** + * Begin loading an mShot preview of a link. + * + * @param string linkUrl + */ + function akismet_preload_mshot( linkUrl ) { + var img = new Image(); + img.src = akismet_mshot_url( linkUrl ); + } + + /** + * Sets the comment form privacy notice display to hide when one clicks Core's dismiss button on the related admin notice. + */ + $( '#akismet-privacy-notice-admin-notice' ).on( 'click', '.notice-dismiss', function(){ + $.ajax({ + url: './options-general.php?page=akismet-key-config&akismet_comment_form_privacy_notice=hide', + }); + }); }); -// URL encode plugin -jQuery.extend({URLEncode:function(c){var o='';var x=0;c=c.toString();var r=/(^[a-zA-Z0-9_.]*)/; - while(x1 && m[1]!=''){o+=m[1];x+=m[1].length; - }else{if(c[x]==' ')o+='+';else{var d=c.charCodeAt(x);var h=d.toString(16); - o+='%'+(h.length<2?'0':'')+h.toUpperCase();}x++;}}return o;} -});