Make WordPress Core

Ticket #27389: 27389-unbind-02.patch

File 27389-unbind-02.patch, 4.4 KB (added by gcorne, 11 years ago)
  • src/wp-includes/js/mce-view.js

    diff --git src/wp-includes/js/mce-view.js src/wp-includes/js/mce-view.js
    index d3af61e..587ee42 100644
    window.wp = window.wp || {}; 
    4141                                        doc = editor.getDoc();
    4242                                        $( doc ).find( '[data-wpview-text="' + this.encodedText + '"]' ).each(function (i, elem) {
    4343                                                var node = $( elem );
    44                                                 node.html( html );
     44                                                // The <ins> is used to mark the end of the wrapper div. Needed when comparing
     45                                                // the content as string for preventing extra undo levels.
     46                                                node.html( html ).append( '<ins data-wpview-end="1"></ins>' );
    4547                                                $( self ).trigger( 'ready', elem );
    4648                                        });
    4749                                }
    4850                        }, this );
    49                 }
     51                },
     52                unbind: function() {}
    5053        } );
    5154
    5255        // take advantage of the Backbone extend method
    window.wp = window.wp || {}; 
    9396                },
    9497
    9598                /**
     99                 * wp.mce.views.unbind( editor )
     100                 *
     101                 * The editor DOM is being rebuilt.
     102                 * Fire an event for DOM cleanup for the passed TinyMCE instance.
     103                 */
     104                unbind: function() {
     105                        _.each( instances, function( instance ) {
     106                                instance.unbind();
     107                        } );
     108                },
     109
     110                /**
    96111                 * toViews( content )
    97112                 * Scans a `content` string for each view's pattern, replacing any
    98113                 * matches with wrapper elements, and creates a new instance for
    window.wp = window.wp || {}; 
    475490                                wp.media[ this.shortcode.tag ].defaults
    476491                        );
    477492                        return this.template({ model: attrs });
     493                },
     494
     495                unbind: function() {
     496                        this.unsetPlayer();
    478497                }
    479498        });
    480499        _.extend( wp.mce.media.View.prototype, wp.media.mixin );
  • src/wp-includes/js/media-audiovideo.js

    diff --git src/wp-includes/js/media-audiovideo.js src/wp-includes/js/media-audiovideo.js
    index 3f659da..9bdddb2 100644
     
    914914
    915915        $( init );
    916916
    917 }(jQuery, _, Backbone));
    918  No newline at end of file
     917}(jQuery, _, Backbone));
  • src/wp-includes/js/tinymce/plugins/wpview/plugin.js

    diff --git src/wp-includes/js/tinymce/plugins/wpview/plugin.js src/wp-includes/js/tinymce/plugins/wpview/plugin.js
    index 812341c..368f874 100644
    tinymce.PluginManager.add( 'wpview', function( editor ) { 
    8080                        'contenteditable': 'true'
    8181                }, getViewText( viewNode ) );
    8282
    83                 viewNode.appendChild( clipboard );
     83                // Prepend inside the wrapper
     84                viewNode.insertBefore( clipboard, viewNode.firstChild );
    8485
    8586                // Both of the following are necessary to prevent manipulating the selection/focus
    86                 editor.dom.bind( clipboard, 'beforedeactivate focusin focusout', _stop );
    87                 editor.dom.bind( selected, 'beforedeactivate focusin focusout', _stop );
     87                dom.bind( clipboard, 'beforedeactivate focusin focusout', _stop );
     88                dom.bind( selected, 'beforedeactivate focusin focusout', _stop );
    8889
    8990                // Make sure that the editor is focused.
    9091                // It is possible that the editor is not focused when the mouse event fires
    tinymce.PluginManager.add( 'wpview', function( editor ) { 
    140141                return;
    141142        }
    142143
     144        function emptyViews( content ) {
     145                return content.replace(/(<div[^>]+wpview-wrap[^>]+>)[\s\S]+?data-wpview-end[^>]*><\/ins><\/div>/g, '$1</div>' );
     146        }
     147
    143148        editor.on( 'BeforeAddUndo', function( event ) {
    144                 if ( selected && ! toRemove ) {
     149                if ( event.lastLevel && emptyViews( event.level.content ) === emptyViews( event.lastLevel.content ) ) {
    145150                        event.preventDefault();
    146151                }
    147152        });
    tinymce.PluginManager.add( 'wpview', function( editor ) { 
    149154        // When the editor's content changes, scan the new content for
    150155        // matching view patterns, and transform the matches into
    151156        // view wrappers.
    152         editor.on( 'BeforeSetContent', function( e ) {
    153                 if ( ! e.content ) {
     157        editor.on( 'BeforeSetContent', function( event ) {
     158                if ( ! event.content ) {
    154159                        return;
    155160                }
    156161
    157                 e.content = wp.mce.views.toViews( e.content );
     162                if ( ! event.initial ) {
     163                        wp.mce.views.unbind( editor );
     164                }
     165
     166                event.content = wp.mce.views.toViews( event.content );
    158167        });
    159168
    160169        // When the editor's content has been updated and the DOM has been
    tinymce.PluginManager.add( 'wpview', function( editor ) { 
    162171        editor.on( 'SetContent', function( event ) {
    163172                var body, padNode;
    164173
    165                 // don't (re-)render views if the format of the content is raw
    166                 // to avoid adding additional undo levels on undo/redo
    167                 if ( event.format !== 'raw' ) {
    168                         wp.mce.views.render();
    169                 }
     174                wp.mce.views.render();
    170175
    171176                // Add padding <p> if the noneditable node is last
    172177                if ( event.load || ! event.set ) {