WordPress.org

Make WordPress Core

Ticket #31661: 31661.5.patch

File 31661.5.patch, 3.8 KB (added by Cheffheid, 6 years ago)
  • wp-includes/js/quicktags.js

     
    150150                        zeroise( now.getUTCSeconds() ) +
    151151                        '+00:00';
    152152        })(),
    153         qt;
     153        qt,
     154        keyboardSelection;
    154155
    155156        qt = QTags = function(settings) {
    156157                if ( typeof(settings) === 'string' ) {
     
    169170                        return false;
    170171                }
    171172
     173                if ( canvas.addEventListener ) {
     174                        canvas.addEventListener( 'keydown', function(event) {
     175                                qt.OnTab(event, this);
     176                        }, false );
     177                } else if ( canvas.attachEvent ) {
     178                        canvas.attachEvent( 'onkeydown', function(event) {
     179                                qt.OnTab(event, this);
     180                        } );
     181                }
     182
    172183                t.name = name;
    173184                t.id = id;
    174185                t.canvas = canvas;
     
    502513        qt.TagButton.prototype.callback = function(element, canvas, ed) {
    503514                var t = this, startPos, endPos, cursorPos, scrollTop, v = canvas.value, l, r, i, sel, endTag = v ? t.tagEnd : '';
    504515
    505                 if ( document.selection ) { // IE
    506                         canvas.focus();
    507                         sel = document.selection.createRange();
    508                         if ( sel.text.length > 0 ) {
    509                                 if ( !t.tagEnd ) {
    510                                         sel.text = sel.text + t.tagStart;
    511                                 } else {
    512                                         sel.text = t.tagStart + sel.text + endTag;
    513                                 }
     516                if ( canvas.selectionStart || canvas.selectionStart === 0 ) { // FF, WebKit, Opera, IE9+
     517                        // Check if there has been a keyboard selection
     518                        // reverse tabbing doesn't always make canvas.selectionStart available
     519                        if ( keyboardSelection ) {
     520                                startPos = keyboardSelection[0] || canvas.selectionStart;
     521                                endPos = keyboardSelection[1] || canvas.selectionEnd;
     522                                // Reset it right away, no need for it from here 
     523                                keyboardSelection = false;
    514524                        } else {
    515                                 if ( !t.tagEnd ) {
    516                                         sel.text = t.tagStart;
    517                                 } else if ( t.isOpen(ed) === false ) {
    518                                         sel.text = t.tagStart;
    519                                         t.openTag(element, ed);
    520                                 } else {
    521                                         sel.text = endTag;
    522                                         t.closeTag(element, ed);
    523                                 }
     525                                startPos = canvas.selectionStart;
     526                                endPos = canvas.selectionEnd;
    524527                        }
    525                         canvas.focus();
    526                 } else if ( canvas.selectionStart || canvas.selectionStart === 0 ) { // FF, WebKit, Opera
    527                         startPos = canvas.selectionStart;
    528                         endPos = canvas.selectionEnd;
     528
    529529                        cursorPos = endPos;
    530530                        scrollTop = canvas.scrollTop;
    531531                        l = v.substring(0, startPos); // left of the selection
     
    558558                        canvas.selectionEnd = cursorPos;
    559559                        canvas.scrollTop = scrollTop;
    560560                        canvas.focus();
     561                } else if ( document.selection ) { // IE8
     562                        canvas.focus();
     563                        // Check if we already have an IE keyboard selection first.
     564                        sel = keyboardSelection || document.selection.createRange();
     565
     566                        if ( sel.text.length > 0 ) {
     567                                        if ( !t.tagEnd ) {
     568                                                        sel.text = sel.text + t.tagStart;
     569                                        } else {
     570                                                        sel.text = t.tagStart + sel.text + endTag;
     571                                        }
     572                        } else {
     573                                        if ( !t.tagEnd ) {
     574                                                        sel.text = t.tagStart;
     575                                        } else if ( t.isOpen(ed) === false ) {
     576                                                        sel.text = t.tagStart;
     577                                                        t.openTag(element, ed);
     578                                        } else {
     579                                                        sel.text = endTag;
     580                                                        t.closeTag(element, ed);
     581                                        }
     582                        }
     583                        // Reset IE keyboard selection
     584                        keyboardSelection = false; 
     585                        canvas.focus();
    561586                } else { // other browsers?
    562587                        if ( !endTag ) {
    563588                                canvas.value += t.tagStart;
     
    572597                }
    573598        };
    574599
     600        // IE keyboard selection: get and store the selection when reverse tabbing.
     601        qt.OnTab = function( event, canvas ) {
     602                var key;
     603
     604                if ( 'keydown' === event.type ) {
     605                        key = event.keyCode || event.charCode;
     606                        if ( event.shiftKey && 9 === key ) {
     607                                if ( canvas.selectionStart || canvas.selectionStart === 0 ) {
     608                                        keyboardSelection = [canvas.selectionStart, canvas.selectionEnd];
     609                                } else  if ( document.selection ) {
     610                                        keyboardSelection = document.selection.createRange();
     611                                }
     612                        }
     613                }
     614        };
     615
    575616        // removed
    576617        qt.SpellButton = function() {};
    577618