Make WordPress Core

Ticket #27389: 27389.10.diff

File 27389.10.diff, 6.0 KB (added by azaozz, 11 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                                }
    4850                        }, this );
    49                 }
     51                },
     52                unbind: function() {}
    5053        } );
    5154
    5255        // take advantage of the Backbone extend method
     
    9396                },
    9497
    9598                /**
     99                 * wp.mce.views.unbind( editor )
     100                 *
     101                 * The editor DOM is being rebuilt, run cleanup.
     102                 */
     103                unbind: function() {
     104                        _.each( instances, function( instance ) {
     105                                instance.unbind();
     106                        } );
     107                },
     108
     109                /**
    96110                 * toViews( content )
    97111                 * Scans a `content` string for each view's pattern, replacing any
    98112                 * matches with wrapper elements, and creates a new instance for
     
    339353         * @mixin
    340354         */
    341355        wp.mce.media = {
     356                loaded: false,
    342357                /**
    343358                 * @global wp.shortcode
    344359                 *
     
    410425         */
    411426        wp.mce.media.View = wp.mce.View.extend({
    412427                initialize: function( options ) {
     428                        this.players = [];
    413429                        this.shortcode = options.shortcode;
    414430                        _.bindAll( this, 'setPlayer' );
    415431                        $(this).on( 'ready', this.setPlayer );
     
    460476                        media = wp.media.view.MediaDetails.prepareSrc( media.get(0) );
    461477
    462478                        setTimeout( function() {
    463                                 self.player = new MediaElementPlayer( media, this.mejsSettings );
    464                         }, 75 );
     479                                wp.mce.media.loaded = true;
     480                                self.players.push( new MediaElementPlayer( media, self.mejsSettings ) );
     481                        }, wp.mce.media.loaded ? 10 : 500 );
    465482                },
    466483
    467484                /**
     
    475492                                wp.media[ this.shortcode.tag ].defaults
    476493                        );
    477494                        return this.template({ model: attrs });
     495                },
     496
     497                unbind: function() {
     498                        var self = this;
     499                        this.pauseAllPlayers();
     500                        _.each( this.players, function (player) {
     501                                self.removePlayer( player );
     502                        } );
     503                        this.players = [];
    478504                }
    479505        });
    480506        _.extend( wp.mce.media.View.prototype, wp.media.mixin );
  • src/wp-includes/js/media-audiovideo.js

     
    128128                 *      MediaElement tries to pull the audio/video tag out of
    129129                 *      its container and re-add it to the DOM.
    130130                 */
    131                 removePlayer: function() {
    132                         var t = this.player, featureIndex, feature;
     131                removePlayer: function(t) {
     132                        var featureIndex, feature;
    133133
    134134                        // invoke features cleanup
    135135                        for ( featureIndex in t.options.features ) {
     
    165165                unsetPlayer : function() {
    166166                        if ( this.player ) {
    167167                                wp.media.mixin.pauseAllPlayers();
    168                                 wp.media.mixin.removePlayer.apply( this );
     168                                wp.media.mixin.removePlayer( this.player );
    169169                                this.player = false;
    170170                        }
    171171                }
     
    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

     
    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        // Remove the content of view wrappers from HTML string
     145        function emptyViews( content ) {
     146                return content.replace(/(<div[^>]+wpview-wrap[^>]+>)[\s\S]+?data-wpview-end[^>]*><\/ins><\/div>/g, '$1</div>' );
     147        }
     148
     149        // Prevent adding undo levels on changes inside a view wrapper
    143150        editor.on( 'BeforeAddUndo', function( event ) {
    144                 if ( selected && ! toRemove ) {
     151                if ( event.lastLevel && emptyViews( event.level.content ) === emptyViews( event.lastLevel.content ) ) {
    145152                        event.preventDefault();
    146153                }
    147154        });
     
    149156        // When the editor's content changes, scan the new content for
    150157        // matching view patterns, and transform the matches into
    151158        // view wrappers.
    152         editor.on( 'BeforeSetContent', function( e ) {
    153                 if ( ! e.content ) {
     159        editor.on( 'BeforeSetContent', function( event ) {
     160                if ( ! event.content ) {
    154161                        return;
    155162                }
    156163
    157                 e.content = wp.mce.views.toViews( e.content );
     164                if ( ! event.initial ) {
     165                        wp.mce.views.unbind( editor );
     166                }
     167
     168                event.content = wp.mce.views.toViews( event.content );
    158169        });
    159170
    160171        // When the editor's content has been updated and the DOM has been
     
    162173        editor.on( 'SetContent', function( event ) {
    163174                var body, padNode;
    164175
    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                 }
     176                wp.mce.views.render();
    170177
    171178                // Add padding <p> if the noneditable node is last
    172179                if ( event.load || ! event.set ) {
     
    175182                        if ( isView( body.lastChild ) ) {
    176183                                padNode = createPadNode();
    177184                                body.appendChild( padNode );
    178                                 editor.selection.setCursorLocation( padNode, 0 );
     185
     186                                if ( ! event.initial ) {
     187                                        editor.selection.setCursorLocation( padNode, 0 );
     188                                }
    179189                        }
    180190                }
    181191        });