WordPress.org

Make WordPress Core

Ticket #23216: 23216.patch

File 23216.patch, 8.0 KB (added by azaozz, 5 years ago)
  • wp-admin/admin-ajax.php

     
    5656        'save-widget', 'set-post-thumbnail', 'date_format', 'time_format', 'wp-fullscreen-save-post',
    5757        'wp-remove-post-lock', 'dismiss-wp-pointer', 'upload-attachment', 'get-attachment',
    5858        'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor',
    59         'send-attachment-to-editor', 'save-attachment-order',
     59        'send-attachment-to-editor', 'save-attachment-order', 'heartbeat',
    6060);
    6161
    6262// Register core Ajax calls.
  • wp-admin/includes/ajax-actions.php

     
    20712071
    20722072        wp_send_json_success( $html );
    20732073}
     2074
     2075function wp_ajax_heartbeat() {
     2076        check_ajax_referer( 'heartbeat-nonce', '_nonce' );
     2077        $response = array();
     2078
     2079        if ( ! empty($_POST['data']) ) {
     2080                $data = (array) $_POST['data'];
     2081                // todo: how much to sanitize and preset and what to leave to be accessed from $data or $_POST..?
     2082                $user = wp_get_current_user();
     2083                $data['user_id'] = $user->exists() ? $user->ID : 0;
     2084
     2085                // todo: separate filters: 'heartbeat_[action]' so we call different callbacks only when there is data for them,
     2086                // or all callbacks listen to one filter and run when there is something for them in $data?
     2087                $response = apply_filters( 'heartbeat_received', $response, $data );
     2088        }
     2089
     2090        $response = apply_filters( 'heartbeat_send', $response );
     2091
     2092        // Allow the transport to be replaced with long-polling easily
     2093        do_action( 'heartbeat_tick', $response );
     2094
     2095        // always send the current time acording to the server
     2096        $response['time'] = time();
     2097
     2098        wp_send_json($response);
     2099}
  • wp-admin/load-scripts.php

     
    103103function json_encode() {}
    104104endif;
    105105
     106/**
     107 * @ignore
     108 */
     109function wp_create_nonce() {}
     110
    106111function get_file($path) {
    107112
    108113        if ( function_exists('realpath') )
  • wp-admin/load-styles.php

     
    8181 */
    8282function wp_guess_url() {}
    8383
     84/**
     85 * @ignore
     86 */
     87function wp_create_nonce() {}
     88
    8489function get_file($path) {
    8590
    8691        if ( function_exists('realpath') )
  • wp-includes/js/autosave.js

     
    341341        }
    342342
    343343        autosaveOldMessage = jQuery('#autosave').html();
     344       
     345        // for testing only
     346        wp.heartbeat.send('autosave', post_data);
     347       
     348       
     349        /*
    344350        jQuery.ajax({
    345351                data: post_data,
    346352                beforeSend: doAutoSave ? autosave_loading : null,
     
    348354                url: ajaxurl,
    349355                success: successCallback
    350356        });
     357        */
    351358}
  • wp-includes/js/heartbeat.js

     
     1/**
     2 * Heartbeat API
     3 */
     4
     5 // Ensure the global `wp` object exists.
     6window.wp = window.wp || {};
     7
     8(function($){
     9        var Heartbeat = function() {
     10                var self = this,
     11                        running,
     12                        timeout,
     13                        nonce,
     14                        tick = 0,
     15                        queue = {},
     16                        interval,
     17                        lastconnect = 0;
     18
     19                this.url = typeof ajaxurl != 'undefined' ? ajaxurl : 'wp-admin/admin-ajax.php';
     20                this.autostart = true;
     21
     22                if ( typeof( window.heartbeatSettings != 'undefined' ) ) {
     23                        settings = $.extend( {}, window.heartbeatSettings );
     24                        delete window.heartbeatSettings;
     25
     26                        nonce = settings.nonce || '';
     27                        delete settings.nonce;
     28
     29                        interval = settings.interval || 15000; // default interval
     30                        delete settings.interval;
     31
     32                        $.extend( this, settings );
     33                }
     34
     35                function time(s) {
     36                        if ( s )
     37                                return parseInt( (new Date()).getTime() / 1000 );
     38
     39                        return (new Date()).getTime();
     40                }
     41
     42                function throttle(seconds) {
     43                        if ( seconds ) {
     44                                // Limit
     45                                if ( 5 > seconds || seconds > 60 )
     46                                        return false;
     47
     48                                interval = seconds * 1000;
     49                        } else if ( seconds === 0 ) {
     50                                // Allow long polling to be turned on
     51                                interval = 0;
     52                        }
     53                        return interval / 1000;
     54                }
     55
     56                function errorstate() {
     57                        var since;
     58
     59                        if ( lastconnect ) {
     60                                since = time() - lastconnect;
     61
     62                                if ( since > 180000 ) {
     63                                        self.connectionLost = true;
     64                                        $(document).trigger( 'heartbeat-connection-lost', { seconds: parseInt(since / 1000) } );
     65                                } else if ( self.connectionLost ) {
     66                                        self.connectionLost = false;
     67                                        $(document).trigger( 'heartbeat-connection-restored' );
     68                                }
     69                        }
     70                }
     71
     72                function connect() {
     73                        var data = {};
     74                        tick = time();
     75
     76                        data.data = $.extend( {}, queue );
     77                        queue = {};
     78
     79                        data.interval = interval / 1000;
     80                        data._nonce = nonce;
     81                        data.action = 'heartbeat';
     82
     83                        self.xhr = $.post( self.url, data, function(r){
     84                                lastconnect = time();
     85                                self.tick(r);
     86                        }, 'json' ).always( function(){
     87                                next();
     88                        }).fail( function(r){
     89                                errorstate();
     90                                self.error(r);
     91                        });
     92                };
     93
     94                function next() {
     95                        var delta = time() - tick;
     96
     97                        if ( !running )
     98                                return;
     99
     100                        if ( delta < interval ) {
     101                                timeout = window.setTimeout(
     102                                        function(){
     103                                                if ( running )
     104                                                        connect();
     105                                        },
     106                                        interval - delta
     107                                );
     108                        } else {
     109                                window.clearTimeout(timeout); // this has already expired?
     110                                connect();
     111                        }
     112                };
     113
     114                this.interval = function(seconds) {
     115                        return throttle(seconds);
     116                };
     117
     118                this.start = function() {
     119                        // start only once
     120                        if ( running )
     121                                return false;
     122
     123                        running = true;
     124                        connect();
     125
     126                        return true;
     127                };
     128
     129                this.stop = function() {
     130                        if ( !running )
     131                                return false;
     132
     133                        if ( self.xhr )
     134                                self.xhr.abort();
     135
     136                        running = false;
     137                        return true;
     138                }
     139
     140                this.send = function(action, data) {
     141                        if ( action )
     142                                queue[action] = data;
     143                }
     144
     145                if ( this.autostart )
     146                        $(document).ready( function(){ self.start(); });
     147        }
     148
     149        $.extend( Heartbeat.prototype, {
     150                tick: function(r) {
     151                        $(document).trigger( 'heartbeat-tick', r );
     152                },
     153                error: function(r) {
     154                        $(document).trigger( 'heartbeat-error', r );
     155                }
     156        });
     157
     158        wp.heartbeat = new Heartbeat();
     159
     160}(jQuery));
  • wp-includes/js/heartbeat.js

  • wp-includes/script-loader.php

    Property changes on: wp-includes/js/heartbeat.js
    ___________________________________________________________________
    Added: svn:eol-style
    ## -0,0 +1 ##
    +native
    \ No newline at end of property
     
    107107        ) );
    108108
    109109        $scripts->add( 'autosave', "/wp-includes/js/autosave$suffix.js", array('schedule', 'wp-ajax-response'), false, 1 );
     110       
     111        $scripts->add( 'heartbeat', "/wp-includes/js/heartbeat$suffix.js", array(), false, 1 );
     112        did_action( 'init' ) && $scripts->localize( 'heartbeat', 'heartbeatSettings',
     113                apply_filters( 'heartbeatSettings', array( 'nonce' => wp_create_nonce( 'heartbeat-nonce' ) ) )
     114        );
    110115
    111116        $scripts->add( 'wp-lists', "/wp-includes/js/wp-lists$suffix.js", array( 'wp-ajax-response', 'jquery-color' ), false, 1 );
    112117
     
    371376
    372377                $scripts->add( 'postbox', "/wp-admin/js/postbox$suffix.js", array('jquery-ui-sortable'), false, 1 );
    373378
    374                 $scripts->add( 'post', "/wp-admin/js/post$suffix.js", array('suggest', 'wp-lists', 'postbox'), false, 1 );
     379                $scripts->add( 'post', "/wp-admin/js/post$suffix.js", array('suggest', 'wp-lists', 'postbox', 'heartbeat'), false, 1 );
    375380                did_action( 'init' ) && $scripts->localize( 'post', 'postL10n', array(
    376381                        'ok' => __('OK'),
    377382                        'cancel' => __('Cancel'),