Ticket #31412: 31412.18.patch
File 31412.18.patch, 7.6 KB (added by , 10 years ago) |
---|
-
src/wp-includes/js/mce-view.js
64 64 * Returns the settings of a view type. 65 65 * 66 66 * @param {String} type The view type. 67 * 68 * @return {Function} The view constructor. 67 69 */ 68 70 get: function( type ) { 69 71 return views[ type ]; … … 142 144 * @param {String} type The view type. 143 145 * @param {String} text The textual representation of the view. 144 146 * @param {Object} options Options. 147 * 148 * @return {wp.mce.View} The view instance. 145 149 */ 146 150 createInstance: function( type, text, options ) { 147 151 var View = this.get( type ), … … 163 167 /** 164 168 * Get a view instance. 165 169 * 166 * @param {String} text The textual representation of the view. 170 * @param {(String|HTMLElement)} object The textual representation of the view or the view node. 171 * 172 * @return {wp.mce.View} The view instance. 173 */ 174 getInstance: function( object ) { 175 if ( typeof object === 'string' ) { 176 return instances[ encodeURIComponent( object ) ]; 177 } 178 179 return instances[ $( object ).data( 'wpview-text' ) ]; 180 }, 181 182 /** 183 * Given a view node, get the view's text. 184 * 185 * @param {HTMLElement} node The view node. 186 * 187 * @return {String} The textual representation of the view. 167 188 */ 168 get Instance: function( text) {169 return instances[ encodeURIComponent( text ) ];189 getText: function( node ) { 190 return decodeURIComponent( $( node ).data( 'wpview-text' ) || '' ); 170 191 }, 171 192 172 193 /** … … 188 209 * @param {HTMLElement} node The view node to update. 189 210 */ 190 211 update: function( text, editor, node ) { 191 var oldText = decodeURIComponent( $( node ).data( 'wpview-text' ) ), 192 instance = this.getInstance( oldText ); 212 var instance = this.getInstance( node ); 193 213 194 214 if ( instance ) { 195 215 instance.update( text, editor, node ); … … 203 223 * @param {HTMLElement} node The view node to edit. 204 224 */ 205 225 edit: function( editor, node ) { 206 var text = decodeURIComponent( $( node ).data( 'wpview-text' ) ), 207 instance = this.getInstance( text ); 226 var instance = this.getInstance( node ); 208 227 209 228 if ( instance && instance.edit ) { 210 instance.edit( text, function( text ) {229 instance.edit( instance.text, function( text ) { 211 230 instance.update( text, editor, node ); 212 231 } ); 213 232 } 233 }, 234 235 /** 236 * Remove a given view node from the DOM. 237 * 238 * @param {tinymce.Editor} editor The TinyMCE editor instance the view node is in. 239 * @param {HTMLElement} node The view node to remove. 240 */ 241 remove: function( editor, node ) { 242 var instance = this.getInstance( node ); 243 244 if ( instance ) { 245 instance.remove( editor, node ); 246 } 214 247 } 215 248 }; 216 249 … … 218 251 * A Backbone-like View constructor intended for use when rendering a TinyMCE View. 219 252 * The main difference is that the TinyMCE View is not tied to a particular DOM node. 220 253 * 221 * @param {Object} Options.254 * @param {Object} options Options. 222 255 */ 223 256 wp.mce.View = function( options ) { 224 257 _.extend( this, options ); … … 276 309 277 310 if ( this.getContent() ) { 278 311 this.setContent( this.getContent(), function( editor, node ) { 279 $( node ).data( 'rendered', true ); 280 this.bindNodes.apply( this, arguments ); 312 $( node ).data( 'rendered', true ).trigger( 'wp-mce-view-bind' ); 281 313 }, force ? null : false ); 282 314 } else { 283 315 this.setLoader(); … … 285 317 }, 286 318 287 319 /** 288 * Binds a given rendered view node.289 * Runs after a view node's content is added to the DOM.290 *291 * @param {tinymce.Editor} editor The TinyMCE editor instance the view node is in.292 * @param {HTMLElement} node The view node.293 * @param {HTMLElement} contentNode The view's content node.294 */295 bindNodes: function( /* editor, node, contentNode */ ) {},296 297 /**298 320 * Unbinds all view nodes tied to this view instance. 299 321 * Runs before their content is removed from the DOM. 300 322 */ 301 323 unbind: function() { 302 this.getNodes( function( ) {303 this.unbindNodes.apply( this, arguments);324 this.getNodes( function( editor, node ) { 325 $( node ).trigger( 'wp-mce-view-unbind' ); 304 326 }, true ); 305 327 }, 306 328 307 329 /** 308 * Unbinds a given view node.309 * Runs before the view node's content is removed from the DOM.310 *311 * @param {tinymce.Editor} editor The TinyMCE editor instance the view node is in.312 * @param {HTMLElement} node The view node.313 * @param {HTMLElement} contentNode The view's content node.314 */315 unbindNodes: function( /* editor, node, contentNode */ ) {},316 317 /**318 330 * Gets all the TinyMCE editor instances that support views. 319 331 * 320 332 * @param {Function} callback A callback. … … 455 467 var dom = editor.dom, 456 468 styles = '', 457 469 bodyClasses = editor.getBody().className || '', 458 iframe, iframeDoc, i, resize;470 iframe, iframeDoc, observer, i, resize; 459 471 460 472 content.innerHTML = ''; 461 473 head = head || ''; … … 547 559 }; 548 560 549 561 if ( MutationObserver ) { 550 new MutationObserver( _.debounce( function() {562 observer = new MutationObserver( _.debounce( function() { 551 563 resize(); 552 }, 100 ) ) 553 .observe( iframeDoc.body, { 564 }, 100 ) ); 565 566 observer.observe( iframeDoc.body, { 554 567 attributes: true, 555 568 childList: true, 556 569 subtree: true … … 561 574 } 562 575 } 563 576 577 function classChange() { 578 iframeDoc.body.className = editor.getBody().className; 579 } 580 564 581 if ( importStyles ) { 565 editor.on( 'wp-body-class-change', function() { 566 iframeDoc.body.className = editor.getBody().className; 567 } ); 582 editor.on( 'wp-body-class-change', classChange ); 568 583 } 584 585 $( node ).one( 'wp-mce-view-unbind', function() { 586 observer.disconnect(); 587 editor.off( 'wp-body-class-change', classChange ); 588 } ); 569 589 }, 50 ); 570 590 571 591 callback && callback.apply( this, arguments ); … … 631 651 $( node ).data( 'rendered', false ); 632 652 editor.dom.setAttrib( node, 'data-wpview-text', encodeURIComponent( text ) ); 633 653 wp.mce.views.createInstance( this.type, text, this.match( text ).options ).render(); 654 }, 655 656 /** 657 * Remove a given view node from the DOM. 658 * 659 * @param {tinymce.Editor} editor The TinyMCE editor instance the view node is in. 660 * @param {HTMLElement} node The view node to remove. 661 */ 662 remove: function( editor, node ) { 663 $( node ).trigger( 'wp-mce-view-unbind' ); 664 editor.dom.remove( node ); 634 665 } 635 666 } ); 636 667 } )( window, window.wp, window.jQuery ); … … 662 693 frame.on( 'close', function() { 663 694 frame.detach(); 664 695 } ); 696 697 frame.open(); 665 698 } 666 699 }; 667 700 -
src/wp-includes/js/tinymce/plugins/wpview/plugin.js
72 72 } 73 73 74 74 function removeView( view ) { 75 // TODO: trigger an event to run a clean up function.76 // Maybe `jQuery( view ).trigger( 'remove' );`?77 75 editor.undoManager.transact( function() { 78 76 handleEnter( view ); 79 editor.dom.remove(view );77 wp.mce.views.remove( editor, view ); 80 78 }); 81 79 } 82 80 … … 107 105 clipboard = dom.create( 'div', { 108 106 'class': 'wpview-clipboard', 109 107 'contenteditable': 'true' 110 }, decodeURIComponent( editor.dom.getAttrib( viewNode, 'data-wpview-text' )) );108 }, wp.mce.views.getText( viewNode ) ); 111 109 112 110 editor.dom.select( '.wpview-body', viewNode )[0].appendChild( clipboard ); 113 111