Make WordPress Core

Ticket #25073: 25073.2.patch

File 25073.2.patch, 4.8 KB (added by azaozz, 11 years ago)
  • wp-includes/js/heartbeat.js

     
    2929        var Heartbeat = function() {
    3030                var self = this,
    3131                        running,
    32                         beat,
     32                        beatTimeout,
    3333                        screenId = typeof pagenow != 'undefined' ? pagenow : '',
    3434                        url = typeof ajaxurl != 'undefined' ? ajaxurl : '',
    3535                        settings,
     
    146146                function connect() {
    147147                        var send = {}, data, i, empty = true,
    148148                        nonce = typeof window.heartbeatSettings == 'object' ? window.heartbeatSettings.nonce : '';
     149
     150                        // If the connection to the server is slower than the interval,
     151                        // heartbeat connects as soon as the previous connection's response is received.
     152                        if ( connecting ) {
     153                                return;
     154                        }
     155
    149156                        tick = time();
    150157
    151158                        data = $.extend( {}, queue );
     
    164171                        // If nothing to send (nothing is expecting a response),
    165172                        // schedule the next tick and bail
    166173                        if ( empty && ! self.hasConnectionError() ) {
    167                                 connecting = false;
    168174                                next();
    169175                                return;
    170176                        }
     
    183189                                timeout: 30000, // throw an error if not completed after 30 sec.
    184190                                data: send,
    185191                                dataType: 'json'
     192                        }).always( function() {
     193                                connecting = false;
     194                                next();
    186195                        }).done( function( response, textStatus, jqXHR ) {
    187196                                var new_interval;
    188197
     
    209218                                // do this last, can trigger the next XHR if connection time > 5 sec. and new_interval == 'fast'
    210219                                if ( new_interval )
    211220                                        self.interval.call( self, new_interval );
    212                         }).always( function() {
    213                                 connecting = false;
    214                                 next();
    215221                        }).fail( function( jqXHR, textStatus, error ) {
    216222                                errorstate( textStatus || 'unknown' );
    217223                                self.error( jqXHR, textStatus, error );
     
    231237                                countdown--;
    232238                        }
    233239
    234                         window.clearTimeout(beat);
     240                        window.clearTimeout( beatTimeout );
    235241
    236242                        if ( delta < t ) {
    237                                 beat = window.setTimeout(
     243                                beatTimeout = window.setTimeout(
    238244                                        function(){
    239245                                                if ( running )
    240246                                                        connect();
     
    265271                                return;
    266272
    267273                        hasFocus = true;
    268                         window.clearTimeout(beat);
    269 
    270                         if ( ! connecting )
    271                                 next();
     274                        next();
    272275                }
    273276
    274277                function setFrameEvents() {
     
    290293                        });
    291294                }
    292295
    293                 $(window).on( 'blur.wp-heartbeat-focus', function(e) {
    294                         setFrameEvents();
    295                         winBlurTimeout = window.setTimeout( function(){ blurred(); }, 500 );
    296                 }).on( 'focus.wp-heartbeat-focus', function() {
    297                         $('iframe').each( function( i, frame ) {
    298                                 if ( !isLocalFrame( frame ) )
    299                                         return;
    300 
    301                                 $.removeData( frame, 'wp-heartbeat-focus' );
    302                                 $( frame.contentWindow ).off( '.wp-heartbeat-focus' );
    303                         });
    304 
    305                         focused();
    306                 });
    307 
    308296                function userIsActive() {
    309297                        userActiveEvents = false;
    310298                        $(document).off( '.wp-heartbeat-active' );
     
    341329                        }
    342330                }
    343331
     332                $(window).on( 'blur.wp-heartbeat-focus', function(e) {
     333                        setFrameEvents();
     334                        winBlurTimeout = window.setTimeout( function(){ blurred(); }, 500 );
     335                }).on( 'focus.wp-heartbeat-focus', function() {
     336                        $('iframe').each( function( i, frame ) {
     337                                if ( !isLocalFrame( frame ) )
     338                                        return;
     339
     340                                $.removeData( frame, 'wp-heartbeat-focus' );
     341                                $( frame.contentWindow ).off( '.wp-heartbeat-focus' );
     342                        });
     343
     344                        focused();
     345                }).on( 'unload.wp-heartbeat', function() {
     346                        // Don't connect any more
     347                        running = false;
     348                });
     349
    344350                // Check for user activity every 30 seconds.
    345351                window.setInterval( function(){ checkUserActive(); }, 30000 );
    346352                $(document).ready( function() {
     
    355361                };
    356362
    357363                /**
     364                 * Connect asap regardless of 'hasFocus'. Will not open two concurrent connections.
     365                 * If a connection is in progress, will connect again immediately after the current connection completes.
     366                 *
     367                 */                                             
     368                this.connectNow = function() {
     369                        tick = 0;
     370                        next();
     371                };
     372
     373                /**
    358374                 * Get/Set the interval
    359375                 *
    360376                 * When setting to 'fast', the interval is 5 sec. for the next 30 ticks (for 2 min and 30 sec).
     
    365381                 * @return int Current interval in seconds
    366382                 */
    367383                this.interval = function( speed, ticks ) {
    368                         var reset, seconds;
     384                        var seconds, oldInerval = interval;
     385
    369386                        ticks = parseInt( ticks, 10 ) || 30;
    370387                        ticks = ticks < 1 || ticks > 30 ? 30 : ticks;
    371388
     
    389406                                                countdown = 0;
    390407                                }
    391408
    392                                 // Reset when the new interval value is lower than the current one
    393                                 reset = seconds * 1000 < interval;
    394 
    395409                                if ( countdown > 0 ) {
    396410                                        tempInterval = seconds * 1000;
    397411                                } else {
     
    399413                                        tempInterval = 0;
    400414                                }
    401415
    402                                 if ( reset )
     416                                // Change the next connection time if the new interval is different
     417                                if ( seconds * 1000 != oldInerval ) {
     418                                        tick = tick - ( oldInerval - seconds * 1000 );
    403419                                        next();
     420                                }
    404421                        }
    405422
    406423                        if ( ! hasFocus )
    407                                 return 120;
     424                                return 100;
    408425
    409426                        return tempInterval ? tempInterval / 1000 : interval / 1000;
    410427                };