Make WordPress Core

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

File 27389-why-god-why.diff, 5.1 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 featureIndex, feature, domNode,
     445                                className = '.wp-' +  this.shortcode.tag + '-shortcode';
     446
     447                        // invoke features cleanup
     448                        for ( featureIndex in t.options.features ) {
     449                                feature = t.options.features[featureIndex];
     450                                if ( t['clean' + feature] ) {
     451                                        try {
     452                                                t['clean' + feature](t);
     453                                        } catch (e) {}
     454                                }
     455                        }
     456
     457                        if ( ! t.isDynamic ) {
     458                                domNode = $( node ).find( this.shortcode.tag + className ).clone();
     459                                domNode.removeAttr( 'src style' );
     460                                _.each( domNode.find( 'source' ), function (source) {
     461                                        source.src = source.src.replace(/_=\d+&?/, '');
     462                                } );
     463                                $( node ).find( 'div' + className ).replaceWith( domNode );
     464                        }
     465
     466                        if ( 'native' !== t.media.pluginType ) {
     467                                t.media.remove();
     468                        }
     469
     470                        delete window.mejs.players[t.id];
     471
     472                        t.container.remove();
     473                        t.globalUnbind();
     474                        delete t.node.player;
     475                },
     476
    416477                /**
    417478                 * Creates the player instance for the current node
    418479                 *
     
    428489                                return;
    429490                        }
    430491
    431                         var self = this,
     492                        var t,
     493                                self = this,
    432494                                media,
    433495                                firefox = this.ua.is( 'ff' ),
    434496                                className = '.wp-' +  this.shortcode.tag + '-shortcode';
    435497
    436                         if ( this.player ) {
    437                                 this.unsetPlayer();
     498                        if ( node.reinit && node !== this.lastNode ) {
     499                                t = _.isArray( this.player ) ? this.player.shift() : this.player;
     500                                if ( t ) {
     501                                        this.reinitPlayer( t, node );
     502                                }
     503                        } else {
     504                                if ( this.player.length ) {
     505                                        this.unsetPlayer();
     506                                }
    438507                        }
    439508
     509                        this.lastNode = node;
    440510                        media = $( node ).find( className );
    441511
    442512                        if ( ! this.isCompatible( media ) ) {
     
    458528                        media = wp.media.view.MediaDetails.prepareSrc( media.get(0) );
    459529
    460530                        setTimeout( function() {
    461                                 self.player = new MediaElementPlayer( media, this.mejsSettings );
     531                                self.player.push( new MediaElementPlayer( media, this.mejsSettings ) );
    462532                        }, 75 );
    463533                },
    464534
  • 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(player) {
     132                        var t = player || this.player, 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 );
    169                                 this.player = false;
     168                                if ( _.isArray( this.player ) ) {
     169                                        _.each( this.player, function ( player ) {
     170                                                wp.media.mixin.removePlayer( player );
     171                                        } );
     172                                        this.player = [];
     173                                } else {
     174                                        wp.media.mixin.removePlayer.apply( this );
     175                                        this.player = false;
     176                                }
    170177                        }
    171178                }
    172179        };
  • 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