Ticket #27389: 27389.9.diff
| File 27389.9.diff, 5.6 KB (added by , 12 years ago) |
|---|
-
src/wp-includes/js/mce-view.js
41 41 doc = editor.getDoc(); 42 42 $( doc ).find( '[data-wpview-text="' + this.encodedText + '"]' ).each(function (i, elem) { 43 43 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>' ); 45 47 $( self ).trigger( 'ready', elem ); 46 48 }); 47 49 } 48 50 }, this ); 49 } 51 }, 52 unbind: function() {} 50 53 } ); 51 54 52 55 // take advantage of the Backbone extend method … … 93 96 }, 94 97 95 98 /** 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 /** 96 111 * toViews( content ) 97 112 * Scans a `content` string for each view's pattern, replacing any 98 113 * matches with wrapper elements, and creates a new instance for … … 339 354 * @mixin 340 355 */ 341 356 wp.mce.media = { 357 loaded: false, 342 358 /** 343 359 * @global wp.shortcode 344 360 * … … 410 426 */ 411 427 wp.mce.media.View = wp.mce.View.extend({ 412 428 initialize: function( options ) { 429 this.players = []; 413 430 this.shortcode = options.shortcode; 414 431 _.bindAll( this, 'setPlayer' ); 415 432 $(this).on( 'ready', this.setPlayer ); … … 460 477 media = wp.media.view.MediaDetails.prepareSrc( media.get(0) ); 461 478 462 479 setTimeout( function() { 463 self.player = new MediaElementPlayer( media, this.mejsSettings ); 464 }, 75 ); 480 wp.mce.media.loaded = true; 481 self.players.push( new MediaElementPlayer( media, self.mejsSettings ) ); 482 }, wp.mce.media.loaded ? 10 : 500 ); 465 483 }, 466 484 467 485 /** … … 475 493 wp.media[ this.shortcode.tag ].defaults 476 494 ); 477 495 return this.template({ model: attrs }); 496 }, 497 498 unbind: function() { 499 var self = this; 500 this.pauseAllPlayers(); 501 _.each( this.players, function (player) { 502 self.removePlayer( player ); 503 } ); 504 this.players = []; 478 505 } 479 506 }); 480 507 _.extend( wp.mce.media.View.prototype, wp.media.mixin ); -
src/wp-includes/js/media-audiovideo.js
128 128 * MediaElement tries to pull the audio/video tag out of 129 129 * its container and re-add it to the DOM. 130 130 */ 131 removePlayer: function( ) {132 var t = this.player,featureIndex, feature;131 removePlayer: function(t) { 132 var featureIndex, feature; 133 133 134 134 // invoke features cleanup 135 135 for ( featureIndex in t.options.features ) { … … 165 165 unsetPlayer : function() { 166 166 if ( this.player ) { 167 167 wp.media.mixin.pauseAllPlayers(); 168 wp.media.mixin.removePlayer .apply( this);168 wp.media.mixin.removePlayer( this.player ); 169 169 this.player = false; 170 170 } 171 171 } … … 914 914 915 915 $( init ); 916 916 917 }(jQuery, _, Backbone)); 918 No newline at end of file 917 }(jQuery, _, Backbone)); -
src/wp-includes/js/tinymce/plugins/wpview/plugin.js
80 80 'contenteditable': 'true' 81 81 }, getViewText( viewNode ) ); 82 82 83 viewNode.appendChild( clipboard ); 83 // Prepend inside the wrapper 84 viewNode.insertBefore( clipboard, viewNode.firstChild ); 84 85 85 86 // 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 ); 88 89 89 90 // Make sure that the editor is focused. 90 91 // It is possible that the editor is not focused when the mouse event fires … … 140 141 return; 141 142 } 142 143 144 function emptyViews( content ) { 145 return content.replace(/(<div[^>]+wpview-wrap[^>]+>)[\s\S]+?data-wpview-end[^>]*><\/ins><\/div>/g, '$1</div>' ); 146 } 147 143 148 editor.on( 'BeforeAddUndo', function( event ) { 144 if ( selected && ! toRemove) {149 if ( event.lastLevel && emptyViews( event.level.content ) === emptyViews( event.lastLevel.content ) ) { 145 150 event.preventDefault(); 146 151 } 147 152 }); … … 149 154 // When the editor's content changes, scan the new content for 150 155 // matching view patterns, and transform the matches into 151 156 // view wrappers. 152 editor.on( 'BeforeSetContent', function( e ) {153 if ( ! e .content ) {157 editor.on( 'BeforeSetContent', function( event ) { 158 if ( ! event.content ) { 154 159 return; 155 160 } 156 161 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 ); 158 167 }); 159 168 160 169 // When the editor's content has been updated and the DOM has been … … 162 171 editor.on( 'SetContent', function( event ) { 163 172 var body, padNode; 164 173 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(); 170 175 171 176 // Add padding <p> if the noneditable node is last 172 177 if ( event.load || ! event.set ) {