Make WordPress Core

Ticket #27389: 27389-unbind.patch

File 27389-unbind.patch, 3.5 KB (added by azaozz, 10 years ago)
  • src/wp-includes/js/mce-view.js

     
    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                                }
     
    9395                },
    9496
    9597                /**
     98                 * wp.mce.views.unbind( editor )
     99                 *
     100                 * The editor DOM is being rebuilt.
     101                 * Fire an event for DOM cleanup for the passed TinyMCE instance.
     102                 */
     103                unbind: function( editor ) {
     104                        // fire event?
     105                },
     106
     107                /**
    96108                 * toViews( content )
    97109                 * Scans a `content` string for each view's pattern, replacing any
    98110                 * matches with wrapper elements, and creates a new instance for
  • src/wp-includes/js/tinymce/plugins/wpview/plugin.js

     
    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
     
    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        });
     
    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
     
    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 ) {