Make WordPress Core

Ticket #27389: 27389-why-god-why.2.diff

File 27389-why-god-why.2.diff, 4.6 KB (added by wonderboymusic, 10 years ago)
  • src/wp-includes/js/mce-view.js

     
    4242                                        $( doc ).find( '[data-wpview-text="' + this.encodedText + '"]' ).each(function (i, elem) {
    4343                                                var node = $( elem );
    4444                                                node.html( html );
     45                                                elem.reinit = false;
    4546                                                $( self ).trigger( 'ready', elem );
    4647                                        });
    4748                                }
    4849                        }, this );
     50                },
     51                reinit: function() {
     52                        // Search all tinymce editor instances and update the placeholders
     53                        _.each( tinymce.editors, function( editor ) {
     54                                var doc, self = this;
     55                                if ( editor.plugins.wpview ) {
     56                                        doc = editor.getDoc();
     57                                        $( doc ).find( '[data-wpview-text="' + this.encodedText + '"]' ).each(function (i, elem) {
     58                                                elem.reinit = true;
     59                                                $( self ).trigger( 'ready', elem );
     60                                        });
     61                                }
     62                        }, this );
     63
    4964                }
    5065        } );
    5166
     
    209224                        wp.mce.views.render();
    210225                },
    211226
     227                /**
     228                 * Trigger event that individual views can use to initialize any event bindings
     229                 *
     230                 * Note: Great care needs to be taken to avoid memory leaks when binding events directly to view nodes.
     231                 */
     232                reinitializeViews: function() {
     233                        _.each( instances, function( instance ) {
     234                                instance.reinit();
     235                        } );
     236                },
     237
    212238                getInstance: function( encodedText ) {
    213239                        return instances[ encodedText ];
    214240                },
     
    408434         */
    409435        wp.mce.media.View = wp.mce.View.extend({
    410436                initialize: function( options ) {
     437                        this.player = [];
    411438                        this.shortcode = options.shortcode;
    412439                        _.bindAll( this, 'setPlayer' );
    413440                        $(this).on( 'ready', this.setPlayer );
    414441                },
    415442
     443                reinitPlayer: function(t, node) {
     444                        var domNode,
     445                                className = '.wp-' +  this.shortcode.tag + '-shortcode';
     446
     447                        this.cleanupPlayer( t );
     448
     449                        domNode = $( node ).find( this.shortcode.tag + className ).clone();
     450                        domNode.removeAttr( 'src style' );
     451                        $( node ).find( 'div' + className ).replaceWith( domNode );
     452                },
     453
    416454                /**
    417455                 * Creates the player instance for the current node
    418456                 *
     
    428466                                return;
    429467                        }
    430468
    431                         var self = this,
     469                        var t,
     470                                self = this,
    432471                                media,
    433472                                firefox = this.ua.is( 'ff' ),
    434473                                className = '.wp-' +  this.shortcode.tag + '-shortcode';
    435474
    436                         if ( this.player ) {
    437                                 this.unsetPlayer();
     475                        if ( node.reinit && node !== this.lastNode ) {
     476                                t = _.isArray( this.player ) ? this.player.shift() : this.player;
     477                                if ( t ) {
     478                                        this.reinitPlayer( t, node );
     479                                }
     480                        } else {
     481                                if ( this.player.length ) {
     482                                        this.unsetPlayer();
     483                                }
    438484                        }
    439485
     486                        this.lastNode = node;
    440487                        media = $( node ).find( className );
    441488
    442489                        if ( ! this.isCompatible( media ) ) {
     
    458505                        media = wp.media.view.MediaDetails.prepareSrc( media.get(0) );
    459506
    460507                        setTimeout( function() {
    461                                 self.player = new MediaElementPlayer( media, this.mejsSettings );
     508                                self.player.push( new MediaElementPlayer( media, this.mejsSettings ) );
    462509                        }, 75 );
    463510                },
    464511
  • src/wp-includes/js/media-audiovideo.js

     
    122122
    123123                        return test;
    124124                },
    125 
    126125                /**
    127126                 * Override the MediaElement method for removing a player.
    128127                 *      MediaElement tries to pull the audio/video tag out of
    129128                 *      its container and re-add it to the DOM.
    130129                 */
    131                 removePlayer: function() {
    132                         var t = this.player, featureIndex, feature;
    133 
     130                cleanupPlayer: function(t) {
     131                        var featureIndex, feature;
    134132                        // invoke features cleanup
    135133                        for ( featureIndex in t.options.features ) {
    136134                                feature = t.options.features[featureIndex];
     
    165163                unsetPlayer : function() {
    166164                        if ( this.player ) {
    167165                                wp.media.mixin.pauseAllPlayers();
    168                                 wp.media.mixin.removePlayer.apply( this );
    169                                 this.player = false;
     166                                if ( _.isArray( this.player ) ) {
     167                                        _.each( this.player, function ( player ) {
     168                                                wp.media.mixin.cleanupPlayer( player );
     169                                        } );
     170                                        this.player = [];
     171                                } else {
     172                                        wp.media.mixin.cleanupPlayer( this.player );
     173                                        this.player = false;
     174                                }
    170175                        }
    171176                }
    172177        };
  • src/wp-includes/js/tinymce/plugins/wpview/plugin.js

     
    166166                // to avoid adding additional undo levels on undo/redo
    167167                if ( event.format !== 'raw' ) {
    168168                        wp.mce.views.render();
     169                } else {
     170                        wp.mce.views.reinitializeViews();
    169171                }
    170172
    171173                // Add padding <p> if the noneditable node is last