Make WordPress Core

Ticket #24756: 24756.3.diff

File 24756.3.diff, 23.0 KB (added by nacin, 11 years ago)

Same as 24756.2.diff, with max context.

  • wp-includes/js/autosave.js

     
    11var autosave, autosaveLast = '', autosavePeriodical, autosaveDelayPreview = false, notSaved = true, blockSave = false, fullscreen, autosaveLockRelease = true;
    22
    33jQuery(document).ready( function($) {
    44
    55        if ( $('#wp-content-wrap').hasClass('tmce-active') && typeof tinymce != 'undefined' ) {
    66                tinymce.onAddEditor.add( function( tinymce, editor ) {
    77                        if ( 'content' == editor.id ) {
    88                                editor.onLoad.add( function() {
    99                                        editor.save();
    10                                         autosaveLast = ( $('#title').val() || '' ) + ( $('#content').val() || '' );
     10                                        autosaveLast = wp.autosave.getLastSavedCompareString();
    1111                                });
    1212                        }
    1313                });
    1414        } else {
    15                 autosaveLast = ( $('#title').val() || '' ) + ( $('#content').val() || '' );
     15                autosaveLast = wp.autosave.getLastSavedCompareString();
    1616        }
    1717
    1818        autosavePeriodical = $.schedule({time: autosaveL10n.autosaveInterval * 1000, func: function() { autosave(); }, repeat: true, protect: true});
    1919
    2020        //Disable autosave after the form has been submitted
    2121        $("#post").submit(function() {
    2222                $.cancel(autosavePeriodical);
    2323                autosaveLockRelease = false;
    2424        });
    2525
    2626        $('input[type="submit"], a.submitdelete', '#submitpost').click(function(){
    2727                blockSave = true;
    2828                window.onbeforeunload = null;
    2929                $(':button, :submit', '#submitpost').each(function(){
    3030                        var t = $(this);
    3131                        if ( t.hasClass('button-primary') )
    3232                                t.addClass('button-primary-disabled');
    3333                        else
    3434                                t.addClass('button-disabled');
    3535                });
    3636                if ( $(this).attr('id') == 'publish' )
    3737                        $('#major-publishing-actions .spinner').show();
    3838                else
    3939                        $('#minor-publishing .spinner').show();
    4040        });
    4141
    4242        window.onbeforeunload = function(){
    43                 var mce = typeof(tinymce) != 'undefined' ? tinymce.activeEditor : false, title, content;
     43                var editor = typeof(tinymce) != 'undefined' ? tinymce.activeEditor : false, compareString;
    4444
    45                 if ( mce && !mce.isHidden() ) {
    46                         if ( mce.isDirty() )
     45                if ( editor && ! editor.isHidden() ) {
     46                        if ( editor.isDirty() )
    4747                                return autosaveL10n.saveAlert;
    4848                } else {
    4949                        if ( fullscreen && fullscreen.settings.visible ) {
    50                                 title = $('#wp-fullscreen-title').val() || '';
    51                                 content = $("#wp_mce_fullscreen").val() || '';
     50                                compareString = wp.autosave.getLastSavedCompareString({
     51                                        post_title: $('#wp-fullscreen-title').val() || '',
     52                                        content: $('#wp_mce_fullscreen').val() || '',
     53                                        excerpt: $('#excerpt').val() || ''
     54                                });
    5255                        } else {
    53                                 title = $('#post #title').val() || '';
    54                                 content = $('#post #content').val() || '';
     56                                compareString = wp.autosave.getLastSavedCompareString();
    5557                        }
    5658
    57                         if ( ( title || content ) && title + content != autosaveLast )
     59                        if ( compareString != autosaveLast )
    5860                                return autosaveL10n.saveAlert;
    5961                }
    6062        };
    6163
    6264        $(window).unload( function(e) {
    6365                if ( ! autosaveLockRelease )
    6466                        return;
    6567
    6668                // unload fires (twice) on removing the Thickbox iframe. Make sure we process only the main document unload.
    6769                if ( e.target && e.target.nodeName != '#document' )
    6870                        return;
    6971
    7072                $.ajax({
    7173                        type: 'POST',
    7274                        url: ajaxurl,
    7375                        async: false,
    7476                        data: {
    7577                                action: 'wp-remove-post-lock',
    7678                                _wpnonce: $('#_wpnonce').val(),
    7779                                post_ID: $('#post_ID').val(),
    7880                                active_post_lock: $('#active_post_lock').val()
    7981                        }
    8082                });
    8183        } );
    8284
    8385        // preview
    8486        $('#post-preview').click(function(){
    8587                if ( $('#auto_draft').val() == '1' && notSaved ) {
    8688                        autosaveDelayPreview = true;
    8789                        autosave();
    8890                        return false;
    8991                }
    9092                doPreview();
    9193                return false;
    9294        });
    9395
    9496        doPreview = function() {
    9597                $('input#wp-preview').val('dopreview');
    9698                $('form#post').attr('target', 'wp-preview').submit().attr('target', '');
    9799
    98100                /*
    99101                 * Workaround for WebKit bug preventing a form submitting twice to the same action.
    100102                 * https://bugs.webkit.org/show_bug.cgi?id=28633
    101103                 */
    102104                var ua = navigator.userAgent.toLowerCase();
    103105                if ( ua.indexOf('safari') != -1 && ua.indexOf('chrome') == -1 ) {
    104106                        $('form#post').attr('action', function(index, value) {
    105107                                return value + '?t=' + new Date().getTime();
    106108                        });
    107109                }
    108110
    109111                $('input#wp-preview').val('');
    110112        }
    111113
    112114        // This code is meant to allow tabbing from Title to Post content.
    113115        $('#title').on('keydown.editor-focus', function(e) {
    114116                var ed;
    115117
    116118                if ( e.which != 9 )
    117119                        return;
    118120
    119121                if ( !e.ctrlKey && !e.altKey && !e.shiftKey ) {
    120122                        if ( typeof(tinymce) != 'undefined' )
    121123                                ed = tinymce.get('content');
    122124
    123125                        if ( ed && !ed.isHidden() ) {
    124126                                $(this).one('keyup', function(e){
    125127                                        $('#content_tbl td.mceToolbar > a').focus();
    126128                                });
    127129                        } else {
    128130                                $('#content').focus();
    129131                        }
    130132
    131133                        e.preventDefault();
    132134                }
    133135        });
    134136
    135137        // autosave new posts after a title is typed but not if Publish or Save Draft is clicked
    136138        if ( '1' == $('#auto_draft').val() ) {
    137139                $('#title').blur( function() {
    138140                        if ( !this.value || $('#auto_draft').val() != '1' )
    139141                                return;
    140142                        delayed_autosave();
    141143                });
    142144        }
    143145
    144146        // When connection is lost, keep user from submitting changes.
    145147        $(document).on('heartbeat-connection-lost.autosave', function( e, error ) {
    146148                if ( 'timeout' === error ) {
    147149                        var notice = $('#lost-connection-notice');
    148150                        if ( ! wp.autosave.local.hasStorage ) {
    149151                                notice.find('.hide-if-no-sessionstorage').hide();
    150152                        }
    151153                        notice.show();
    152154                        autosave_disable_buttons();
    153155                }
    154156        }).on('heartbeat-connection-restored.autosave', function() {
    155157                $('#lost-connection-notice').hide();
    156158                autosave_enable_buttons();
    157159        });
    158160});
    159161
    160162function autosave_parse_response( response ) {
    161163        var res = wpAjax.parseAjaxResponse(response, 'autosave'), post_id, sup;
    162164
    163165        if ( res && res.responses && res.responses.length ) {
    164166                if ( res.responses[0].supplemental ) {
    165167                        sup = res.responses[0].supplemental;
    166168
    167169                        jQuery.each( sup, function( selector, value ) {
    168170                                if ( selector.match(/^replace-/) )
    169171                                        jQuery( '#' + selector.replace('replace-', '') ).val( value );
    170172                        });
    171173                }
    172174
    173175                // if no errors: add slug UI and update autosave-message
    174176                if ( !res.errors ) {
    175177                        if ( post_id = parseInt( res.responses[0].id, 10 ) )
    176178                                autosave_update_slug( post_id );
    177179
    178180                        if ( res.responses[0].data ) // update autosave message
    179181                                jQuery('.autosave-message').text( res.responses[0].data );
    180182                }
    181183        }
    182184
    183185        return res;
    184186}
    185187
    186188// called when autosaving pre-existing post
    187189function autosave_saved(response) {
    188190        blockSave = false;
    189191        autosave_parse_response(response); // parse the ajax response
    190192        autosave_enable_buttons(); // re-enable disabled form buttons
    191193}
    192194
    193195// called when autosaving new post
    194196function autosave_saved_new(response) {
    195197        blockSave = false;
    196198        var res = autosave_parse_response(response), post_id;
    197199
    198200        if ( res && res.responses.length && !res.errors ) {
    199201                // An ID is sent only for real auto-saves, not for autosave=0 "keepalive" saves
    200202                post_id = parseInt( res.responses[0].id, 10 );
    201203
    202204                if ( post_id ) {
    203205                        notSaved = false;
    204206                        jQuery('#auto_draft').val('0'); // No longer an auto-draft
    205207                }
    206208
    207209                autosave_enable_buttons();
    208210
    209211                if ( autosaveDelayPreview ) {
    210212                        autosaveDelayPreview = false;
    211213                        doPreview();
    212214                }
    213215        } else {
    214216                autosave_enable_buttons(); // re-enable disabled form buttons
    215217        }
    216218}
    217219
    218220function autosave_update_slug(post_id) {
    219221        // create slug area only if not already there
    220222        if ( 'undefined' != makeSlugeditClickable && jQuery.isFunction(makeSlugeditClickable) && !jQuery('#edit-slug-box > *').size() ) {
    221223                jQuery.post( ajaxurl, {
    222224                                action: 'sample-permalink',
    223225                                post_id: post_id,
    224226                                new_title: fullscreen && fullscreen.settings.visible ? jQuery('#wp-fullscreen-title').val() : jQuery('#title').val(),
    225227                                samplepermalinknonce: jQuery('#samplepermalinknonce').val()
    226228                        },
    227229                        function(data) {
    228230                                if ( data !== '-1' ) {
    229231                                        var box = jQuery('#edit-slug-box');
    230232                                        box.html(data);
    231233                                        if (box.hasClass('hidden')) {
    232234                                                box.fadeIn('fast', function () {
    233235                                                        box.removeClass('hidden');
    234236                                                });
    235237                                        }
    236238                                        makeSlugeditClickable();
    237239                                }
    238240                        }
    239241                );
    240242        }
    241243}
    242244
    243245function autosave_loading() {
    244246        jQuery('.autosave-message').html(autosaveL10n.savingText);
    245247}
    246248
    247249function autosave_enable_buttons() {
    248250        jQuery(document).trigger('autosave-enable-buttons');
    249         if ( ! wp.heartbeat.hasConnectionError() ) {
     251        if ( ! wp.heartbeat || ! wp.heartbeat.hasConnectionError() ) {
    250252                // delay that a bit to avoid some rare collisions while the DOM is being updated.
    251253                setTimeout(function(){
    252254                        var parent = jQuery('#submitpost');
    253255                        parent.find(':button, :submit').removeAttr('disabled');
    254256                        parent.find('.spinner').hide();
    255257                }, 500);
    256258        }
    257259}
    258260
    259261function autosave_disable_buttons() {
    260262        jQuery(document).trigger('autosave-disable-buttons');
    261263        jQuery('#submitpost').find(':button, :submit').prop('disabled', true);
    262264        // Re-enable 5 sec later. Just gives autosave a head start to avoid collisions.
    263265        setTimeout( autosave_enable_buttons, 5000 );
    264266}
    265267
    266268function delayed_autosave() {
    267269        setTimeout(function(){
    268270                if ( blockSave )
    269271                        return;
    270272                autosave();
    271273        }, 200);
    272274}
    273275
    274276autosave = function() {
    275277        var post_data = wp.autosave.getPostData(),
    276                 doAutoSave = post_data.autosave,
     278                compareString,
    277279                successCallback;
    278280
    279281        blockSave = true;
    280282
     283        // post_data.content cannot be retrieved at the moment
     284        if ( ! post_data.autosave )
     285                return false;
     286
    281287        // No autosave while thickbox is open (media buttons)
    282288        if ( jQuery("#TB_window").css('display') == 'block' )
    283                 doAutoSave = false;
     289                return false;
    284290
    285         // Nothing to save or no change.
    286         if ( ( post_data["post_title"].length == 0 && post_data["content"].length == 0 ) || post_data["post_title"] + post_data["content"] == autosaveLast ) {
    287                 doAutoSave = false;
    288         }
     291        compareString = wp.autosave.getLastSavedCompareString( post_data );
    289292
    290         if ( doAutoSave ) {
    291                 autosaveLast = post_data["post_title"] + post_data["content"];
    292                 jQuery(document).triggerHandler('wpcountwords', [ post_data["content"] ]);
    293         } else {
     293        // Nothing to save or no change.
     294        if ( compareString == autosaveLast )
    294295                return false;
    295         }
     296
     297        autosaveLast = compareString;
     298        jQuery(document).triggerHandler('wpcountwords', [ post_data["content"] ]);
    296299
    297300        // Disable buttons until we know the save completed.
    298301        autosave_disable_buttons();
    299302
    300303        if ( post_data["auto_draft"] == '1' ) {
    301304                successCallback = autosave_saved_new; // new post
    302305        } else {
    303306                successCallback = autosave_saved; // pre-existing post
    304307        }
    305308
    306309        jQuery.ajax({
    307310                data: post_data,
    308                 beforeSend: doAutoSave ? autosave_loading : null,
     311                beforeSend: autosave_loading,
    309312                type: "POST",
    310313                url: ajaxurl,
    311314                success: successCallback
    312315        });
    313316
    314317        return true;
    315318}
    316319
    317320// Autosave in localStorage
    318321// set as simple object/mixin for now
    319322window.wp = window.wp || {};
    320323wp.autosave = wp.autosave || {};
    321324
    322325(function($){
    323326// Returns the data for saving in both localStorage and autosaves to the server
    324327wp.autosave.getPostData = function() {
    325328        var ed = typeof tinymce != 'undefined' ? tinymce.activeEditor : null, post_name, parent_id, cats = [],
    326329                data = {
    327330                        action: 'autosave',
    328331                        autosave: true,
    329332                        post_id: $('#post_ID').val() || 0,
    330333                        autosavenonce: $('#autosavenonce').val() || '',
    331334                        post_type: $('#post_type').val() || '',
    332335                        post_author: $('#post_author').val() || '',
    333336                        excerpt: $('#excerpt').val() || ''
    334337                };
    335338
    336339        if ( ed && !ed.isHidden() ) {
    337340                // Don't run while the tinymce spellcheck is on. It resets all found words.
    338341                if ( ed.plugins.spellchecker && ed.plugins.spellchecker.active ) {
    339342                        data.autosave = false;
    340343                        return data;
    341344                } else {
    342345                        if ( 'mce_fullscreen' == ed.id )
    343346                                tinymce.get('content').setContent(ed.getContent({format : 'raw'}), {format : 'raw'});
    344347
    345348                        tinymce.triggerSave();
    346349                }
    347350        }
    348351
    349352        if ( typeof fullscreen != 'undefined' && fullscreen.settings.visible ) {
    350353                data['post_title'] = $('#wp-fullscreen-title').val() || '';
    351354                data['content'] = $('#wp_mce_fullscreen').val() || '';
    352355        } else {
    353356                data['post_title'] = $('#title').val() || '';
    354357                data['content'] = $('#content').val() || '';
    355358        }
    356359
    357360        /*
    358361        // We haven't been saving tags with autosave since 2.8... Start again?
    359362        $('.the-tags').each( function() {
    360363                data[this.name] = this.value;
    361364        });
    362365        */
    363366
    364367        $('input[id^="in-category-"]:checked').each( function() {
    365368                cats.push(this.value);
    366369        });
    367370        data['catslist'] = cats.join(',');
    368371
    369372        if ( post_name = $('#post_name').val() )
    370373                data['post_name'] = post_name;
    371374
    372375        if ( parent_id = $('#parent_id').val() )
    373376                data['parent_id'] = parent_id;
    374377
    375378        if ( $('#comment_status').prop('checked') )
    376379                data['comment_status'] = 'open';
    377380
    378381        if ( $('#ping_status').prop('checked') )
    379382                data['ping_status'] = 'open';
    380383
    381384        if ( $('#auto_draft').val() == '1' )
    382385                data['auto_draft'] = '1';
    383386
    384387        return data;
    385 }
     388};
     389
     390// Concatenate title, content and excerpt. Used to track changes when auto-saving.
     391wp.autosave.getLastSavedCompareString = function( post_data ) {
     392        if ( typeof post_data === 'object' ) {
     393                return ( post_data.post_title || '' ) + '::' + ( post_data.content || '' ) + '::' + ( post_data.excerpt || '' );
     394        }
     395
     396        return ( $('#title').val() || '' ) + '::' + ( $('#content').val() || '' ) + '::' + ( $('#excerpt').val() || '' );
     397};
    386398
    387399wp.autosave.local = {
    388400
    389401        lastsaveddata: '',
    390402        blog_id: 0,
    391         ajaxurl: window.ajaxurl || 'wp-admin/admin-ajax.php',
    392403        hasStorage: false,
    393404
    394405        // Check if the browser supports sessionStorage and it's not disabled
    395406        checkStorage: function() {
    396407                var test = Math.random(), result = false;
    397408
    398409                try {
    399410                        sessionStorage.setItem('wp-test', test);
    400411                        result = sessionStorage.getItem('wp-test') == test;
    401412                        sessionStorage.removeItem('wp-test');
    402413                } catch(e) {}
    403414
    404415                this.hasStorage = result;
    405416                return result;
    406417    },
    407418
    408419        /**
    409420         * Initialize the local storage
    410421         *
    411422         * @return mixed False if no sessionStorage in the browser or an Object containing all post_data for this blog
    412423         */
    413424        getStorage: function() {
    414425                var stored_obj = false;
    415426                // Separate local storage containers for each blog_id
    416427                if ( this.hasStorage && this.blog_id ) {
    417428                        stored_obj = sessionStorage.getItem( 'wp-autosave-' + this.blog_id );
    418429
    419430                        if ( stored_obj )
    420431                                stored_obj = JSON.parse( stored_obj );
    421432                        else
    422433                                stored_obj = {};
    423434                }
    424435
    425436                return stored_obj;
    426437        },
    427438
    428439        /**
    429440         * Set the storage for this blog
    430441         *
    431442         * Confirms that the data was saved successfully.
    432443         *
    433444         * @return bool
    434445         */
    435446        setStorage: function( stored_obj ) {
    436447                var key;
    437448
    438449                if ( this.hasStorage && this.blog_id ) {
    439450                        key = 'wp-autosave-' + this.blog_id;
    440451                        sessionStorage.setItem( key, JSON.stringify( stored_obj ) );
    441452                        return sessionStorage.getItem( key ) !== null;
    442453                }
    443454
    444455                return false;
    445456        },
    446457
    447458        /**
    448459         * Get the saved post data for the current post
    449460         *
    450461         * @return mixed False if no storage or no data or the post_data as an Object
    451462         */
    452463        getData: function() {
    453464                var stored = this.getStorage(), post_id = $('#post_ID').val();
    454465
    455466                if ( !stored || !post_id )
    456467                        return false;
    457468
    458469                return stored[ 'post_' + post_id ] || false;
    459470        },
    460471
    461472        /**
    462473         * Set (save or delete) post data in the storage.
    463474         *
    464475         * If stored_data evaluates to 'false' the storage key for the current post will be removed
    465476         *
    466477         * $param stored_data The post data to store or null/false/empty to delete the key
    467478         * @return bool
    468479         */
    469480        setData: function( stored_data ) {
    470481                var stored = this.getStorage(), post_id = $('#post_ID').val();
    471482
    472483                if ( !stored || !post_id )
    473484                        return false;
    474485
    475486                if ( stored_data )
    476487                        stored[ 'post_' + post_id ] = stored_data;
    477488                else if ( stored.hasOwnProperty( 'post_' + post_id ) )
    478489                        delete stored[ 'post_' + post_id ];
    479490                else
    480491                        return false;
    481492
    482493                return this.setStorage(stored);
    483494        },
    484495
    485496        /**
    486497         * Save post data for the current post
    487498         *
    488499         * Runs on a 15 sec. schedule, saves when there are differences in the post title or content.
    489500         * When the optional data is provided, updates the last saved post data.
    490501         *
    491502         * $param data optional Object The post data for saving, minimum 'post_title' and 'content'
    492503         * @return bool
    493504         */
    494505        save: function( data ) {
    495                 var result = false;
     506                var result = false, post_data, compareString;
    496507
    497508                if ( ! data ) {
    498509                        post_data = wp.autosave.getPostData();
    499510                } else {
    500511                        post_data = this.getData() || {};
    501512                        $.extend( post_data, data );
    502513                        post_data.autosave = true;
    503514                }
    504515
    505                 // If the content and title did not change since the last save, don't save again
    506                 if ( post_data.post_title + ': ' + post_data.content == this.lastsaveddata )
     516                // Cannot get the post data at the moment
     517                if ( ! post_data.autosave )
    507518                        return false;
    508519
    509                 // Cannot get the post data at the moment
    510                 if ( !post_data.autosave )
     520                compareString = wp.autosave.getLastSavedCompareString( post_data );
     521
     522                // If the content, title and excerpt did not change since the last save, don't save again
     523                if ( compareString == this.lastsaveddata )
    511524                        return false;
    512525
    513526                post_data['save_time'] = (new Date()).getTime();
    514527                post_data['status'] = $('#post_status').val() || '';
    515528                result = this.setData( post_data );
    516529
    517530                if ( result )
    518                         this.lastsaveddata = post_data.post_title + ': ' + post_data.content;
     531                        this.lastsaveddata = compareString;
    519532
    520533                return result;
    521534        },
    522535
    523536        // Initialize and run checkPost() on loading the script (before TinyMCE init)
    524537        init: function( settings ) {
    525538                var self = this;
    526539
    527                 // Check if the browser supports sessionStorage and editor.js is loaded
    528                 if ( ! this.checkStorage() || typeof switchEditors == 'undefined' )
     540                // Check if the browser supports sessionStorage and it's not disabled
     541                if ( ! this.checkStorage() )
    529542                        return;
    530543
    531544                // Don't run if the post type supports neither 'editor' (textarea#content) nor 'excerpt'.
    532545                if ( ! $('#content').length && ! $('#excerpt').length )
    533546                        return;
    534547
    535548                if ( settings )
    536549                        $.extend( this, settings );
    537550
    538551                if ( !this.blog_id )
    539552                        this.blog_id = typeof window.autosaveL10n != 'undefined' ? window.autosaveL10n.blog_id : 0;
    540553
    541                 this.checkPost();
    542554                $(document).ready( function(){ self.run(); } );
    543555        },
    544556
    545557        // Run on DOM ready
    546558        run: function() {
    547                 var self = this, post_data;
    548 
    549                 // Set the comparison string
    550                 if ( !this.lastsaveddata ) {
    551                         post_data = wp.autosave.getPostData();
     559                var self = this;
    552560
    553                         if ( post_data.content && $('#wp-content-wrap').hasClass('tmce-active') )
    554                                 this.lastsaveddata = post_data.post_title + ': ' + switchEditors.pre_wpautop( post_data.content );
    555                         else
    556                                 this.lastsaveddata = post_data.post_title + ': ' + post_data.content;
    557                 }
     561                // Check if the local post data is different than the loaded post data.
     562                this.checkPost();
    558563
    559564                // Set the schedule
    560565                this.schedule = $.schedule({
    561566                        time: 15 * 1000,
    562567                        func: function() { wp.autosave.local.save(); },
    563568                        repeat: true,
    564569                        protect: true
    565570                });
    566571
    567572                $('form#post').on('submit.autosave-local', function() {
    568573                        var editor = typeof tinymce != 'undefined' && tinymce.get('content'), post_id = $('#post_ID').val() || 0;
    569574
    570575                        if ( editor && ! editor.isHidden() ) {
    571576                                // Last onSubmit event in the editor, needs to run after the content has been moved to the textarea.
    572577                                editor.onSubmit.add( function() {
    573578                                        wp.autosave.local.save({
    574579                                                post_title: $('#title').val() || '',
    575580                                                content: $('#content').val() || '',
    576581                                                excerpt: $('#excerpt').val() || ''
    577582                                        });
    578583                                });
    579584                        } else {
    580585                                self.save({
    581586                                        post_title: $('#title').val() || '',
    582587                                        content: $('#content').val() || '',
    583588                                        excerpt: $('#excerpt').val() || ''
    584589                                });
    585590                        }
    586591
    587592                        wpCookies.set( 'wp-saving-post-' + post_id, 'check' );
    588593                });
    589594        },
    590595
    591596        // Strip whitespace and compare two strings
    592597        compare: function( str1, str2 ) {
    593598                function remove( string ) {
    594599                        return string.toString().replace(/[\x20\t\r\n\f]+/g, '');
    595600                }
    596601
    597602                return ( remove( str1 || '' ) == remove( str2 || '' ) );
    598603        },
    599604
    600605        /**
    601606         * Check if the saved data for the current post (if any) is different than the loaded post data on the screen
    602607         *
    603608         * Shows a standard message letting the user restore the post data if different.
    604609         *
    605610         * @return void
    606611         */
    607612        checkPost: function() {
    608                 var self = this, post_data = this.getData(), content, check_data, strip_tags = false, notice,
     613                var self = this, post_data = this.getData(), content, post_title, excerpt, notice,
    609614                        post_id = $('#post_ID').val() || 0, cookie = wpCookies.get( 'wp-saving-post-' + post_id );
    610615
    611616                if ( ! post_data )
    612617                        return;
    613618
    614619                if ( cookie ) {
    615620                        wpCookies.remove( 'wp-saving-post-' + post_id );
    616621
    617622                        if ( cookie == 'saved' ) {
    618623                                // The post was saved properly, remove old data and bail
    619624                                this.setData( false );
    620625                                return;
    621626                        }
    622627                }
    623628
    624629                // There is a newer autosave. Don't show two "restore" notices at the same time.
    625630                if ( $('#has-newer-autosave').length )
    626631                        return;
    627632
    628                 // cookie == 'check' means the post was not saved properly, always show #local-storage-notice
    629                 if ( cookie != 'check' ) {
    630                         content = $('#content').val();
    631                         check_data = $.extend( {}, post_data );
     633                content = $('#content').val() || '';
     634                post_title = $('#title').val() || '';
     635                excerpt = $('#excerpt').val() || '';
    632636
    633                         if ( $('#wp-content-wrap').hasClass('tmce-active') )
    634                                 content = switchEditors.pre_wpautop( content );
     637                if ( $('#wp-content-wrap').hasClass('tmce-active') && typeof switchEditors != 'undefined' )
     638                        content = switchEditors.pre_wpautop( content );
    635639
    636                         if ( this.compare( content, check_data.content ) && this.compare( $('#title').val(), check_data.post_title ) && this.compare( $('#excerpt').val(), check_data.excerpt ) )
    637                                 return;
     640                // cookie == 'check' means the post was not saved properly, always show #local-storage-notice
     641                if ( cookie != 'check' && this.compare( content, post_data.content ) && this.compare( post_title, post_data.post_title ) && this.compare( excerpt, post_data.excerpt ) ) {
     642                        return;
    638643                }
    639644
    640645                this.restore_post_data = post_data;
    641                 this.undo_post_data = wp.autosave.getPostData();
     646                this.undo_post_data = {
     647                        content: content,
     648                        post_title: post_title,
     649                        excerpt: excerpt
     650                };
    642651
    643652                notice = $('#local-storage-notice');
    644653                $('.wrap h2').first().after( notice.addClass('updated').show() );
    645654
    646655                notice.on( 'click', function(e) {
    647656                        var target = $( e.target );
    648657
    649658                        if ( target.hasClass('restore-backup') ) {
    650659                                self.restorePost( self.restore_post_data );
    651660                                target.parent().hide();
    652661                                $(this).find('p.undo-restore').show();
    653662                        } else if ( target.hasClass('undo-restore-backup') ) {
    654663                                self.restorePost( self.undo_post_data );
    655664                                target.parent().hide();
    656665                                $(this).find('p.local-restore').show();
    657666                        }
    658667
    659668                        e.preventDefault();
    660669                });
    661670        },
    662671
    663672        // Restore the current title, content and excerpt from post_data.
    664673        restorePost: function( post_data ) {
    665674                var editor;
    666675
    667676                if ( post_data ) {
    668677                        // Set the last saved data
    669                         this.lastsaveddata = post_data.post_title + ': ' + post_data.content;
     678                        this.lastsaveddata = wp.autosave.getLastSavedCompareString( post_data );
    670679
    671680                        if ( $('#title').val() != post_data.post_title )
    672681                                $('#title').focus().val( post_data.post_title || '' );
    673682
    674683                        $('#excerpt').val( post_data.excerpt || '' );
    675684                        editor = typeof tinymce != 'undefined' && tinymce.get('content');
    676685
    677                         if ( editor && ! editor.isHidden() ) {
     686                        if ( editor && ! editor.isHidden() && typeof switchEditors != 'undefined' ) {
    678687                                // Make sure there's an undo level in the editor
    679688                                editor.undoManager.add();
    680689                                editor.setContent( post_data.content ? switchEditors.wpautop( post_data.content ) : '' );
    681690                        } else {
    682691                                // Make sure the Text editor is selected
    683692                                $('#content-html').click();
    684693                                $('#content').val( post_data.content );
    685694                        }
    686695
    687696                        return true;
    688697                }
    689698
    690699                return false;
    691700        }
    692 }
     701};
    693702
    694703wp.autosave.local.init();
    695704
    696705}(jQuery));