WordPress.org

Make WordPress Core

Ticket #26959: 26959-10.patch

File 26959-10.patch, 5.1 KB (added by gcorne, 8 years ago)
  • src/wp-includes/js/tinymce/plugins/wpview/plugin.js

    diff --git src/wp-includes/js/tinymce/plugins/wpview/plugin.js src/wp-includes/js/tinymce/plugins/wpview/plugin.js
    index 9327859..6892249 100644
    tinymce.PluginManager.add( 'wpview', function( editor ) { 
    109109
    110110                        dom.unbind( selected, 'beforedeactivate focusin focusout click mouseup', _stop );
    111111                        dom.removeClass( selected, 'selected' );
    112 
    113                         editor.selection.select( selected.nextSibling );
    114                         editor.selection.collapse();
    115 
    116112                }
    117113
    118114                selected = null;
    tinymce.PluginManager.add( 'wpview', function( editor ) { 
    176172                        x = event.clientX;
    177173                        y = event.clientY;
    178174
     175                        // Detect events above or to the left if the first node is a wpview
    179176                        if ( isView( firstNode ) && ( ( x < firstNode.offsetLeft && y < ( firstNode.offsetHeight - scrollTop ) ) ||
    180177                                y < firstNode.offsetTop ) ) {
    181                                 // detect events above or to the left of the first view
    182178
    183179                                padNode = createPadNode();
    184180                                body.insertBefore( padNode, firstNode );
     181
     182                        // Detect events to the right and below the last view
    185183                        } else if ( isView( lastNode ) && ( x > ( lastNode.offsetLeft + lastNode.offsetWidth ) ||
    186184                                ( ( scrollTop + y ) - ( lastNode.offsetTop + lastNode.offsetHeight ) ) > 0 ) ) {
    187                                 // detect events to the right and below the last view
    188185
    189186                                padNode = createPadNode();
    190187                                body.appendChild( padNode );
    tinymce.PluginManager.add( 'wpview', function( editor ) { 
    305302        editor.on( 'keydown', function( event ) {
    306303                var keyCode = event.keyCode,
    307304                        body = editor.getBody(),
    308                         view, padNode;
     305                        view, padNode, walker, node;
    309306
    310307                // If a view isn't selected, let the event go on its merry way.
    311308                if ( ! selected ) {
    tinymce.PluginManager.add( 'wpview', function( editor ) { 
    342339                                editor.selection.setCursorLocation( body.firstChild, 0 );
    343340                        // Handle default case
    344341                        } else {
    345                                 editor.selection.select( view.previousSibling, true );
     342                                walker = new TreeWalker( view, body );
     343                                node = walker.prev( true );
     344                                editor.selection.select( node, true );
    346345                                editor.selection.collapse();
    347346                        }
    348347                } else if ( keyCode === VK.RIGHT || keyCode === VK.DOWN ) {
    tinymce.PluginManager.add( 'wpview', function( editor ) { 
    357356                                editor.selection.setCursorLocation( body.lastChild, 0 );
    358357                        // Handle default case where the next node is a non-wpview
    359358                        } else {
    360                                 editor.selection.setCursorLocation( view.nextSibling.firstChild, 0 );
     359                                walker = new TreeWalker( view, body );
     360                                node = walker.next( true );
     361                                editor.selection.select( node, true );
     362                                editor.selection.collapse( true );
    361363                        }
    362364                } else if ( keyCode === VK.DELETE || keyCode === VK.BACKSPACE ) {
    363365                        // If delete or backspace is pressed, delete the view.
    tinymce.PluginManager.add( 'wpview', function( editor ) { 
    372374                var keyCode = event.keyCode,
    373375                        range = editor.selection.getRng(),
    374376                        body = editor.getBody(),
     377                        walker,
     378                        view,
    375379                        node;
    376380
    377381                if ( ! range.collapsed || event.metaKey || event.ctrlKey ) {
    378382                        return;
    379383                }
    380384
    381                 if ( keyCode === VK.LEFT || keyCode === VK.UP ) {
    382                         node = range.startContainer.parentNode === body ? range.startContainer : range.startContainer.parentNode;
     385                if ( ( keyCode === VK.LEFT || keyCode === VK.UP ) && range.startOffset === 0 ) {
     386                        walker = new TreeWalker( range.startContainer, body );
     387                        node = walker.prev();
    383388                        // The caret is directly after a wpview
    384                         if ( range.startOffset === 0 && isView( node.previousSibling ) ) {
    385                                 select( node.previousSibling );
    386                                 event.preventDefault();
     389                        if ( isView( range.startContainer.previousSibling ) ) {
     390                                view = range.startContainer.previousSibling;
     391                        } else if ( isView( node ) ) {
     392                                view = node;
    387393                        }
    388                 } else if ( keyCode === VK.RIGHT || keyCode === VK.DOWN ) {
    389                         node = range.startContainer.parentNode === body ? range.startContainer : range.startContainer.parentNode;
     394                } else if ( ( keyCode === VK.RIGHT || keyCode === VK.DOWN ) &&
     395                        ( ( range.startOffset === 0 && ! range.endContainer.length ) || ( range.startOffset === range.endContainer.length ) ) ) {
     396
     397                        walker = new TreeWalker( range.endContainer, body );
     398                        node = walker.next();
     399
    390400                        // The caret is directly before a wpview
    391                         if ( ( ( range.startOffset === 0 && ! range.endContainer.length ) || ( range.startOffset === range.endContainer.length ) ) &&
    392                                         isView( node.nextSibling ) ) {
    393                                 select( node.nextSibling );
    394                                 event.preventDefault();
     401                        if ( isView( range.endContainer.nextSibling ) ) {
     402                                view = range.endContainer.nextSibling;
     403                        } else if ( isView( node ) ) {
     404                                view = node;
    395405                        }
    396406                }
     407
     408                if ( view ) {
     409                        select( view );
     410                        event.preventDefault();
     411                }
    397412        });
    398413
    399414        editor.on( 'keyup', function( event ) {
    tinymce.PluginManager.add( 'wpview', function( editor ) { 
    423438                        // Allow an initial element in the document to be removed when it is before a view
    424439                        if ( body.firstChild === range.startContainer && range.collapsed === true &&
    425440                                        isView( range.startContainer.nextSibling ) && range.startOffset === 0 ) {
    426 
    427441                                editor.dom.remove( range.startContainer );
    428442                        }
    429443                }