WordPress.org

Make WordPress Core

Ticket #31661: 31661.2.patch

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

     
    150150                        zeroise( now.getUTCSeconds() ) +
    151151                        '+00:00';
    152152        })(),
    153         qt;
     153        qt,
     154        keyboardSelectionIE = false;
    154155
    155156        qt = QTags = function(settings) {
    156157                if ( typeof(settings) === 'string' ) {
     
    220221                        tb.attachEvent('onclick', onclick);
    221222                }
    222223
     224                if ( canvas.addEventListener ) {
     225                        canvas.addEventListener( 'keydown', qt.OnTab, false );
     226                } else if ( canvas.attachEvent ) {
     227                        canvas.attachEvent( 'onkeydown', qt.OnTab );
     228                }
     229
    223230                t.getButton = function(id) {
    224231                        return t.theButtons[id];
    225232                };
     
    243250        };
    244251
    245252        qt._buttonsInit = function() {
    246                 var t = this, canvas, name, settings, theButtons, html, inst, ed, id, i, use,
     253                var t = this, canvas, name, settings, theButtons, html, inst, ed, id, i, use, closeAllButton,
    247254                        defaults = ',strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,';
    248255
    249256                for ( inst in t.instances ) {
     
    299306                        }
    300307
    301308                        ed.toolbar.innerHTML = html;
     309
     310                        // Disable the Close All button on init.
     311                        closeAllButton = document.getElementById( ed.name + '_' + theButtons.close.id );
     312                        if ( closeAllButton ) {
     313                                closeAllButton.setAttribute( 'disabled', 'disabled' );
     314                        }
     315
    302316                        ed.theButtons = theButtons;
    303317
    304318                        if ( typeof jQuery !== 'undefined' ) {
     
    439453        };
    440454        qt.TagButton.prototype = new qt.Button();
    441455        qt.TagButton.prototype.openTag = function(e, ed) {
    442                 var t = this;
     456                var t = this,
     457                        closeAllButton = document.getElementById( ed.name + '_' + ed.theButtons.close.id );
    443458
     459                // Enable the Close All button now that we have open tags.
     460                if ( closeAllButton ) {
     461                        closeAllButton.removeAttribute( 'disabled' );
     462                }
     463
    444464                if ( ! ed.openTags ) {
    445465                        ed.openTags = [];
    446466                }
     467
    447468                if ( t.tagEnd ) {
    448469                        ed.openTags.push(t.id);
    449470                        e.value = '/' + e.value;
     
    450471                }
    451472        };
    452473        qt.TagButton.prototype.closeTag = function(e, ed) {
    453                 var t = this, i = t.isOpen(ed);
     474                var t = this, i = t.isOpen(ed),
     475                        closeAllButton = document.getElementById( ed.name + '_' + ed.theButtons.close.id );
    454476
    455477                if ( i !== false ) {
    456478                        ed.openTags.splice(i, 1);
    457479                }
    458480
     481                // Disable the Close All button when there are no more open tags.
     482                if ( 0 === i && closeAllButton ) {
     483                        closeAllButton.setAttribute( 'disabled', 'disabled' );
     484                }
     485                // Handle focus when the Close All button gets disabled.
     486                ed.canvas.focus();
     487
    459488                e.value = t.display;
    460489        };
    461490        // whether a tag is open or not. Returns false if not open, or current open depth of the tag
     
    476505
    477506                if ( document.selection ) { // IE
    478507                        canvas.focus();
    479                         sel = document.selection.createRange();
     508                        // Check if we already have an IE keyboard selection first.
     509                        sel = keyboardSelectionIE || document.selection.createRange();
    480510                        if ( sel.text.length > 0 ) {
    481511                                if ( !t.tagEnd ) {
    482512                                        sel.text = sel.text + t.tagStart;
     
    494524                                        t.closeTag(element, ed);
    495525                                }
    496526                        }
     527                        // Reset IE keyboard selection
     528                        keyboardSelectionIE = false;
    497529                        canvas.focus();
    498                 } else if ( canvas.selectionStart || canvas.selectionStart === 0 ) { // FF, WebKit, Opera
    499                         startPos = canvas.selectionStart;
    500                         endPos = canvas.selectionEnd;
     530                } else if ( canvas.selectionStart || canvas.selectionStart === 0 ) { // FF, WebKit, Opera, IE11
     531                        // Check if there has been a keyboard selection, because IE11 is weird
     532                        if ( keyboardSelectionIE ) {
     533                                startPos = keyboardSelectionIE[0];
     534                                endPos = keyboardSelectionIE[1];
     535                                // Reset it right away, no need for it from here
     536                                keyboardSelectionIE = false;
     537                        } else {
     538                                startPos = canvas.selectionStart;
     539                                endPos = canvas.selectionEnd;
     540                        }
    501541                        cursorPos = endPos;
    502542                        scrollTop = canvas.scrollTop;
    503543                        l = v.substring(0, startPos); // left of the selection
     
    544584                }
    545585        };
    546586
     587        // IE keyboard selection: get and store the selection when reverse tabbing.
     588        qt.OnTab = function( event ) {
     589                var key;
     590
     591                if ( ( document.selection || document.getSelection() ) && 'keydown' === event.type ) {
     592                        key = event.keyCode || event.charCode;
     593                        if ( event.shiftKey && 9 === key ) {
     594                                // IE11 supports getSelection like other modern browsers, but doesn't seem to return anything for textarea selections
     595                                // So store start and end of selection instead
     596                                if ( window.getSelection ) {
     597                                        selection = [this.selectionStart, this.selectionEnd];
     598                                } else if ( document.getSelection ) {
     599                                        selection = document.getSelection() + '';
     600                                } else if ( document.selection ) {
     601                                        selection = document.selection.createRange().text || '';
     602                                }
     603                                keyboardSelectionIE = selection;
     604                        }
     605                }
     606        };
     607
    547608        // removed
    548609        qt.SpellButton = function() {};
    549610